一、Service的启动方式
1.采用startService的方式开启服务
生命周期 : onCreate()
--->onStartCommand()
(onStart()
方法已过时) ---> onDestory()
特点 : 一旦服务开启跟调用者(开启者)就没有任何关系了,开启者退出了,开启者挂了,服务再后台长期运行,开启者不能调用服务里面的方法
如果希望能调用
2. 采用bindService的方式开启服务
生命周期 : onCreate()
--->onBind()
--->onunbind()
--->onDestory()
特点 : bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉,绑定者可以调用服务里面的方法
二、BroadcastReceiver注册方式
1.动态注册广播和静态广播的区别
第一种不是常驻型广播,也就是说广播跟随程序的生命周期
第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行
2.发送广播的方式
无序广播 、有序广播 、自定广播
三、进程保活
黑色保活 : 不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
白色保活 : 启动前台Service
灰色保活 : 利用系统的漏洞启动前台Service
黑色保活的原理 : 就是利用不同的app进程使用广播来进行相互唤醒
白色保活的原理 : 调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台
灰色保活的原理 : 白色保活的基础之上,不会让系统通知栏有一个Notification这样的通知
同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理
private final static int GRAY_SERVICE_ID = 1001;
public static class GrayInnerService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(GRAY_SERVICE_ID, new Notification()); stopForeground(true); stopSelf(); return super.onStartCommand(intent, flags, startId); }
}