android 通过AlarmManager实现守护进程
场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity
前提:得到系统签名 platform.pk8、platform.x509.pem及signapk.jar 三个文件缺一不可(系统源码里有)
步骤一、设置app开机启动(注意新安装的apk必须启动一次才能够接收到开机广播,否则是一直不会启动的)
<!-- 开机启动 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name="com.bihu.tcarspeakdevice.receiver.AutoStartReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME"/>
</intent-filter>
</receiver>
步骤二、设置闹钟广播(该广播在没有系统签名的情况下很容易被杀死,我的是在apk进行系统签名并且标注system权限下进行OK)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxxxx"
android:versionCode="21"
android:versionName="xxxxxa"
android:sharedUserId="android.uid.system"
private void registerTickAlarm()
{
Intent intent = new Intent();
intent.setAction("com.bihu.tcarspeakdevice.alarmclock");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 5*1000, pendingIntent);
}
步骤三,注册接收闹钟发的广播
<receiver
android:name="com.xxx.receiver.TickReceiver"
android:process="com.xxx.TickReceiverProcess">
<intent-filter>
<action android:name="com.xxx.xxx.alarmclock" />
</intent-filter>
</receiver>
public class TickReceiver extends BroadcastReceiver{ private String TAG = TickReceiver.class.getSimpleName();
@Override
public void onReceive(Context ctx, Intent intent) {
if(intent.getAction().equals("com.xxx.xxx.alarmclock"))
{
//判断activity是否启动并在前台展示
if(!isForeground(ctx,"com.xxx.xxx.MainActivity"))
{
Toast.makeText(ctx, "接收到alarmclock的广播,Activity没运行,立即启动", Toast.LENGTH_SHORT).show();
Intent intentActivity = new Intent(ctx,MainActivity.class);
ctx.startActivity(intentActivity);
}
else
{
Toast.makeText(ctx, "接收到alarmclock的广播,Activity正在运行", Toast.LENGTH_SHORT).show();
}
}
}
/**
* 判断某个界面是否在前台
*
* @param context
* @param className
* 某个界面名称
*/
private boolean isForeground(Context context, String className) {
if (context == null || className==null) {
return false;
} ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> list = am.getRunningTasks(1);
if (list != null && list.size() > 0) {
ComponentName cpn = list.get(0).topActivity;
if (className.equals(cpn.getClassName())) {
return true;
}
}
return false;
}
}
步骤四、生成unsigned的apk
步骤五、生成带系统签名的apk
将未签名的apk拷贝到签名文件的同一目录下面,通过cmd执行下面的命令
java -jar signapk.jar platform.x509.pem platform.pk8 examble_unsigned.apk examble_signed.apk
运行即可!
******************************************守护进程的其他可能实现方式***************************************************
1、通过双service,一个主apk是主程序A,一个apk中只有service和广播B,A中启动单独进程的B,然后A和B通过互相发送广播进行互相确认,各自的广播中确认自己的主程序是否存活,若不存活,则直接启动activity。
2、NDK方式:父进程中创建子进程,当父进程被kill之后,子进程会被领养(不确定),然后子进程会检测到父进程已死,则启动父进程
3、通过将apk设置为系统桌面
大家可以参考微信、QQ的后台存活方式,在查看已运行的程序时他们都是有2个进程2个服务在运行的。
android 通过AlarmManager实现守护进程的更多相关文章
- Android 通过JNI实现守护进程,使得Service服务不被杀死
来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/5054 ...
- Android通过JNI实现守护进程与卸载后跳转指定网页
JNI进程守护 c代码部分如下:JNIEXPORT void JNICALL Java_com_sharetimes_qude_jni_JNIDaemon_daemon(JNIEnv * env, j ...
- Android守护进程
这几天,一位做Android的朋友和我探讨了一个问题:因为业务需求的原因,在自己的App长时间不使用被kill掉之后,如何让它再重新运行起来. 虽然,我本身很排斥这种做法,有点类似“流氓软件”的行为, ...
- 创建Android守护进程(底层服务)【转】
本文转载自:https://blog.csdn.net/myfriend0/article/details/80016739 创建Android守护进程(底层服务) 前言 Android底层服务,即运 ...
- Android闹钟 AlarmManager的使用
Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...
- APP中一种在Java层实现的简单守护进程方式
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52779986 守护进程是一个黑色 ...
- dhcpcd守护进程分析【转】
本文转载自;http://blog.csdn.net/lishanmin11/article/details/37930073 最近在调android ethernet功能,android本身不带 e ...
- Android中AlarmManager使用示例(持续更新,已经更改)
现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...
- Linux Supervisor 守护进程基本配置
supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...
随机推荐
- ADO.NET中的Connection详解
连接字符串 1.写法一 "Data Source=服务器名; Initial Catalog=数据库; User ID =用户名; Password=密码; Charset=UTF8; &q ...
- jquery 入门之-------jquery 简介
什么是jquery? Jquery是一个Javascript库,通过封装原生的Javascript函数得到一套定义好的方法.它可以用个少的代码完成更多更强大更复杂的功能,从而得到开发者的青睐. So! ...
- centos6.2下安装redis和phpredis扩展,亲测好用
安装redis: 下载:http://www.redis.io/download redis-2.6.2.tar.gz ]# tar -zxf redis-2.6.2.tar.gz ]# cd red ...
- 新建一个DataTable如何手动给其添加多条数据!
早晨起来,想起昨天利用winform做类似于sqlserver数据库导入数据功能的时候,用到了新建一个DataTable手动给其添加多条数据,平时用不到,需要的时候想不起来了,这次不妨把他记下来.以下 ...
- PHP通过IP 获取 地理位置(实例)
发布:JB02 来源:脚本学堂 分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码 ...
- mysql中的 IN和FIND_IN_SET的查询问题
原来以为mysql可以进行这样的查询select id, list, name from table where 'daodao' IN (list); (一)注:1. table含有三个字 ...
- C++排列对称串
题目内容:字符串有些是对称的,有些是不对称的,请将那些对称的字符串按从小到大的顺序输出.字符串先以长度论大小,如果长度相同,再以ASCII码值为排序标准. 输入描述:输入数据中含有一些字符串(1< ...
- iOS中使用子线程的完整方法
http://www.cnblogs.com/ygm900/archive/2013/06/23/3151691.html 第一步:开启子线程 //开启子线程到网络上获取数据 myFirstThrea ...
- JSON (仅限本地)
<script type="text/javascript"> setInterval(function() { $("#content").loa ...
- linux回环网卡驱动设计
回环网卡驱动 1.回环网卡和普通网卡的区别是他是虚拟的不是实际的物理网卡,它相当于把普通网卡的发送端和接收端短接在一起. 2.在内核源代码里的回环网卡程序(drivers/net/loopback.c ...