真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù),文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、做網(wǎng)站、莆田網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、莆田網(wǎng)絡(luò)營(yíng)銷(xiāo)、莆田企業(yè)策劃、莆田品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供莆田建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

雙進(jìn)程守護(hù)

雙進(jìn)程守護(hù)的思想就是,兩個(gè)進(jìn)程共同運(yùn)行,如果有其中一個(gè)進(jìn)程被殺,那么另一個(gè)進(jìn)程就會(huì)將被殺的進(jìn)程重新拉起,相互保護(hù),在一定的意義上,維持進(jìn)程的不斷運(yùn)行。

雙進(jìn)程守護(hù)的兩個(gè)進(jìn)程,一個(gè)進(jìn)程用于我們所需的后臺(tái)操作,且叫它本地進(jìn)程,另一個(gè)進(jìn)程只負(fù)責(zé)監(jiān)聽(tīng)著本地進(jìn)程的狀態(tài),在本地進(jìn)程被殺的時(shí)候拉起,于此同時(shí)本地進(jìn)程也在監(jiān)聽(tīng)著這個(gè)進(jìn)程,準(zhǔn)備在它被殺時(shí)拉起,我們將這個(gè)進(jìn)程稱(chēng)為遠(yuǎn)端進(jìn)程。

由于在 Android 中,兩個(gè)進(jìn)程之間無(wú)法直接交互,所以我們這里還要用到 AIDL (Android interface definition Language ),進(jìn)行兩個(gè)進(jìn)程間的交互。

代碼實(shí)現(xiàn)

先來(lái)看一下demo代碼結(jié)構(gòu),結(jié)構(gòu)很簡(jiǎn)單,我這里創(chuàng)建了一個(gè) Activity 作為界面,以及兩個(gè) Service ,一個(gè)是后臺(tái)操作的 本地Service,另一個(gè)是守護(hù)進(jìn)程的 遠(yuǎn)端Service,還有一個(gè) AIDL文件用作進(jìn)程間交互用。

怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)

項(xiàng)目結(jié)構(gòu)

Activity 的定義很簡(jiǎn)單,就幾個(gè)按鈕,控制 Service 的狀態(tài),我這邊定義了三個(gè)按鈕,一個(gè)是開(kāi)啟后臺(tái)服務(wù),另外兩個(gè)分別是關(guān)閉本地Service和遠(yuǎn)端的Service。

/**
 * @author chaochaowu
 */
public class GuardActivity extends AppCompatActivity {

  @BindView(R.id.button)
  Button button;
  @BindView(R.id.button2)
  Button button2;
  @BindView(R.id.button3)
  Button button3;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.activity_guard);
    ButterKnife.bind(this);
  }


  @OnClick({R.id.button, R.id.button2, R.id.button3})
  public void onViewClicked(View view) {
    switch (view.getId()) {
      case R.id.button:
        startService(new Intent(this, LocalService.class));
        break;
      case R.id.button2:
        stopService(new Intent(this, LocalService.class));
        break;
      case R.id.button3:
        stopService(new Intent(this, RemoteService.class));
        break;
      default:
        break;
    }
  }
}

可以看一下界面。

怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)

主界面

AIDL文件可以根據(jù)業(yè)務(wù)需要添加接口。

/**
 * @author chaochaowu
 */
interface IMyAidlInterface {
  String getServiceName();
}

重點(diǎn)是在兩個(gè) Service 上。

在定義Service時(shí),需要在 AndroidManifest 中聲明一下 遠(yuǎn)端Service 的 process 屬性,保證 本地Service 和 遠(yuǎn)端Service 兩者跑在不同的進(jìn)程上,如果跑在同一個(gè)進(jìn)程上,該進(jìn)程被殺,那就什么都沒(méi)了,就沒(méi)有了雙進(jìn)程守護(hù)的說(shuō)法了。


