• 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能够自动重启。被安全软件杀死后是否能够重启没有做过实验。

  • 相关阅读:
    ES7 cat API的小结
    zabbix5.0 使用elasticsearch7.6按日期索引存储历史数据
    Archlinux爬坑指南
    ArchLinux安装常用软件QQ、TIM、微信等常用软件(三)
    ArcnLinux安装KDE桌面环境(二)
    ArchLinux安装步骤(一)
    DDD领域驱动及落地方案
    Text Classification with Keras
    Mattermost Server安装及配置AD/LADP
    使用队列问题
  • 原文地址:https://www.cnblogs.com/suneony/p/3925946.html
Copyright © 2020-2023  润新知