android coreservice作用,android service重启
首先,說一下思路,很簡單,啟動兩個service檢測對方,如果發現對方killed,立馬啟動就可以了.具體實現代碼如下
1.先準備兩個service,CoreService和DaemonService
android:name="com.david.service.CoreService"
android:enabled="true">
android:name="com.david.service.DaemonService"
android:enabled="true"
android:process=":daemon">
注意,DaemonService多了一項屬性.
android:process=":daemon"
這里其實通過觀察設置-應用管理-正在運行,你會發現QQ,微信等都會有兩個進程.那兩個QQ的進程,就是這么來的.
2.然后準備兩個Receiver用來接受service發出的檢測對方是否運行的廣播
android:name="com.david.receiver.CoreReceiver"
android:enabled="true">
android:name="com.david.receiver.DaemonReceiver"
android:enabled="true"
android:process=":daemon">
同樣,DaemonReceiver跟DaemonService一樣,被放到了:daemon進程中.
3.Service相互檢測對方
CoreService啟動線程發送廣播:
public?class?CoreService?extends?Service?{
private?static?final?int?DAEMON_CHECK_INTERVAL=1000?*?2;
private?Intent?coreIntent?=?new?Intent("com.david.receiver.CORE");
private?Thread?coreThread?=?null;
@Nullable
@Override
public?IBinder?onBind(Intent?intent)?{
return?null;
}
@Override
public?void?onCreate()?{
super.onCreate();
startThread();
}
private?void?startThread(){
coreThread?=?new?Thread(new?DaemonCheckThread());
coreThread.start();
}
private?class?DaemonCheckThread?implements?Runnable?{
public?DaemonCheckThread()?{
}
@Override
public?void?run()?{
while?(true)?{
try?{
sendBroadcast(coreIntent);
Thread.sleep(DAEMON_CHECK_INTERVAL);
}?catch?(InterruptedException?e)?{
//?ignore
}
}
}
}
}
CoreReceiver中檢測DaemonService是否運行,如果killed,則啟動DaemonService:
public?class?CoreReceiver?extends?BroadcastReceiver?{
private?static?final?String?DAEMON_SERVICE="com.david.service.DaemonService";
@Override
public?void?onReceive(Context?context,?Intent?intent)?{
if(!ServiceUtil.isServiceRunning(context,DAEMON_SERVICE)){
ServiceUtil.startService(context,DAEMON_SERVICE);
}
}
}
另外一邊也是一樣,DaemonService中啟動線程發送廣播,DaemonReceiver中接受廣播,檢測CoreService的運行狀態
DaemonService:
public?class?DaemonService?extends?Service?{
private?static?final?int?CORE_CHECK_INTERVAL=1000?*?2;
private?Intent?daemonIntent?=?new?Intent("com.david.receiver.DAEMON");
private?Thread?daemonThread?=?null;
@Nullable
@Override
public?IBinder?onBind(Intent?intent)?{
return?null;
}
@Override
public?void?onCreate()?{
super.onCreate();
startThread();
}
private?void?startThread(){
daemonThread?=?new?Thread(new?CoreCheckThread());
daemonThread.start();
}
private?class?CoreCheckThread?implements?Runnable?{
public?CoreCheckThread()?{
}
@Override
public?void?run()?{
while?(true)?{
try?{
sendBroadcast(daemonIntent);
Thread.sleep(CORE_CHECK_INTERVAL);
}?catch?(InterruptedException?e)?{
//?ignore
}
}
}
}
}
DaemonReceiver:
public?class?DaemonReceiver?extends?BroadcastReceiver?{
private?static?final?String?CORE_SERVICE="com.david.service.CoreService";
@Override
public?void?onReceive(Context?context,?Intent?intent)?{
if(!ServiceUtil.isServiceRunning(context,CORE_SERVICE)){
ServiceUtil.startService(context,CORE_SERVICE);
}
}
}
4.最后一步,檢測服務是否運行
public?class?ServiceUtil?{
private?static?final?Logger?logger?=?LoggerFactory.getLogger(ServiceUtil.class);
public?static?boolean?isServiceRunning(Context?context,?String?serviceName)?{
boolean?isServiceRunning?=?false;
ActivityManager?manager?=?(ActivityManager)?context.getSystemService(Context.ACTIVITY_SERVICE);
for?(ActivityManager.RunningServiceInfo?service?:?manager.getRunningServices(Integer.MAX_VALUE))?{
if?(serviceName.equals(service.service.getClassName()))?{
isServiceRunning?=?true;
break;
}
}
logger.debug(String.format("service?[%s]?running?status:[%s]",?serviceName,?isServiceRunning));
return?isServiceRunning;
}
public?static?void?startService(Context?context,?String?action)?{
logger.debug(String.format("start?service?[%s]",?action));
Intent?mIntent?=?new?Intent();
mIntent.setAction(action);
mIntent.setPackage(context.getPackageName());
context.startService(mIntent);
}
}
總結一下就是兩個進程中各有一個service,互相檢測對方運行狀態,如果沒在運行,則啟動.我這里android 4.4.4測試有效.
總結
以上是生活随笔為你收集整理的android coreservice作用,android service重启的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++多线程-原子锁
- 下一篇: R语言学习手记 (1)