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

  • 相关阅读:
    滚屏到相应位置才加载图片
    cs文件编译成dll文件
    SPAM搜索引擎垃圾技术
    新HTML元素:Canonical Link(权威链接),解决网络复制内容
    Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
    VS2005发布网站项目时整个站点生成为一个自定义名称的dll文件
    301转向代码合集
    区别不同浏览器,CSS hack写法
    教你识别交换购买友情链接里的八种骗局真相!
    C#中Cookies的存取
  • 原文地址:https://www.cnblogs.com/suneony/p/3925946.html
Copyright © 2020-2023  润新知