Android进程保活 --- 守护进程(code)

2023-05-16

1、守护进程:一个在后台运行并且不受任何终端控制的进程。可以用来给其他应用拉起,保活。

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class AppWatcherService extends Service {
    static final String TAG = "AppWatcherService";
    private final static boolean DEBUG = "eng".equals(Build.TYPE) || "userdebug".equals(Build.TYPE);

    private static final int RESTART_BIND_INTERVAL = 1000;
    private static final int MAX_RETRY_COUNT = 10;

    private static final String APP_PACKAGE_NAME = "com.android.app";
    private static final String APP_INTERFACE_NAME = "com.android.app.IRegisterReceiverService";
    private static final String APP_SERVICE_NAME  = "com.android.app.RegisterReceiverService";

    private Context mContext;
    private Handler mHandler = new Handler();
    private int mBindRetryCount = 0;

    private Runnable mRebindFunc = new Runnable() {
        @Override
        public void run() {
            reBindService();
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (DEBUG) Log.d(TAG, "onStartCommand");
        if (isExistAppPackage(APP_PACKAGE_NAME)) {
            Intent intent1 = new Intent(APP_INTERFACE_NAME);
            intent1.setPackage(APP_PACKAGE_NAME);
            intent1.setComponent(new ComponentName(APP_PACKAGE_NAME,APP_SERVICE_NAME));
            mContext.bindService(intent1, mServiceConnection, BIND_AUTO_CREATE);
        }

        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    private IBinder mService;
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            try {
                if (DEBUG) Log.d(TAG, "onServiceConnected : " + className.getPackageName() + " " + className.getClassName());
                mService = service;
            } catch (Exception e) {
                Log.e(TAG, "onServiceConnected Exception : " + e);
            }
        }

        public void onServiceDisconnected(ComponentName className) {
            try {
                if (DEBUG) Log.d(TAG, "onServiceDisconnected : " + className.getPackageName() + " " + className.getClassName());
                mService = null;
                unbindService(mServiceConnection);
                mHandler.postDelayed(mRebindFunc, RESTART_BIND_INTERVAL);
            } catch (Exception e) {
                Log.e(TAG, "onServiceDisconnected : " + e);
            }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void reBindService() {
        if (DEBUG) Log.d(TAG, "reBindService");
            if (isExistAppPackage(APP_PACKAGE_NAME)) {
            Intent intent = new Intent(APP_INTERFACE_NAME);
            intent.setPackage(APP_PACKAGE_NAME);
            bindAppService(intent);
        }
    }

    private void bindAppService(Intent intent) {
        if (DEBUG) Log.d(TAG, "Bind Intent : " + intent);
        if (mContext.bindService(intent, mServiceConnection, BIND_AUTO_CREATE)) {
            //如果已经绑定了服务,重新连接
            if (DEBUG) Log.d(TAG, "BindService Success");
            mBindRetryCount = 0;
            mHandler.removeCallbacks(mRebindFunc);
        } else {
            //如果绑定失败,每间隔1秒进行10次重试
            mBindRetryCount++;
            if (DEBUG) Log.d(TAG, "Retry Count : " + mBindRetryCount);
            if (mBindRetryCount < MAX_RETRY_COUNT) {
                if (DEBUG) Log.d(TAG, "Bind Service Failed. Retry in 1 second.");
                mHandler.postDelayed(mRebindFunc, RESTART_BIND_INTERVAL);
            } else {
                mBindRetryCount = 0;
                if (DEBUG) Log.d(TAG, "Bind Service was Retried a Maximum.");
            }
        }
    }

    public boolean isExistAppPackage(String packageName) {
        //判断app包是否存在
        boolean ret = false;
        PackageManager pm = getApplicationContext().getPackageManager();
        try {
            pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
            ret = true;
        } catch (PackageManager.NameNotFoundException e) {
            if (DEBUG) Log.w(TAG, "App Package Not Found:"+packageName);
            ret = false;
        }
        return ret;
    }
}

可以接收开机广播以后,就启动这个service来绑定要被保活的应用

2、被守护的进程

①创建一个aidl,用于进程间通信

interface IRegisterReceiverService {
}

②AndroidManifest.xml中注册被绑定的service

        <service android:name="com.android.alarmclock.RegisterReceiverService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.alarmclock.IRegisterReceiverService" />
            </intent-filter>
        </service>

③继承JobIntentService

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.IBinder;

import android.support.v4.app.JobIntentService;

public class RegisterReceiverService extends JobIntentService {

    private final static String TAG = "RegisterReceiverService ";

    private final static int REGISTER_RECEIVER_ID = ;

    private final IBinder mBinder = new RegisterReceiverServiceBinder();

    private final IRegisterReceiverService.Stub mRegisterReceiverServiceBinder = new IRegisterReceiverService.Stub() {
    };

    public class RegisterReceiverServiceBinder extends Binder {
        public RegisterReceiverService getRegisterReceiverServiceBinder() {
            return RegisterReceiverService.this;
        }
    }

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, RegisterReceiverService.class, REGISTER_RECEIVER_ID, work);
    }

    @Override
    public void onHandleWork (Intent intent) {
        LogUtils.v("RegisterReceiverService Call onHandleWork");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        LogUtils.d(TAG + "onCreate()");
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        LogUtils.d(TAG + "onStart()");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = "";
        if(intent != null) {
            action = intent.getAction();
            action = action == null ? "" : action;
        }

        LogUtils.d(TAG + "onStartCommand() action=" + action );
        //可以在这里进行拉起进程后的操作

        return Service.START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        LogUtils.d(TAG + "onBind()");

        String action = "";
        if(intent != null) {
            action = intent.getAction();
            action = action == null ? "" : action;
        }
        //可以在这里进行拉起进程后的操作

        return mBinder;
    }

    @Override
    public void onDestroy() {
        LogUtils.d(TAG + "onDestroy()");
        unregisterReceiver(mAlarmInitReceiver);

        super.onDestroy();
    }
}

