android 驻留广播,Android实现Service永久驻留

说实话,这是一种流氓行为。但有些时候又是不得不需要的。比如微信的NotifyReceiver。现在抛开这些伦理的东西不讲,我们只是来看看技术上怎么实现。在后台运行的service有几个途径可以将其停止运行,第一种就是软件退出;第二种就是通过系统强制停止运行;第三种就是被某些安全软件杀死。这里我们重点关注后两种永久驻留的实现。思路有一下几个:1.通过系统的某些动作来重启Service;2.在Service的onDestory()通过一系列操作重启Service。

先看第一种,最常见系统动作就是系统解锁动作。当系统解锁时,会发送一个广播(ACTION_USER_PRESENT)。广播接收器收到这个广播后会启动Service。具体的实现如下面代码所示:

1 public class BootBroadCastReceiver extends BroadcastReceiver {

2

3 public BootBroadCastReceiver() {

4 }

5

6 @Override

7 public void onReceive(Context context, Intent intent) {

8 if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){

9 Log.d("PRESENT","received");

10 Intent nIntent=new Intent();

11 nIntent.setClass(context, RunningService.class);

12 context.startService(nIntent);

13 }

14 }

15 }

这里收到系统解锁的广播信息(ACTION_USER_PRESENT)后,会通过Intent的方式启动Service。Service的代码如下:

1 public class RunningService extends Service {

2

3 public RunningService() {

4 }

5

6 @Override

7 public IBinder onBind(Intent arg0) {

8 return null;

9 }

10 @Override

11 public void onCreate() {

12 super.onCreate();

13 }

14 @Override

15 public void onStart(Intent intent, int startId) {

16 super.onStart(intent, startId);

17 Log.d("start","start");

18 }

19 @Override

20 public boolean onUnbind(Intent intent) {

21 return super.onUnbind(intent);

22 }

23 @Override

24 public void onDestroy() {

25 super.onDestroy();

26 Intent intent=new Intent();

27 intent.setAction("restartService");

28 RunningService.this.sendBroadcast(intent);

29 }

30

31 }

第二种方式就是在Service的OnDestory()方法中,发送一个广播信息,表示该Service将要被关闭,通过广播接收器接收到后重启Service,部分代码在上面的onDestory()中已经给出。下面给出广播接收器的代码:

1 public class ServiceDestoryBroadCastReceiver extends BroadcastReceiver {

2

3 public ServiceDestoryBroadCastReceiver() {

4 //TODO Auto-generated constructor stub

5 }

6

7 @Override

8 public void onReceive(Context context, Intent intent) {

9 if(intent.getAction().equals("restartService")){

10 Intent nIntent=new Intent();

11 nIntent.setClass(context, RunningService.class);

12 context.startService(nIntent);

13 }

14 }

15

16 }

该广播接收器收到“restartService”的广播后,会重亲启动Service,这样便保证了Service的驻留。

这两种方法我都已经自己做过验证。尤其是第二种,当我们在系统中点击强制停止该Service后,Service能够自动重启。被安全软件杀死后是否能够重启没有做过实验。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值