根据网上的只是,Service包活的方法有很多,什么双进程守护,双服务守护,ondestory中重启进程。但是呢,个人感觉还是前台进程靠谱。
用法
前台进程跟普通的方法很相似,只是在onstartcomment方法里调用创建通知的方法:
public int onStartCommand(Intent intent, int flags, int startId) {
Notification.Builder builder = new Notification.Builder(this.getApplicationContext());
Intent nfIntent = new Intent(this, MainActivity.class);
builder.setDeleteIntent(PendingIntent.getBroadcast(getApplicationContext(), DELETE_CODE, new Intent("com.zhongwei.service"), 0));
builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, 0)).setContentTitle("云").setContentText("环的小管家").setSmallIcon(R.drawable.appicon).setWhen(System.currentTimeMillis());
Notification notification=builder.build();
notification.defaults=Notification.DEFAULT_SOUND;
startForeground(110,notification);
return super.onStartCommand(intent, flags, startId);
}
通知栏的通知被销毁
我测试的时候用的是华为c8818,跟普通service相比,当同时长击小方块打开任务管理器,把应用销毁。这时候普通service停止,而前台servie继续进行。但是如果先把前台服务的通知销毁,然后在任务管理器里销毁应用,前台服务也随之销毁。也就是说,当通知没有的时候,前台服务跟普通服务变成一样的。
这时候我决定自定义一个广播,监听通知栏的销毁。如果前台服务通知被销毁,则重新开启一个前台服务
看一下生命周期
第一次启动前台服务: oncreate — onstartcomment
启动任务管理器,关闭程序 生命周期没有变化
程序不销毁,关闭通知 onstartcomment()
把程序销毁,关闭通知 oncreate—- onstartcomment()
不过奇怪的是,我虽然监听了通知栏的销毁,当销毁 的时候重新打开一个前台服务,这个前台服务在销毁的时候没有调用ondestory
。
锁屏前台服务被销毁
经过测试,当锁屏的时候前台服务也是会被销毁的。但是销毁的条件是这个软件已经退出,如果软件依然是可见的,则服务也是不能被销毁的。
我启用的方法是,当用户点击返回按钮,不把activity退出,退到后台。运用广播接收器监听用户的锁屏事件,当屏幕锁屏,启动另外一个activiy,只不过这个activity是一个像素,透明的。当解锁的时候,关闭该activity。
另外,这时候系统的广播是不能在配置文件中注册的,必须在代码中设置。
前台服务取消通知栏
再启动前台进程的时候需要传入一个id。
我们的做法是,首先启动我们自己所需要的前台服务。然后我们再次定义一个前台服务,这个服务什么事情都不做,然后我们随后启动这个服务,传入的id和我们所需的服务一样。这样本来是两个通知的,由于id一样,所以说只会有一个。 随后关闭这个服务,通知栏的的通知销毁。
不过有一个问题,在某些手机例如我这个华为手机,长摁右边的虚拟键,在任务管理器中把我们的进程杀死。会发现我们的前台服务依然运行。但是如果我们把前台服务的通知销毁,则这个操作会使这个前台服务被杀掉、
关于启动一个一像素activity的问题
我们知道,为了使a服务一直存在,我们启动了一个一像素activity,我们对锁屏解锁监听。锁屏启动,解锁关闭。但是,问题来了。当我们在打电话的时候,我们锁屏。当唤醒屏幕的时候,其实也解锁了。不过没有收到这个解锁的广播,只有一个唤醒的广播。这时候我们的一像素activity还在主界面上,这样就挡住了这个接打电话的界面。 我做的处理时,对唤醒屏幕的广播事件进行监听。如果当时是位于打电话的阶段,则把一像素activity关闭
百度鹰眼服务的保活
通常使用轨迹追踪的应用都需要长时间后台运行,如果遇到进程被系统杀死的情况,开发者该如何处理呢?
① 省电模式:若手机开启了省电模式、各手机厂商定制的优化模式(如小米手机的神隐模式)、第三方安全应用的省电模式(如360手机卫士),则进程可能会被杀死。 处理策略为,用户在手机端关闭省电模式,或将APP加入这些模式的白名单。
② 内存不足:当手机系统内存不足时,会回收进程,直至内存充足时系统会自动重启进程。针对这种情况,可在APP内新增一个独立的进程B,定时查询鹰眼serviceA是否是否出于开启状态。当监听到鹰眼进程A被杀死,则重新开启鹰眼服务。但如果进程B同时也被系统回收,则该方法失效。
③ doze 模式:Doze模式是Android6.0上新出的一种模式,是一种全新的、低能耗的状态,在后台只有部分任务允许运行,其他都被强制停止。当用户一段时间没有使用手机的时候,Doze模式通过延缓app后台的CPU和网络活动减少电量的消耗。若手机厂商生产的定制机型中使用到该模式,需要申请将app添加进白名单,可尽量帮助鹰眼服务在后台持续运行,代码如下:
// 在Android 6.0及以上系统,若定制手