APP保活

APP保活

前言

app保活,在Android中是一种流氓行为,一方面无端浪费用户手机电量,另一方面给用户一种很困惑的感觉,影响用户体验还有可能导致整个Android系统流畅性变差,所以Google官方一种不推荐该功能,也一直在阻止这方面功能在Android系统上运行,作为一个Android开发人员,应该极力地址这种无耻的行为!!!

保活的方式:

一、白色保活:

  • 给用户明确的提示,我这个应用的进程优先级比较高,不容易被杀死,请你也不要手动杀死!
    |– 开启前台服务进程

二、灰色保活(目前保活的主流做法,比如qq、微信 – 当然他们不止这一种保活手段)

  • 也是利用前台服务进程的方式,来提高进程的优先级,但是不会在通知栏给用户明确的提示
    |– 利用系统的漏洞,开启前台服务进程,不会有通知!

    ① API < 18,启动前台service时直接传入new=”“>

    ② API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;
    —–查看开启的服务是否为前台进程 “dumpsys activity services 应用包名”

    public class GrayService extends Service {
    
       private final static int GRAY_SERVICE_ID = 1001;
    
       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
    
           if (Build.VERSION.SDK_INT < 18) {
               //API < 18
               startForeground(GRAY_SERVICE_ID, new Notification());
           } else {
               Intent innerIntent = new Intent(this, GrayInnerService.class);
               startService(innerIntent);
               startForeground(GRAY_SERVICE_ID, new Notification());
           }
    
           return super.onStartCommand(intent, flags, startId);
       }
    
       ...
       ...
    
       /**
        * 给 API >= 18 的平台上用的灰色保活手段
        */
       public static class GrayInnerService extends Service {
    
           @Override
           public int onStartCommand(Intent intent, int flags, int startId) {
    
               startForeground(GRAY_SERVICE_ID, new Notification());
               stopForeground(true);
               stopSelf();
               return super.onStartCommand(intent, flags, startId);
           }
    
           ...
       }
    }
    

    三、黑色保活(耍流氓)

  • 系统广播保活:比如开机(4.0以上系统已经屏蔽)、拍照(5.0以上系统已经屏蔽)、网络切换等 – Google一直在屏蔽的路上,我们一直在反屏蔽!

  • 多进程互相守护:
    |– 将Service在另一个进程中启动(配置process) 监听应用是否还存活,没有存活就启动 (监听的方式有轮询、socket心跳等)
    |– 利用c语言,fork一个linux进程,监听
    |– sdk唤醒,比如集成了腾讯的sdk,那sdk里面有一段程序,会去检测腾讯自家的应用是否还存活,没有存活就激活

    |-- 更可耻的 多家企业联合,互相激活,比如百度系的激活淘宝 淘宝系的激活百度等等
    

四、白名单(超级流氓)

  • 以上所有的方式,都无法做到绝对的保活,那怎么做到绝对保活呢?
    |– 告诉底层系统不要杀自己,即使被认为的杀死了,底层系统也会帮忙再次启动;告诉三方的卫士软件,不要主动去杀死自己,怎么做到呢?
    |– 白名单 白名单 白名单(只有有实力的大企业能够做到)

最后,再强调一遍,作为一个Android开发人员,应该保护Android开发环境不被一些无耻的行为累赘,所以不要去做应用保活这种可耻的事情!!!

### Android 10 应用程序跃策略和技术 为了确应用程序在 Android 10 上能够持续运行并避免被系统回收,可以采用多种技术和最佳实践。这些技术不仅有助于提高应用性能,还能优化资源管理。 #### 使用前台服务 前台服务是一种特殊的服务类型,在执行重要操作时会显示通知给用户。这种方式可以让操作系统知道该进程非常重要,不应轻易终止它[^4]。 ```java Intent intent = new Intent(this, MyService.class); startForegroundService(intent); ``` #### 启动 sticky 服务 通过设置 `START_STICKY` 或者 `START_REDELIVER_INTENT` 标志来启动服务。当系统因内存不足而杀死此服务后,会在条件允许的情况下重新创建这个服务,并传递之前未完成的任务数据。 ```java @Override public int onStartCommand(Intent intent, int flags, int startId) { // Handle command here... return START_STICKY; } ``` #### 利用 JobScheduler API 对于需要定期执行后台任务的应用来说,JobScheduler 是一种更高效的选择。它可以安排网络请求或其他耗电工作只在网络可用或充电状态下进行,从而减少电池消耗。 ```java ComponentName componentName = new ComponentName(context, MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(0, componentName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .build(); JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); scheduler.schedule(jobInfo); ``` #### 配置唤醒锁(WakeLock) 如果某些情况下确实需要长时间持有 CPU 资源,则可以通过 PowerManager 的 WakeLock 接口获取部分类型的唤醒锁定权限。不过需要注意的是过度使用可能会显著影响设备续航时间。 ```java PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire(); // Do work that requires CPU to stay on. wakeLock.release(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值