此方法可以守护多个进程,启动多个进程的service即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android进程保活 --- 守护进程(code) 的相关文章

随机推荐

  • 如何将线程/进程在一个/多个CPU核上运行

    如何将线程 进程在一个 多个CPU核上运行 设置线程 进程与CPU的亲缘性 xff0c 就是将线程 进程与CPU核进行绑定起来 实现方法 xff1a 设置线程与指定cpu核绑定 xff1a SetThreadAffinityMask Get
  • STM32F103ZET6驱动57闭环步进电机(连线+代码)

    一 设备 xff1a 1 STM32F103开发板 xff08 普中F103的板子 xff09 2 57闭环电机带驱动 3 24V 3A的直流电源 xff0c 用于给电机驱动供电 简单说明 xff1a 使用Keil5编程 xff0c 主要使
  • win10 VS2019环境编译OpenCV(带contrib库Aruco)

    目录 1 前期准备2 Cmake编译配置步骤1 选择source与build文件夹路径 步骤2 点击Configure按钮 xff0c 选择编译配置 步骤3 编译配置 步骤4 点击Finish开始获取配置信息 步骤5 点击Generate编
  • 2020-11-12

    一 什么是PID PID控制器是工业过程控制中广泛采用的一种控制算法 xff0c 其特点是结构简单灵活 技术成熟 适应性强 P I D分别为比例 xff08 Proportion xff09 积分 xff08 Integral xff09
  • springboot整合springsecurity,设置自定义页面后没有效果,运行还是一直跳转到默认的页面

    在做springboot整合springsecurity时 xff0c 设置也自定义的登陆页面一直不起作用 xff0c 运行时还是会跳转到原始的页面上去 在设置自定义登陆页面后 xff0c 运行项目还是会生成默认的密码 生成的默认密码 xf
  • vue插件瀑布流vue-masonry(带源码)

    目录 插件官网下载全局挂载main js中 属性实例效果最后 插件官网 官网1 官网2 下载 npm install vue masonry save 全局挂载 main js中 span class token selector impo
  • k8s 1.23.10 动态POD扩缩容(HPA )

    目录 为什么要自动扩缩容 xff1f 再K8S中扩容分为两种 xff1a 一 Node层面 xff1a 二 Pods层面 xff1a 自动扩缩容的方案有哪些 Kubernetes HPA xff08 Horizontal Pod Autos
  • STM32CubeMX——FREERTOS学习:消息队列Queue

    什么是队列 队列 xff0c 也叫消息队列 xff0c 就是把消息一条一条的排个队 比如创建了一个消息队列 xff0c 这个消息队列可以存10条消息 任务A可以往里存消息 xff0c 任务B也可以往里存 这个存的消息是要讲先来后到的 xff
  • 笔记本电脑控制树莓派,树莓派获取IP地址,连接笔记本电脑屏幕

    树莓派使用需要连接显示屏配备键盘和鼠标 xff0c 为了方便实用可以直接连接到自己的笔记本电脑上 xff0c 主要步骤如下 xff1a 第一步 xff1a 获取树莓派IP地址 首先进行树莓派的系统烧录 xff0c 烧录过程可以查看网上教程
  • c++类和对象---继承

    继承是面向对象三大特性之一 1 继承的基本语法 语法 xff1a class 子类名 xff1a 继承方式 父类名 子类 也叫 派生类 父类 也叫 基类 class basepage public void header cout lt l
  • Dockerfile详解

    Dockerfile 文章目录 基本结构指令详解FROMRUNLABEL MAINTAINERCOPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 创建镜像上
  • 接口和实现类

    接口 生活中有很多接口 xff0c 例如 xff1a USB接口 电源接口 Type c接口等等 xff1b 一个接口 xff0c 对应一个接口相应的设备 程序中的接口 xff1a 一种标准 xff0c 一种规范 xff0c 一系列抽象方法
  • 程序员必备的基本算法:递归详解

    前言 递归是一种非常重要的算法思想 xff0c 无论你是前端开发 xff0c 还是后端开发 xff0c 都需要掌握它 在日常工作中 xff0c 统计文件夹大小 xff0c 解析xml文件等等 xff0c 都需要用到递归算法 它太基础太重要了
  • lwip 基于select方式实现的tcp简易服务器

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 我是歌手Java实现

    span class token comment AbstractSinger java span span class token keyword package span span class token namespace cn sp
  • 【亲测有效】树莓派4B安装realsense(Intel深度摄像头)

    第一步尝试通过pip下载 xff0c 发现不能下载 pip span class token function install span pyrealsense2 pip中的pyrealsense2只能下载给X86结构的计算机 xff0c
  • 驼峰规则

    驼峰规则包含两种 xff1a 大驼峰和小驼峰 大驼峰 指我们在命名的时候往往采用第一个字母大写 xff0c 比如Animal 这种命名形式常用于类名或函数名 小驼峰 指我们在命名是往往采用中间字母大写 xff0c 比如setName 这种命
  • 八皇后问题(回溯法)

    目录 什么是八皇后 八皇后问题怎么解决 xff1f 什么是回溯法 回溯法的模板 八皇后问题的核心代码 判断皇后位置是否可行 总体实现代码 每日一句 xff1a 种一棵树的最好时间是十年前 xff0c 其次是现在 什么是八皇后 八皇后问题 x
  • 淘宝搜索页面爬取数据

    淘宝搜索页面爬取数据 1 首先导入库 span class token keyword import span requests span class token keyword import span json 2 主函数 span cl
  • Android进程保活 --- 守护进程(code)

    1 守护进程 xff1a 一个在后台运行并且不受任何终端控制的进程 可以用来给其他应用拉起 xff0c 保活 import android app Service import android content ComponentName i