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

  • 相关阅读:
    maven下载出错
    Android中TextView和EditView常用属性设置
    在python3.6环境下使用cxfreeze打包程序
    Python安装环境配置和多版本共存
    python manage.py migrate出错
    python使用pip安装模块出错 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None))
    类的继承
    显示一张大图两张小图思路!banner数据库设计
    微信模板
    微擎小程序第二次请求 promise
  • 原文地址:https://www.cnblogs.com/feijian/p/5201443.html
Copyright © 2020-2023  润新知