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

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

 public class BootBroadCastReceiver extends BroadcastReceiver {

     public BootBroadCastReceiver() {
} @Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
Log.d("PRESENT","received");
Intent nIntent=new Intent();
nIntent.setClass(context, RunningService.class);
context.startService(nIntent);
}
}
}

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

 public class RunningService extends Service {

     public RunningService() {
} @Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d("start","start");
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
Intent intent=new Intent();
intent.setAction("restartService");
RunningService.this.sendBroadcast(intent);
} }

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

 public class ServiceDestoryBroadCastReceiver extends BroadcastReceiver {

     public ServiceDestoryBroadCastReceiver() {
// TODO Auto-generated constructor stub
} @Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("restartService")){
Intent nIntent=new Intent();
nIntent.setClass(context, RunningService.class);
context.startService(nIntent);
}
} }

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

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

Android实现Service永久驻留的更多相关文章

  1. Android服务(Service)研究

    Service是android四大组件之一,没有用户界面,一直在后台运行. 为什么使用Service启动新线程执行耗时任务,而不直接在Activity中启动一个子线程处理? 1.Activity会被用 ...

  2. Android中Service 使用详解(LocalService + RemoteService)

    Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...

  3. android 入门-Service实时向Activity通过BroadcastReceiver传递数据

    引文: http://www.cnblogs.com/linjiqin/p/3147764.html <RelativeLayout xmlns:android="http://sch ...

  4. android 入门-Service

    sdk 1.7 package com.example.hellowrold; import java.util.Random; import com.example.hellowrold.R.id; ...

  5. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  6. Android中Service的使用

    我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...

  7. 【Android 】Service 全面总结

    1.Service的种类 按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...

  8. Android Activity/Service/Broadcaster三大组件之间互相调用

    我们研究两个问题,1.Service如何通过Broadcaster更改activity的一个TextView.(研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity ...

  9. Android 保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

随机推荐

  1. BZOJ 1028 麻将 枚举

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1028 题目大意: 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西 ...

  2. 用python实现MRO算法

    引子: 如图反映了python3中,几个类的继承关系和查找顺序.对于类A,其查找顺序为:A,B,E,C,F,D,G,(Object),这并不是一个简单的深度优先或广度优先的规律.那么这个顺序到底是如何 ...

  3. 1.HBase In Action 第一章-HBase简介(后续翻译中)

    This chapter covers ■ The origins of Hadoop, HBase, and NoSQL ■ Common use cases for HBase ■ A basic ...

  4. BZOJ3676:[APIO2014]回文串(SAM,Manacher)

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  5. 不要以为字段以transient修饰的话就一定不会被序列化

    1: 先阅读这边文章:http://www.importnew.com/21517.html 2:被transient修饰真的会被序列化吗? 反例:java.util.ArrayList中底层存储数组 ...

  6. 剑指offer.从未到头打印链表

    输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值.返回的结果用数组存储. 样例 输入:[2, 3, 5] 返回:[5, 3, 2] 1.使用栈. class Solution { public ...

  7. PAT B1040 有几个PAT (25 分)

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...

  8. 在ado.net中实现oracle存储过程调用两种方式

      1.常规的存储过程调用 String or=ConfigurationManager.ConnectionStrings["conn"].ToString(); OracleC ...

  9. OWASP移动安全漏洞Top 10

    •脆弱的服务器端安全控制 在OWASP排第一的漏洞是“脆弱的服务器端安全控制”,顾名思义,就是没有以一个安全的方式从移动应用程序向服务器端发送数据,或在发送数据时暴露了一些敏感的API.例如,考虑对一 ...

  10. 20155321 《网络对抗》 Exp6 信息搜集与漏洞扫描

    20155321 <网络对抗> Exp6 信息搜集与漏洞扫描 实验内容 信息搜集 whois 在kali终端输入whois 网址,查看注册的公司.服务.注册省份.传真.电话等信息 dig或 ...