這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、做網(wǎng)站、莆田網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、莆田網(wǎng)絡(luò)營銷、莆田企業(yè)策劃、莆田品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供莆田建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.rwnh.cn
雙進(jìn)程守護(hù)
雙進(jìn)程守護(hù)的思想就是,兩個進(jìn)程共同運(yùn)行,如果有其中一個進(jìn)程被殺,那么另一個進(jìn)程就會將被殺的進(jìn)程重新拉起,相互保護(hù),在一定的意義上,維持進(jìn)程的不斷運(yùn)行。
雙進(jìn)程守護(hù)的兩個進(jìn)程,一個進(jìn)程用于我們所需的后臺操作,且叫它本地進(jìn)程,另一個進(jìn)程只負(fù)責(zé)監(jiān)聽著本地進(jìn)程的狀態(tài),在本地進(jìn)程被殺的時候拉起,于此同時本地進(jìn)程也在監(jiān)聽著這個進(jìn)程,準(zhǔn)備在它被殺時拉起,我們將這個進(jìn)程稱為遠(yuǎn)端進(jìn)程。
由于在 Android 中,兩個進(jìn)程之間無法直接交互,所以我們這里還要用到 AIDL (Android interface definition Language ),進(jìn)行兩個進(jìn)程間的交互。
代碼實(shí)現(xiàn)
先來看一下demo代碼結(jié)構(gòu),結(jié)構(gòu)很簡單,我這里創(chuàng)建了一個 Activity 作為界面,以及兩個 Service ,一個是后臺操作的 本地Service,另一個是守護(hù)進(jìn)程的 遠(yuǎn)端Service,還有一個 AIDL文件用作進(jìn)程間交互用。
項(xiàng)目結(jié)構(gòu)
Activity 的定義很簡單,就幾個按鈕,控制 Service 的狀態(tài),我這邊定義了三個按鈕,一個是開啟后臺服務(wù),另外兩個分別是關(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; } } }
可以看一下界面。
主界面
AIDL文件可以根據(jù)業(yè)務(wù)需要添加接口。
/** * @author chaochaowu */ interface IMyAidlInterface { String getServiceName(); }
重點(diǎn)是在兩個 Service 上。
在定義Service時,需要在 AndroidManifest 中聲明一下 遠(yuǎn)端Service 的 process 屬性,保證 本地Service 和 遠(yuǎn)端Service 兩者跑在不同的進(jìn)程上,如果跑在同一個進(jìn)程上,該進(jìn)程被殺,那就什么都沒了,就沒有了雙進(jìn)程守護(hù)的說法了。
<service android:name=".guard.LocalService" android:enabled="true" android:exported="true" /> <service android:name=".guard.RemoteService" android:enabled="true" android:exported="true" android:process=":RemoteProcess"/>
先來看 LocalService 的代碼,重點(diǎn)關(guān)注 onStartCommand 方法 和 ServiceConnection 中重寫的方法。onStartCommand 方法是在 Service 啟動后被調(diào)用,在 LocalService 被啟動后,我們將 RemoteService 進(jìn)行了啟動,并將 LocalService 和 RemoteService 兩者綁定了起來(因?yàn)檫h(yuǎn)端Service 對于用戶來說是不可見的,相對于我們實(shí)際工作的進(jìn)程也是獨(dú)立的,它的作用僅僅是守護(hù)線程,所以說 RemoteService 僅與 LocalService 有關(guān)系,應(yīng)該只能由 LocalService 將它啟動)。
啟動并綁定之后,我們需要重寫 ServiceConnection 中的方法,監(jiān)聽兩者之間的綁定關(guān)系,關(guān)鍵的是對兩者綁定關(guān)系斷開時的監(jiān)聽。
當(dāng)其中一個進(jìn)程被殺掉時,兩者的綁定關(guān)系就會被斷開,觸發(fā)方法 onServiceDisconnected ,所以,我們要在斷開時,進(jìn)行進(jìn)程拉起的操作,重寫 onServiceDisconnected 方法,在方法中將另外一個 Service 重新啟動,并將兩者重新綁定。
/** * @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,"鏈接斷開,重新啟動 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 啟動",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(); } } }
在另外一個 RemoteService 中也一樣,在與 LocalService 斷開鏈接的時候,由于監(jiān)聽到綁定的斷開,說明 RemoteService 還存活著,LocalService 被殺進(jìn)程,所以要將 LocalService 進(jìn)行拉起,并重新綁定。方法寫在 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,"鏈接斷開,重新啟動 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 啟動",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是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。
上述就是小編為大家分享的怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文名稱:怎么在Android中實(shí)現(xiàn)雙進(jìn)程守護(hù)
分享鏈接:http://www.rwnh.cn/article16/gcggdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計、軟件開發(fā)、網(wǎng)站維護(hù)、靜態(tài)網(wǎng)站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)