
老婆保佑,代碼無BUG
目錄
- 效果圖
- 實現(xiàn)原理
- 如何實現(xiàn)
- 步驟
- 代碼
- 源碼地址
一. 先上一個GIF 至少給個效果給大家看看嘛

sd.gif
二. 實現(xiàn)原理
用到的知識點 AIDL,如果有隊AIDL 不熟悉的小伙伴,請移步點擊跳轉(zhuǎn),這里面是以前寫的service,其中的遠(yuǎn)程服務(wù)用到的就是AIDL,不知道的小伙伴可以點擊,看看,鏈接
三. 如何實現(xiàn)
步驟
- 寫一個AIDL
- 寫一個本地服務(wù)
- 寫一個遠(yuǎn)程服務(wù)
- 本地服務(wù),和遠(yuǎn)程服務(wù)相互綁定
哈哈,感覺說的很模糊啊
簡單點說,當(dāng)本地服務(wù)被殺死的時候,我們可以通過監(jiān)聽事件,然后在監(jiān)聽事件中,告訴遠(yuǎn)程服務(wù),我被殺死了,遠(yuǎn)程服務(wù)收到了這個消息,就把你重新啟動,并且,再次綁定關(guān)系
代碼
AIDL
//第一步,寫一個AIDL
interface IAIDL {
String getTestData();
}
本地服務(wù)
首先本地服務(wù),和遠(yuǎn)程服務(wù)的代碼,一樣,只是在清單文件中的配置不同,這里,直接放上本地服務(wù)代碼,源碼會在片尾雙手奉上。
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ù)啟動");
//第3步,new 一個我們自己寫的Binder
myBinder = new MyBinder();
//第6步,new 一個自定義的連接對象
if (myCon == null) {
myCon = new MyCon();
}
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//第7步,當(dāng)這個服務(wù)啟動的時候,和遠(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ù)注銷");
}
//第二步,繼承AIDL.Stub
public class MyBinder extends IAIDL.Stub {
@Override
public String getTestData() throws RemoteException {
return "Hello 我是第一個服務(wù)";
}
}
//第5步,實現(xiàn)ServiceConnection 接口,實現(xiàn)它兩個方法
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ù)失敗");
//這里是重點,當(dāng)遠(yuǎn)程服務(wù)被殺死的時候,我們會在這里收到消息 然后重新啟動服務(wù),并且重新建立連接
Intent intent = new Intent(FirstService.this, SecondService.class);
//重新啟動服務(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" />
最后,奉上源碼
寫在最后
這種保火,已經(jīng)out了,現(xiàn)在手機都是多核的,該殺還是啥,這個思路值得我們學(xué)習(xí)。