说实话,这是一种流氓行为。但有些时候又是不得不需要的。比如微信的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. Redis系列七:redis持久化

    redis支持RDB和AOF两种持久化机制,持久化可以避免因进程退出而造成数据丢失 一.RDB持久化 RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发 手动触发 ...

  2. 【[AHOI2013]差异】

    这个题一看就是为后缀家族设计的 我们看到我们要求的这个柿子 \[\sum_{i=1}^n\sum_{j=i+1}^nT_i+T_j-2\times lcp(T_i,T_j)\] 显然的是前面的那些东西 ...

  3. php api接口安全设计 sign理论

    一. url请求的参数包括:timestamp,token, username,sign 1. timestamp: 时间戮 2. token: 登陆验证时,验证成功后,生成唯一的token(可以为u ...

  4. Spark项目之电商用户行为分析大数据平台之(十)IDEA项目搭建及工具类介绍

    一.创建Maven项目 创建项目,名称为LogAnalysis 二.常用工具类 2.1 配置管理组建 ConfigurationManager.java import java.io.InputStr ...

  5. Mac svn使用学习-1-简介

    在Windows环境中,可以使用TortoiseSVN来搭建svn环境.但是由于Mac自带了svn的服务器端和客户端功能,因此可以直接使用svn功能. svn即subversion,Subversio ...

  6. leetcode 280.Wiggle Sort 、324. Wiggle Sort II

    Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...

  7. CentOS7下安装NVIDIA独立显卡驱动出现X service error问题解决方法

    问题症状: 最近在CentOS7下安装NVIDIA独立显卡驱动的过程中出现X service error问题,如下图所示: 解决方法: 0.到NVIDIA 官网上下载驱动文件(.run 格式) : N ...

  8. day79

    昨日回顾 昨日回顾: cookie: -是什么?存储在客户端浏览器上的键值对 -干啥用的?记录状态 -django中使用: -设置值: -HttpResponse对象,obj.set_cookie(k ...

  9. 服务器端数据合法性验证:签名sign和口令token原理

    有时候,你也许会想: 我写的接口,那别人要是知道url,并且知道其需要的数据结构和逻辑,那不是都可以访问了? 甚至是,客户点传递过来的数据,是不是被恶意修改了? 这时,我们可能需要“验证”一下.比如: ...

  10. Android开发环境的发展以及重装系统之后在myeclipse重配Android开发环境。

    android的开发环境早期要自己去去官网下SDK,ADT,AVD等.不仅在一开始要面临国内防火墙的阻拦,四处奔波之后都下载好了,还得自己Linked,可谓困难重重.随着android开发的火热,上面 ...