Android中的保活机制

本文探讨了Android应用在后台保活的各种手段,包括在Service的onStartCommand中返回START_STICKY、设置Service优先级、Service销毁时重启、利用AIDL双进程、1像素Activity以及开启前台服务等。然而,随着Android系统的更新,许多传统保活方法已无效,开启前台服务成为相对有效的策略。尽管保活越来越困难,但提高APP优先级以避免轻易被系统杀死仍有一定可行性。
摘要由CSDN通过智能技术生成

Android中的保活是一个永不过时的话题,因为每一个APP都希望能在后台不停的运行去搜集用户数据,在Android 系统处于较低版本的时候(目前最新版本为12,较低版本指的是8以下),很多APP借助于系统层面的漏洞研发出了各种保活的方法,但是随着Android 版本的不断更新,过往的保活方法渐渐失效,Android中的保活成为了一个越来越难办到的事情,但是我认为这是一个好事,如非这样你永远不知道你的手机后台到底有多少APP背着你干了多少事情。当然,系统的事情不是我们能掌控的了的。那么,我们先来看看以前为了保活都有哪些手段。

手段一:在Service的onStartCommand方法中返回START_STICKY(亲测无效)

在Service的onStartCommand方法中返回键有下面几种可供选择:

(1)START_STICKY:如果Service所在的进程,在执行了onStartCommand方法后,被清理了,那么这个Service会被保留在已开始的状态,但是不保留传入的Intent,随后系统会尝试重新创建此Service。

(2)START_NOT_STICKY:如果Service所在的进程,在执行了onStartCommand方法后,被清理了,则系统不会重新启动此Service。

(3)START_REDELIVER_INTENT:如果Service所在的进程,在执行了onStartCommand方法后,被清理了,则结果和START_STICKY一样,也会重新创建此Service并调用onStartCommand方法。不同之处在于,如果是返回的是START_REDELIVER_INTENT ,则重新创建Service时onStartCommand方法会传入之前的intent。

手段二:在清单文件里面设置优先级(亲测无效)在这里插入图片描述

手段三:在Service即将销毁的时候重新启动(亲测无效)在这里插入图片描述

手段四:借助AIDL使用双进程保活(亲测无效)

首先创建一个AIDL文件

package com.steven.activitydemo;

// Declare any non-default types here with import statements

interface ProcessConnection {
   

 String getServiceName();

}

创建本地服务

public class LocalService extends Service {
   
    private MyBinder mBinder;

    private ServiceConnection connection = new ServiceConnection() {
   
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
   
            ProcessConnection iMyAidlInterface = ProcessConnection.Stub.asInterface(service);
            try {
   
                Log.i("LocalService", "connected with " + iMyAidlInterface.getServiceName());
            } catch (RemoteException e) {
   
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
   
            Log.i(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 进程保活是指应用程序保持在后台运行,即使用户关闭了应用程序的可见界面,仍然能够接收到系统消息或执行定时任务。这通常是通过以下几个机制实现的: 1. **Service**:Service 是 Android 的一种组件,可以在后台长期运行并执行一些任务,如接收广播、位置更新等。服务可以通过startService()启动,并使用stopSelf()或bindService()来控制其生命周期。 2. **BroadcastReceiver**:应用程序可以通过创建 BroadcastReceiver 来监听特定的系统或自定义事件,当这些事件发生时,即使应用被关闭,广播也会将消息传递给服务或活动,从而间接实现进程保活。 3. **JobScheduler**:Android 6.0(API level 23)以后引入了 JobScheduler API,开发者可以安排定期的任务在后台执行,即使设备处于空闲状态也可以执行。 4. **AlarmManager**:虽然 AlarmManager 不直接支持保活,但结合Service或WakefulBroadcastReceiver可以设置周期性的闹钟,使得应用在指定时间被唤醒,间接实现进程保活。 5. **Foreground Services**:从 Android Oreo (API level 26)开始,Google引入了 Foreground Services,这些服务需要显示通知,即使在后台也能保持运行。 6. **后台任务栈**:通过管理ActivityStack,应用程序可以创建一个堆栈,当用户关闭应用时,任务栈的顶部活动会被保存,直到用户再次启动应用。 要避免过度保活导致的资源消耗和用户体验下降,还需要注意遵守Android的后台操作策略和权限管理规范。同时,根据用户行为和需求选择合适的保活策略是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值