Android 应用进程保活APP常驻内存研究方案

前言

遥想当年,博主铭记在心的一件事,就是曾做过让我加快秃顶的功能——健步活动。我们知道,在Android4.4之后的版本中,Android在硬件中支持内置计步传感器,例如微信运动等软件都是调用了Android中的Sensor.TYPE_STEP_COUNTER传感器服务,从而获取到每日的步数。

由于当时用户手机版本普遍偏低,因此需要手写记步。当时好在机智如我,参考了微信摇一摇的原理,通过加速度传感器SENSOR_TYPE_LINEAR_ACCELERATION获取到在某个时间段的加速度值,最后通过一顿计算公式得出步数。但是不同机型的加速度值并不相同,而且超级耗电。而最难的问题,就是应用特别容易被杀死,因为内存和电量耗损大,当应用在后台运行会优先被系统回收,而且用户手动一键清理时杀死进程,导致无法记步。

 

一、常见的应用保活方法 

1、  监听广播方式

通过监听全局的静态广播,如开机广播、解锁屏广播、网络状态广播等,来启动应用的后台服务。目前,在高版本的Android系统中已经失效,因为Android系统规定应用必须在系统开机后运行一次才能监听这些系统广播,一般应用进程被杀死,广播也接收不到。

2、 提高Service的优先级

提高Service优先级方法很多,比如onStartCommand返回START_STICKY使系统内存足够的时候Service能够自动启动、弹出通知、配置service的优先级等,这些方式只能在一定程度上缓解service被立马回收,但只要用户一键清理或者系统回收照样无效。

3、 双service拉起

  经过测试,只要当前应用被杀,任何后台service都无法运行,也无法拉起。

4、双进程拉起

这种方式使用NDK在底层fork出一个子进程,来实现与父进程之间的互拉。在Android4.x还是非常有效的,但是高版本的Android系统的系统回收策略已经改成进程组的形式了,如果系统要回收一个应用,必然会杀死同属于一个进程组的所有进程导致双进程无法拉起。 

 5、Wake_Lock

系统为了节省电量,CPU在没有任务忙的时候就会自动进入休眠,有任务需要唤醒CPU高效执行的时候,就会给CPU加Wake_Lock锁。

Wake Lock是Android框架层提供的一套锁的机制,应用使用该机制可以达到控制系统无法进入休眠,cpu的保持运行。意思就是我的程序给CPU加了这个锁那系统就不会休眠了,这样做的目的是为了全力配合我们程序的运行。

当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能得不到正常执行,比如网络下载中断,后台播放音乐暂停,再比如微信等及时通讯的心跳包会在熄屏不久后停止网络访问等问题。WakeLock正是为了解决这类问题,应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。所以微信里面是有大量使用到了Wake_Lock锁。

但是用wake唤醒CPU持续来工作是会造成耗电的,记得在合适的业务情况下释放Wake_Lock。

二、多进程音频保活方案

综上所述,上面的方法只是提高了APP后台运行存留能力,在用户不主动清理或强杀的情况下,测试APP的保活效果还是非常不错的。但是,"咕咚"在点击一键清理时奇妙的活了下来,原因是在后台循环播放一段无声音乐。如下图:

代码如下:

public class PlayerMusicService extends Service {
    private final static String TAG = "PlayerMusicService";
    private MediaPlayer mMediaPlayer;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.silent);
        mMediaPlayer.setLooping(true);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                startPlayMusic();
            }
        }).start();
        return START_STICKY;//注释1
    }
    private void startPlayMusic(){
        if(mMediaPlayer != null){
            mMediaPlayer.start();
        }
    }
    private void stopPlayMusic(){
        if(mMediaPlayer != 
Android 9.0引入了一种新的应用保活机制,即app进程保活白名单。这个白名单允许应用后台保持运行状态,以便能够实时接收并处理重要的任务或事件。通过将应用添加到白名单中,可以确保应用不会过早地被系统终止,从而提高了应用的用户体验和功能性。 要将应用添加到Android 9.0的app进程保活白名单中,需要进行以下步骤: 1. 获取系统唤醒锁:应用需要获取系统唤醒锁以防止系统在特定时间内休眠。可以使用PowerManager类的newWakeLock方法来获取唤醒锁,并在不需要时及时释放锁。 2. 启用前台服务:可以将应用设置为前台服务状态,以使其在后台运行时以高优先级运行,并在通知中显示一个持续可见的通知。这样,即使应用后台运行,用户仍然可以清楚地知道应用正在运行。 3. 注册广播接收器:可以注册一些系统广播的接收器,以确保应用在系统事件发生时得到通知并可以及时做出响应。比如注册ACTION_SCREEN_ON广播接收器,以在设备解锁时触发相应的操作。 4. 利用JobScheduler:JobScheduler是Android系统提供的一个调度框架,可以用于安排长期运行的任务,以便应用可以在后台执行这些任务。可以使用JobScheduler来进行任务的调度和管理,以减少应用后台被系统终止的风险。 需要注意的是,虽然添加到app进程保活白名单可以保持应用后台的运行状态,但为了避免对系统资源的滥用,应避免长时间运行或频繁使用这些保活方法。合理使用这些保活机制,可以提升应用的性能和用户体验,但也要确保不会对设备的电池寿命和性能造成过多的损失。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾阳Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值