Android APP 提高进程服务优先级 服务杀不死

转自http://blog.csdn.net/qq_25804863/article/details/48697699#comments

首先明确,国内定制的系统(小米,华为,OPPO等)都实现了 无论自启和提升进程优先级的策略都能被杀死,而对于用户量大的APP(微信)和系统级别APP系统有做白名单;抛开那些定制系统,还是有很多原生系统没有这些策略,或者说那些优化策略不彻底,因此我们提升进程优先级才变得有意义

  • 1.针对系统签名APP进程永驻(系统级别的kill和forceStop也杀不死)

添加android:persistent="true"到AndroidManifest.xml中(只针对系统签名应用),添加方式如下:

<application
        android:name="com.ansen.CodeApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

即便是调用ActivityManager的killBackgroundProcesses或forceStopPackage方法也不会被杀掉,系统调用过程中对设置persistent的系统应用添加了过滤,ActivityManagerService源码(Android6.0)如下(we don't kill persistent processes):

private final boolean killPackageProcessesLocked(String packageName, int appId,
            int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart,
            boolean doit, boolean evenPersistent, String reason) {
        ArrayList<ProcessRecord> procs = new ArrayList<>();

        // Remove all processes this package may have touched: all with the
        // same UID (except for the system or root user), and all whose name
        // matches the package name.
        final int NP = mProcessNames.getMap().size();
        for (int ip=0; ip<NP; ip++) {
            SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip);
            final int NA = apps.size();
            for (int ia=0; ia<NA; ia++) {
                ProcessRecord app = apps.valueAt(ia);
                if (app.persistent && !evenPersistent) {
                    // we don't kill persistent processes
                    continue;
                }
                if (app.removed) {
                    if (doit) {
                        procs.add(app);
                    }
                    continue;
                }

                // Skip process if it doesn't meet our oom adj requirement.
                if (app.setAdj < minOomAdj) {
                    continue;
                }
                ... ...
            }
        }
        ... ...
        return N > 0;
    }
  • 2.给服务添加一个process,让服务在新的一个进程中运行
<service
            android:name=".socket.TCPServer"
            android:process=":TCPServer"></service>

这种方式针对AM的killBackgroundProcesses是杀不掉,该方法只能杀掉主进程

一般音乐播放器播放逻辑都是在一个新的进程中播放,如上方式添加,因此像360、安全管家等清理程序进行进程清理后,播放器任在播放,但是再次进入APP需要重新进入,因为只清理了主进程;最近发现这些清理软件会引导用户打开无障碍模式,然后模拟点击事件进入应用信息页面强制停止应用,播放器才停止播放,而设置源码中强制停止调用的是forceStopPackage方法(hide API,系统应用才能调用)

  • 3.重写服务的onStartCommand()方法,填写以下返回值
有以下四种返回值:
START_STICKY:kill后会被重启
START_STICKY_COMPATIBILITY:START_STICKY的兼容版targetSdkVersion 小于 2.0版本,就会返回该值,否则返回START_STICKY
START_NOT_STICKY:kill之后不会被重启
START_REDELIVER_INTENT:kill后会被重启

这种方式适用于360、安全管家等清理进程的软件调用AM的killBackgroundProcesses方法,但是对于forceStopPackage(hide API,系统应用才能调用)是不生效的

  • 4.监听系统一些事件启动服务

Android系统提供一系列监听,开发者可以监听这些事件来执行一些操作(开机广播,电源广播,网络广播等)

使用静态注册的广播接收器监听一些系统广播或其他应用发出的广播,在onReceive中重启进程

流氓策略:在监听锁屏广播,锁屏时打开一个透明的activity,这是,这个APP优先级为前台进程,优先级特别高,保证锁屏待机过程中很难杀死

还一种情况是,在onDestroy中重启service??然而service被kill的时候都没机会去调用onDestroy方法

  • 5.接入第三方推送SDK(如:个推,小米推送等),杀死APP也能收到推送

这个推送除了推送消息,还能带动其他应用的启动(上述定制系统均已实现禁止各种场景互相拉动).

最近发现一个还不错的推送SDK: https://github.com/joyrun/MixPush

  • 6.忽略电池优化功能(Android6.0推出的)

android6.0增加了Doze和AppStandby来提高电池续航.Doze是指设备长时间不用时,延迟后台CPU和网络的活动来减少电池消耗;App Standby则是延迟没有交互的app网络活动.同时,系统提供一个可配置的白名单来让某些app免除Doze和App Standby的优化.

忽略电池优化会带来更多的电池消耗同时需要用户同意方可加入,调用代码如下:

public void ignoreBatteryOptimization(Activity activity) {

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

    boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(activity.getPackageName());
    // 判断如果没有加入电池优化的白名单,则弹出加入电池优化的白名单的设置对话框
    if(!hasIgnored) {
        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:"+activity.getPackageName()));
        startActivity(intent);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值