项目中用到了推送功能,但是遇到了一个很头痛的问题:
程序在后台运行太久后可程序可能被强行kill或是被手机管家之类的程序给kill掉,就不能即时收到推送了。
用了N种办法,包括开启两个Service相互守护,将Service设置为前台进行,把Service的onStartCommand方法里return START_STICKY(代码如下):
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// startForeground(1001, new Notification());//设置为前台进行
return START_STICKY;
}
还有重写Service的onDestroy方法(这个我觉得是最没价值的,因为程序被Kill掉,反正我没监听到这个方法)。
最后我还用了Intent.ACTION_TIME_TICK(每分钟都会监听到一次)来进行广播监听等方法,结果都不理想。
百度,必应+Google也很多方法,都没有,今天看到网上有介绍MarsDaemon开源框架实现APP进程守护。
就赶紧试了下,发现效果确实比我之前试的那N种方法好得多,再赶紧把使用方法记录下来。
MarsDaemon开源地址:https://github.com/Marswin/MarsDaemon,上面也有详细的使用方法:
- 第一步:把MarsDaemon下载解压后,把LibMarsdaemon项目作为Library项目导入到自己项目中,导入方法:File–>New–>New Module–>Import Gradle Project然后选择LibMarsdaemon即可。当然还是要在项目中Open Module Settings中进行设置才行。
- 第二步:编写两个不同进程的Service和两个BroadCastReceiver并注册到AndroidManifest.xml中,进程名字自定义。(其中一个Service是需要常驻的进程service,需要创建一个和他同进程的BroadCastReceiver。再另外一个进程中创建一个Service和一个BroadCastReceiver。)
- 编写自定义Application代码:
//自定义Application要继承自DaemonApplication,实现其getDaemonConfigurations方法
public class GlobalApp extends DaemonApplication {
private static GlobalApp instance;
public static GlobalApp getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance=this;
//各种初始化
}
@Override
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
//在这个方法使用到我们编写的两个Service及BroadCastReceiver
@Override
protected DaemonConfigurations getDaemonConfigurations() {
//PushService是项目中需要常驻的Service
//AlarmReceiver与PushService在同一个进程
DaemonConfigurations.DaemonConfiguration configuration1 = new DaemonConfigurations.DaemonConfiguration("com.innopro.bamboo:process1", PushService.class.getCanonicalName(), AlarmReceiver.class.getCanonicalName());
DaemonConfigurations.DaemonConfiguration configuration2 = new
// MessageService和 NetworkReceiver是在统一进程的辅助类,不用实现功能。 DaemonConfigurations.DaemonConfiguration("com.innopro.bamboo:process2", MessageService.class.getCanonicalName(), NetworkReceiver.class.getCanonicalName());
//return new DaemonConfigurations(configuration1, configuration2);//listener can be null
// return new DaemonConfigurations(configuration1, configuration2);//这种方式也可以
return new DaemonConfigurations(configuration1, configuration2, new MyDaemonListener());
}
class MyDaemonListener implements DaemonConfigurations.DaemonListener {
@Override
public void onPersistentStart(Context context) {
}
@Override
public void onDaemonAssistantStart(Context context) {
}
@Override
public void onWatchDaemonDaed() {
}
}
}
- 第三步:在AndroidManifest.xml中注册Service及BroadCastReceiver,记得要添加process:
<service android:name="xx.PushService" android:process=":process1"/>
<receiver android:name="xx.AlarmReceiver" android:process=":process1"/>
<service android:name="xx.MessageService"android:process=":process2" />
<receiver android:name="xx.AlarmReceive android:process=":process2"/>
MarsDaemon接入完成,现在就可以开始测试了,不过我测试 了好几款手机效果都不错,不过测试一款魅蓝Note2手机效果还是不佳。