先來(lái)看 LocalService 的代碼,重點(diǎn)關(guān)注 onStartCommand 方法 和 ServiceConnection 中重寫(xiě)的方法。onStartCommand 方法是在 Service 啟動(dòng)后被調(diào)用,在 LocalService 被啟動(dòng)后,我們將 RemoteService 進(jìn)行了啟動(dòng),并將 LocalService 和 RemoteService 兩者綁定了起來(lái)(因?yàn)檫h(yuǎn)端Service 對(duì)于用戶來(lái)說(shuō)是不可見(jiàn)的,相對(duì)于我們實(shí)際工作的進(jìn)程也是獨(dú)立的,它的作用僅僅是守護(hù)線程,所以說(shuō) RemoteService 僅與 LocalService 有關(guān)系,應(yīng)該只能由 LocalService 將它啟動(dòng))。

啟動(dòng)并綁定之后,我們需要重寫(xiě) ServiceConnection 中的方法,監(jiān)聽(tīng)兩者之間的綁定關(guān)系,關(guān)鍵的是對(duì)兩者綁定關(guān)系斷開(kāi)時(shí)的監(jiān)聽(tīng)。

當(dāng)其中一個(gè)進(jìn)程被殺掉時(shí),兩者的綁定關(guān)系就會(huì)被斷開(kāi),觸發(fā)方法 onServiceDisconnected ,所以,我們要在斷開(kāi)時(shí),進(jìn)行進(jìn)程拉起的操作,重寫(xiě) onServiceDisconnected 方法,在方法中將另外一個(gè) Service 重新啟動(dòng),并將兩者重新綁定。

/**
 * @author chaochaowu
 */
public class LocalService extends Service {

  private MyBinder mBinder;

  private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
      try {
        Log.i("LocalService", "connected with " + iMyAidlInterface.getServiceName());
      } catch (RemoteException e) {
        e.printStackTrace();
      }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      Toast.makeText(LocalService.this,"鏈接斷開(kāi),重新啟動(dòng) RemoteService",Toast.LENGTH_LONG).show();
      startService(new Intent(LocalService.this,RemoteService.class));
      bindService(new Intent(LocalService.this,RemoteService.class),connection, Context.BIND_IMPORTANT);
    }
  };

  public LocalService() {
  }

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this,"LocalService 啟動(dòng)",Toast.LENGTH_LONG).show();
    startService(new Intent(LocalService.this,RemoteService.class));
    bindService(new Intent(this,RemoteService.class),connection, Context.BIND_IMPORTANT);
    return START_STICKY;
  }

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

  private class MyBinder extends IMyAidlInterface.Stub{

    @Override
    public String getServiceName() throws RemoteException {
      return LocalService.class.getName();
    }

  }

}

在另外一個(gè) RemoteService 中也一樣,在與 LocalService 斷開(kāi)鏈接的時(shí)候,由于監(jiān)聽(tīng)到綁定的斷開(kāi),說(shuō)明 RemoteService 還存活著,LocalService 被殺進(jìn)程,所以要將 LocalService 進(jìn)行拉起,并重新綁定。方法寫(xiě)在 onServiceDisconnected 中。

/**
 * @author chaochaowu
 */
public class RemoteService extends Service {

  private MyBinder mBinder;

  private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
      try {
        Log.i("RemoteService", "connected with " + iMyAidlInterface.getServiceName());
      } catch (RemoteException e) {
        e.printStackTrace();
      }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      Toast.makeText(RemoteService.this,"鏈接斷開(kāi),重新啟動(dòng) LocalService",Toast.LENGTH_LONG).show();
      startService(new Intent(RemoteService.this,LocalService.class));
      bindService(new Intent(RemoteService.this,LocalService.class),connection, Context.BIND_IMPORTANT);
    }
  };

  public RemoteService() {
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this,"RemoteService 啟動(dòng)",Toast.LENGTH_LONG).show();
    bindService(new Intent(this,LocalService.class),connection,Context.BIND_IMPORTANT);
    return START_STICKY;
  }

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

  private class MyBinder extends IMyAidlInterface.Stub{

    @Override
    public String getServiceName() throws RemoteException {
      return RemoteService.class.getName();
    }

  }
}

Android是什么

Android是一種基于Linux內(nèi)核的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。

上述就是小編為大家分享的怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享名稱(chēng):怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)
鏈接URL:http://weahome.cn/article/gcggdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部