如何开启两个进程
- 一个进程干掉 他的服务全部收掉 百度了很多 有人说在onDestory中重启服务 但是试过发现还是太天真
所以我们就用两个进程来解决这间事情 一个进程被干掉 另一个马上将他重启 这主要就涉及到 进程间通信ipc-(interprocess communication) aidl-(Android Interface Definition Language
那么怎么再搞一个进程呢? 其实给他起个名字就行了 如下带码块
<service android:name=".LocalService"/>
<service android:name=".RemoteService" android:process=".remoteservice"/>
- 而且我们知道一个进程分配的内存是有限的,很多大厂的app都是两个进程。
定义aidl
- 为了完成进程间的通信 我们需要定义定义aidl
KeepAliveService .aidl
package com.reige.keepaliveservice;
interface KeepAliveService {
String getServiceName();
}
定义两个Service
- 这里就很熟悉了 只是需要定义一个内部类MyBinder 继承 KeepAliveService.Stub
public class LocalService extends Service {
private MyBinder binder;
private MyConn conn;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
super.onCreate();
binder = new MyBinder();
if (conn == null) conn = new MyConn();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);
}
class MyBinder extends KeepAliveService.Stub {
@Override
public String getServiceName() throws RemoteException {
return "LocalService";
}
}
class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
/*连接发生异常 正常关闭不走该方法*/
@Override
public void onServiceDisconnected(ComponentName name) {
LocalService.this.startService(new Intent(LocalService.this, RemoteService.class));
LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class),
conn, Context.BIND_IMPORTANT);
}
}
}
public class RemoteService extends Service {
private MyBinder binder;
private MyConn conn;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
super.onCreate();
binder = new MyBinder();
if (conn == null) conn = new MyConn();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
}
class MyBinder extends KeepAliveService.Stub {
@Override
public String getServiceName() throws RemoteException {
return "RemoteService";
}
}
class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
/*连接发生异常 正常关闭不走该方法*/
@Override
public void onServiceDisconnected(ComponentName name) {
RemoteService.this.startService(new Intent(RemoteService.this, LocalService.class));
RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
}
}
}
最后启动他们
- 在MainAcivity onCreat方法中中启动他们
this.startService(new Intent(MainActivity.this,LocalService.class));
this.startService(new Intent(MainActivity.this,RemoteService.class));
效果图
然后我们打开手机应用详情就能看到跑起来的两个进程和两个服务了,试着去停止他们,你会发现他们已经不听我们的了。当然,为了保险,做到真正的不被杀死,我们还可以监听广播来自动启动我们的应用,比如解锁电量变化等等