目录
- 效果图
- 实现原理
- 如何实现
- 步骤
- 代码
- 源码地址
一. 先上一个GIF 至少给个效果给大家看看嘛
二. 实现原理
用到的知识点 AIDL,如果有队AIDL 不熟悉的小伙伴,请移步点击跳转,这里面是以前写的service,其中的远程服务用到的就是AIDL,不知道的小伙伴可以点击,看看,链接
三. 如何实现
步骤
- 写一个AIDL
- 写一个本地服务
- 写一个远程服务
- 本地服务,和远程服务相互绑定
哈哈,感觉说的很模糊啊
简单点说,当本地服务被杀死的时候,我们可以通过监听事件,然后在监听事件中,告诉远程服务,我被杀死了,远程服务收到了这个消息,就把你重新启动,并且,再次绑定关系
代码
AIDL
//第一步,写一个AIDL
interface IAIDL {
String getTestData();
}
本地服务
首先本地服务,和远程服务的代码,一样,只是在清单文件中的配置不同,这里,直接放上本地服务代码,源码会在片尾双手奉上。
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;
/**
* 描述:本地服务
* <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", "本地服务启动");
//第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步,当这个服务启动的时候,和远程服务绑定 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", "本地服务注销");
}
//第二步,继承AIDL.Stub
public class MyBinder extends IAIDL.Stub {
@Override
public String getTestData() throws RemoteException {
return "Hello 我是第一个服务";
}
}
//第5步,实现ServiceConnection 接口,实现它两个方法
public class MyCon implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("TAG", "连接远程服务成功");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG", "连接远程服务失败");
//这里是重点,当远程服务被杀死的时候,我们会在这里收到消息 然后重新启动服务,并且重新建立连接
Intent intent = new Intent(FirstService.this, SecondService.class);
//重新启动服务
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" />
最后,奉上源码
写在最后
这种保火,已经out了,现在手机都是多核的,该杀还是啥,这个思路值得我们学习。