最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android IPC機(jī)制綁定Service實(shí)現(xiàn)本地通信

 更新時(shí)間:2016年07月14日 16:39:05   投稿:lqh  
本文主要介紹Android IPC機(jī)制綁定Service 實(shí)現(xiàn)本地通信,通過圖解,代碼等方式給大家解釋Android IPC機(jī)制,需要參考的同學(xué)可以看一下

**寫作原因:跨進(jìn)程通信的實(shí)現(xiàn)和理解是Android進(jìn)階中重要的一環(huán)。下面博主分享IPC一些相關(guān)知識(shí)、操作及自己在學(xué)習(xí)IPC過程中的一些理解。
這一章是為下面的Messenger和AIDL的使用做準(zhǔn)備,主要講解Android Service的綁定和Activity與本地Service之間通信相關(guān)知識(shí)。**

簡(jiǎn)介

我們都知道啟動(dòng)Service有兩種方式:startService()和bindService()。相比第一種方式,bindService()能夠更加靈活地實(shí)現(xiàn)與啟動(dòng)端Activity的數(shù)據(jù)通信,第一種啟動(dòng)方式啟動(dòng)Activity與Service之間并沒有直接關(guān)聯(lián),難以直接實(shí)現(xiàn)通信(當(dāng)然了,使用BroadCast或者事件總線也是可以實(shí)現(xiàn)的)。而使用綁定的方式啟動(dòng)Service則可以實(shí)現(xiàn)Service之間的通信。 

 下面就講述一下綁定Service實(shí)現(xiàn)本地通信的流程。

 

實(shí)例

 結(jié)合圖片我們來模擬開啟一個(gè)后臺(tái)執(zhí)行更新功能為例來講解本地Service的綁定。

 先分析一下該需求的場(chǎng)景:首先我們需要點(diǎn)擊Start按鈕開啟后臺(tái)更新數(shù)據(jù),后臺(tái)將數(shù)據(jù)返回給Activity并在ProgressBar展示進(jìn)度;當(dāng)我們點(diǎn)擊Pause時(shí)后臺(tái)暫停更新;點(diǎn)擊Stop按鈕時(shí)關(guān)閉后臺(tái)。本例中也用到Service通過BroadCast向Activity傳遞數(shù)據(jù)。由于只是實(shí)例,對(duì)于線程操作一塊有一些bug,希望大家能夠幫忙指正。

Activity的布局如下:

Service 實(shí)現(xiàn):

先看看Service的實(shí)現(xiàn):

思路是這樣的:先繼承Binder類創(chuàng)建MyBinder類,把MyBinder看做Service與Activity通信的代理人,所以在MyBinder內(nèi)部中寫好方法間接調(diào)用Service中的方法以供Activity去調(diào)用(如本例中callPauseUpgrade())。關(guān)于IBinder對(duì)象的獲取除了直接重寫后面還有兩種方式,這里先不闡述了。在Service中我們開啟一個(gè)Thread,在這個(gè)Thread中模擬持續(xù)更新進(jìn)度條直到isStop為False或者progress大于等于100時(shí),然后將進(jìn)度廣播出去,讓Activity接收到廣播進(jìn)行進(jìn)度條更新。Service中供Activity調(diào)用的方法實(shí)現(xiàn)暫停和停止Thread的功能,具體過程參照代碼。

public class UpgradeService extends Service {
 private Thread thread;
 private Intent intent;
 private int progress;
 private Boolean isStop;
 public class MyBinder extends Binder{
  public void callPauseUpgrade(){
   pauseUpgrade();
  }

  public void callStopUpgrade() {
   stopUpgrade();
  }
 }

 private void stopUpgrade() {
  progress = 0;
  isStop = false;
  intent.putExtra("progress",progress);
  sendBroadcast(intent);
 }

 @Override
 public void onCreate() {
  super.onCreate();
  progress = 0;
  isStop = true;
  intent = new Intent();
  thread = new Thread(new Runnable() {
   @Override
   public void run() {
    while(isStop){
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     progress = progress +5;
     intent.putExtra("progress",progress);
     intent.setAction("UPGRADE_ACTION");
     sendBroadcast(intent);
     if(progress>=100) break;
    }

   }
  });
  thread.start();
 }

 private void pauseUpgrade() {
  //TODO:Pause the upgrade
  Toast.makeText(getApplicationContext(),"暫停",Toast.LENGTH_SHORT).show();
  isStop = false;
 }

 @Override
 public IBinder onBind(Intent intent) {
  return new MyBinder();
 }
}

Activity實(shí)現(xiàn)

 下面是在客戶端實(shí)現(xiàn)與Service的通信代碼。主要思路是:先注冊(cè)廣播實(shí)現(xiàn)Service數(shù)據(jù)的返回;單擊Start按鈕時(shí)實(shí)現(xiàn)與Service的綁定,創(chuàng)建ServiceConnection對(duì)象實(shí)現(xiàn)ServiceConnection接口,分別回調(diào)綁定成功和失敗兩種情況下的邏輯。當(dāng)成功時(shí)獲取MyBinder對(duì)象,并將設(shè)置的isBound值設(shè)為true;當(dāng)失敗時(shí)將isBound設(shè)置為false。單擊Pause調(diào)用MyBinder對(duì)象的callPauseUpgrade()方法間接調(diào)用Service中的pauseUpgrade()方法。單擊Stop調(diào)用callStopUpgrade()方法并且解除綁定。注意解除綁定事件只能執(zhí)行一次,否則程序會(huì)崩潰。

