老婆保佑示绊,代碼無(wú)BUG
目錄
- 效果圖
- 實(shí)現(xiàn)原理
- 如何實(shí)現(xiàn)
- 步驟
- 代碼
- 源碼地址
一. 先上一個(gè)GIF 至少給個(gè)效果給大家看看嘛
sd.gif
二. 實(shí)現(xiàn)原理
用到的知識(shí)點(diǎn) AIDL旬蟋,如果有隊(duì)AIDL 不熟悉的小伙伴,請(qǐng)移步點(diǎn)擊跳轉(zhuǎn)手幢,這里面是以前寫(xiě)的service,其中的遠(yuǎn)程服務(wù)用到的就是AIDL松申,不知道的小伙伴可以點(diǎn)擊凿叠,看看,鏈接
三. 如何實(shí)現(xiàn)
步驟
- 寫(xiě)一個(gè)AIDL
- 寫(xiě)一個(gè)本地服務(wù)
- 寫(xiě)一個(gè)遠(yuǎn)程服務(wù)
- 本地服務(wù)昆淡,和遠(yuǎn)程服務(wù)相互綁定
哈哈锰瘸,感覺(jué)說(shuō)的很模糊啊
簡(jiǎn)單點(diǎn)說(shuō),當(dāng)本地服務(wù)被殺死的時(shí)候昂灵,我們可以通過(guò)監(jiān)聽(tīng)事件避凝,然后在監(jiān)聽(tīng)事件中,告訴遠(yuǎn)程服務(wù)眨补,我被殺死了管削,遠(yuǎn)程服務(wù)收到了這個(gè)消息,就把你重新啟動(dòng)撑螺,并且含思,再次綁定關(guān)系
代碼
AIDL
//第一步,寫(xiě)一個(gè)AIDL
interface IAIDL {
String getTestData();
}
本地服務(wù)
首先本地服務(wù),和遠(yuǎn)程服務(wù)的代碼含潘,一樣饲做,只是在清單文件中的配置不同,這里遏弱,直接放上本地服務(wù)代碼艇炎,源碼會(huì)在片尾雙手奉上。
package com.allens.saveservicedemo.service;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import com.allens.saveservicedemo.IAIDL;
/**
* 描述:本地服務(wù)
* <p>
* Created by allens on 2017/12/27.
*/
public class FirstService extends Service {
private MyBinder myBinder;
private MyCon myCon;
@Nullable
@Override
public IBinder onBind(Intent intent) {
//第4步腾窝,將自定義的Binder,在這里 return
return myBinder;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG", "本地服務(wù)啟動(dòng)");
//第3步缀踪,new 一個(gè)我們自己寫(xiě)的Binder
myBinder = new MyBinder();
//第6步,new 一個(gè)自定義的連接對(duì)象
if (myCon == null) {
myCon = new MyCon();
}
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//第7步虹脯,當(dāng)這個(gè)服務(wù)啟動(dòng)的時(shí)候驴娃,和遠(yuǎn)程服務(wù)綁定 bindService
Intent intent1 = new Intent(FirstService.this, SecondService.class);
FirstService.this.bindService(intent1, myCon, Context.BIND_IMPORTANT);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG", "本地服務(wù)注銷(xiāo)");
}
//第二步,繼承AIDL.Stub
public class MyBinder extends IAIDL.Stub {
@Override
public String getTestData() throws RemoteException {
return "Hello 我是第一個(gè)服務(wù)";
}
}
//第5步循集,實(shí)現(xiàn)ServiceConnection 接口唇敞,實(shí)現(xiàn)它兩個(gè)方法
public class MyCon implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("TAG", "連接遠(yuǎn)程服務(wù)成功");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG", "連接遠(yuǎn)程服務(wù)失敗");
//這里是重點(diǎn),當(dāng)遠(yuǎn)程服務(wù)被殺死的時(shí)候咒彤,我們會(huì)在這里收到消息 然后重新啟動(dòng)服務(wù)疆柔,并且重新建立連接
Intent intent = new Intent(FirstService.this, SecondService.class);
//重新啟動(dòng)服務(wù)
FirstService.this.startService(intent);
//重新建立連接
FirstService.this.bindService(intent, myCon, Context.BIND_IMPORTANT);
}
}
}
清單文件
<service android:name=".service.FirstService" />
<service
android:name=".service.SecondService"
android:process=":div" />
最后,奉上源碼
SaveServiceDemo镶柱,點(diǎn)擊即可跳轉(zhuǎn)
寫(xiě)在最后
這種笨醯担火,已經(jīng)out了歇拆,現(xiàn)在手機(jī)都是多核的鞋屈,該殺還是啥,這個(gè)思路值得我們學(xué)習(xí)故觅。