博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 通过AlarmManager实现守护进程
阅读量:5096 次
发布时间:2019-06-13

本文共 2766 字,大约阅读时间需要 9 分钟。

场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity

前提:得到系统签名 platform.pk8、platform.x509.pem及signapk.jar 三个文件缺一不可(系统源码里有)

步骤一、设置app开机启动(注意新安装的apk必须启动一次才能够接收到开机广播,否则是一直不会启动的)

 

步骤二、设置闹钟广播(该广播在没有系统签名的情况下很容易被杀死,我的是在apk进行系统签名并且标注system权限下进行OK)

 

 

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);    }

步骤三,注册接收闹钟发的广播

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
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个服务在运行的。

转载于:https://www.cnblogs.com/feijian/p/5201443.html

你可能感兴趣的文章
CentOS6.9安装Filebeat监控Nginx的访问日志发送到Kafka
查看>>
java把html标签字符转换成普通字符(反转换成html标签)
查看>>
CentOS 编译源码安装MySQL-5.6.16
查看>>
Mac之NSImageView的简单实用
查看>>
pulltorefresh
查看>>
在mac下真机开发android的问题
查看>>
【CodeChef-SPCLN】Cleaning the Space
查看>>
内核对TCP REUSEPORT的优化
查看>>
无向图求桥 UVA 796
查看>>
Nginx+Keepalived 实现双击热备及负载均衡
查看>>
五分钟搭建WordPress博客(二)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
确认是否是因为做了物理I/O而导致的性能不佳
查看>>
Something-Summary
查看>>
Spring学习笔记
查看>>
6个有用的MySQL语句
查看>>
JMeter-生成性能测试结果报告
查看>>
linux c/c++ IP字符串转换成可比较大小的数字
查看>>
我对前端MVC的理解
查看>>