具體實(shí)現(xiàn)并不難,主要是認(rèn)真理解上面的流程圖即可。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 private Button mBtStart;
 private Button mBtStop;
 private Button mBtPause;
 private ProgressBar mPbProgress;
 private UpgradeService.MyBinder myBinder;
 private boolean isBound;
 private UpgradeReceiver upgradeReceiver;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction("UPGRADE_ACTION");
  upgradeReceiver = new UpgradeReceiver();
  registerReceiver(upgradeReceiver,intentFilter);
  initView();
  initEvent();

 }
 public class UpgradeReceiver extends BroadcastReceiver{

  @Override
  public void onReceive(Context context, Intent intent) {
   mPbProgress.setProgress(intent.getIntExtra("progress",0));
  }
 }
 @Override
 protected void onDestroy() {
  super.onDestroy();
  unregisterReceiver(upgradeReceiver);
 }

 private void initEvent() {
  mBtPause.setOnClickListener(this);
  mBtStart.setOnClickListener(this);
  mBtStop.setOnClickListener(this);
 }

 private void initView() {
  mBtPause = (Button) findViewById(R.id.bt_pause);
  mBtStart = (Button) findViewById(R.id.bt_start);
  mBtStop = (Button) findViewById(R.id.bt_stop);
  mPbProgress = (ProgressBar) findViewById(R.id.pb_progress);
 }

 @Override
 public void onClick(View v) {
  switch(v.getId()){
   case R.id.bt_pause:
    if(isBound&&myBinder!=null){
     myBinder.callPauseUpgrade();
    }
    break;
   case R.id.bt_start:
    bindService(new Intent(MainActivity.this,UpgradeService.class),conn,BIND_AUTO_CREATE);
    break;
   case R.id.bt_stop:
    if(isBound) {
     myBinder.callStopUpgrade();
     unbindService(conn);
     isBound = false;
    }
    break;
  }
 }

 private ServiceConnection conn = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   if(service != null){
    myBinder = (UpgradeService.MyBinder) service;
    isBound = true;
   }
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   isBound = false;
  }
 };
}

總結(jié):

這篇文章是為下面的Messenger和AIDL跨進(jìn)程通信做準(zhǔn)備的,實(shí)際上個(gè)人感覺真正開發(fā)時(shí)可以使用EventBus或者RxJava取代這種同進(jìn)程各個(gè)組件通信的問題,有興趣的讀者可以自行嘗試。

相關(guān)文章

  • Android使用xml自定義圖片實(shí)例詳解

    Android使用xml自定義圖片實(shí)例詳解

    這篇文章主要介紹了 Android使用xml自定義圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android圖片加載利器之Picasso擴(kuò)展功能

    Android圖片加載利器之Picasso擴(kuò)展功能

    這篇文章主要為大家詳細(xì)介紹了Android圖片加載利器之Picasso擴(kuò)展功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android中對(duì)xml文件解析的3種方式總結(jié)

    Android中對(duì)xml文件解析的3種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Android中對(duì)xml文件解析的3種方式,分別是 Dom 、 SAX 和 dom4j,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Android開發(fā)新手必須知道的10大嚴(yán)重錯(cuò)誤

    Android開發(fā)新手必須知道的10大嚴(yán)重錯(cuò)誤

    這篇文章主要介紹了Android開發(fā)新手必須知道的10大嚴(yán)重錯(cuò)誤,總結(jié)分析了Android開發(fā)中幫助文件、開發(fā)工具、社區(qū)等的重要性以及重要的開發(fā)原則,需要的朋友可以參考下
    2016-01-01
  • Android ImageButton 使用方法示例詳解

    Android ImageButton 使用方法示例詳解

    ImageButton 是 Android 中專門用于顯示圖片按鈕的控件,它繼承自 ImageView,但具有按鈕的點(diǎn)擊特性,下面我將全面介紹 ImageButton 的使用方法,感興趣的朋友一起看看吧
    2025-04-04
  • Android開發(fā)之SQLite的使用方法

    Android開發(fā)之SQLite的使用方法

    本篇文章介紹了,Android開發(fā)之SQLite的使用方法。需要的朋友參考下
    2013-04-04
  • Android 判斷所有字段是否已經(jīng)輸入的實(shí)例

    Android 判斷所有字段是否已經(jīng)輸入的實(shí)例

    今天小編就為大家分享一篇Android 判斷所有字段是否已經(jīng)輸入的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android使用okHttp(get方式)登錄

    Android使用okHttp(get方式)登錄

    這篇文章主要為大家詳細(xì)介紹了Android使用okHttp(get方式)進(jìn)行登錄,感興趣的小伙伴們可以參考一下
    2016-08-08
  • OpenGL ES渲染管線概述(一)

    OpenGL ES渲染管線概述(一)

    這篇文章主要為大家詳細(xì)介紹了OpenGL ES渲染管線的簡(jiǎn)單概述,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android仿IOS10圓盤時(shí)間選擇器

    Android仿IOS10圓盤時(shí)間選擇器

    這篇文章主要為大家詳細(xì)介紹了Android仿IOS10圓盤時(shí)間選擇器,自定義圓盤時(shí)間選擇器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

泰安市| 广汉市| 岐山县| 辽阳县| 榆林市| 同江市| 九台市| 张家界市| 平泉县| 吉木乃县| 平安县| 汉源县| 岢岚县| 贵溪市| 潼关县| 德兴市| 汪清县| 阳城县| 宁德市| 喀喇沁旗| 杂多县| 资源县| 翁牛特旗| 宁阳县| 金门县| 盘山县| 游戏| 龙岩市| 杂多县| 石台县| 福建省| 金华市| 南雄市| 汤阴县| 普兰店市| 扶绥县| 理塘县| 梁平县| 临潭县| 梁河县| 黄浦区|