使用双进程实现Android APP保活

Android APP保活是一个很重要的问题,很多APP需要在后台持续运行,比如在后台持续定位、即时通讯、播放音乐等,但是Android系统为了省电,经常把在后台运行的进程杀死,造成APP不能保活,影响功能和使用.因此需要进行APP保活,APP保活有很多方法,如设置白名单,但是效果不是很好,即使设置了进程也可能被杀死,还有就是设置闹钟,但是会把闹钟搞乱,用户看一眼闹钟设置就能看出来,相对而言,使用双进程保活是一种比较好的方法,不容易被杀死,对用户也没有影响.

双进程保活首先要定义两个Service,并且让这两个Service在不同的进程中运行.这里定义了LocalService和RemoteService,其中LocalService在主进程中运行,RemoteService另外新建一个进程.

LocalService:

复制代码
public class Local_Service extends Service {
    private Handler handler;
    private Runnable runnable;

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化工作
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    // 执行任务操作
                } catch (ClassNotFoundException e) {
                    throw new RuntimeException(e);
                }
                handler.postDelayed(this, 3000);
            }
        };
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int start_id) {
        handler.postDelayed(runnable, 3000);

        bindService(new Intent(this, RemoteService.class),
                connection, Context.BIND_AUTO_CREATE);
        return super.onStartCommand(intent, flags, start_id);
    }

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 绑定成功
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 当RemoteService所处进程被干掉就重新启动
            startService(new Intent(LocalService.this, RemoteService.class));
            bindService(new Intent(LocalService.this, RemoteService.class),
                    connection, Context.BIND_IMPORTANT);
        }
    };

    private class LocalBinder extends Binder {

    }

}
复制代码

RemoteService:

复制代码
public class Remote_Service extends Service {
    private Handler handler;
    private Runnable runnable;
    private boolean is_map_service_running;
    private boolean is_pos_service_running;

    public Remote_Service() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化工作
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    // 
                } catch (ClassNotFoundException e) {
                    throw new RuntimeException(e);
                }
                // 执行任务操作
                handler.postDelayed(this, 3000);
            }
        };
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int start_id) {
        handler.postDelayed(runnable, 3000);

        bindService(new Intent(this, LocalService.class),
                connection, Context.BIND_AUTO_CREATE);
        return super.onStartCommand(intent, flags, start_id);
    }

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 绑定成功
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 当LocalService所处进程被干掉就重新启动
            startService(new Intent(RemoteService.this, LocalService.class));
            bindService(new Intent(RemoteService.this, LocalService.class),
                    connection, Context.BIND_IMPORTANT);
        }
    };

    private class RemoteBinder extends Binder {

    }
}
复制代码

两个Service相互绑定,如果其中一个Service所在的进程被kill了,另外一个就对回调onServiceDisconnected()方法,重新启动被kill的进程,这样就保证了这两个Service能够一直运行.

在AndroidManifest.xml中定义两个Service:

        <service android:name=".Service.LocalService" />

        <service
            android:name=".Service.RemoteService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote" />

其中LocalService在主进程中运行,RemoteService通过android:process=":remote"指定了在另外一个进程中运行.

posted @   MSTK  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
历史上的今天:
2024-01-30 Failed to initialize NVML: Driver/library version mismatch
点击右上角即可分享
微信分享提示