随笔 - 101  文章 - 0  评论 - 185  阅读 - 64万

Android 限制后台进程数量/不保留活动

Android 限制后台进程数量/不保留活动

>> Don't keep activities

>> Background process limit

 

手动设置

进入系统设置 --> 打开开发者选项 --> 找到“不保留后台活动”/ “后台进程限制”-->按需设置

调用系统API设置

引入权限

    <uses-permission android:name="android.permission.SET_PROCESS_LIMIT" />
    <uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />

 

调用设置

import android.app.ActivityManager;
import android.app.IActivityManager;
import android.os.RemoteException;

try {
    IActivityManager am = ActivityManager.getService();
    am.setProcessLimit(0);
    am.setAlwaysFinish(true);
} catch (SecurityException e) {
} catch (RemoteException e) {
}

 

注意权限的问题,一般需要system app才可设置

 

查看设置信息

进到系统设置里,应该也可以看到UI已经按照设置变化了,或者使用命令查看

1. dumpsys activity settings 看如下值的变化

  mOverrideMaxCachedProcesses=4
  CUR_MAX_CACHED_PROCESSES=4

2. settings get global always_finish_activities

console:/ $ settings get global always_finish_activities
1

不保留活动还可以如下设置

settings put global always_finish_activities 1

import android.provider.Settings;

Settings.Global.putInt(this.getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 1);

 

补充几句

可以查看如下档案:

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerConstants.java

里面的定义了默认最大可以缓存的进程数量

private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;

 

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

ActivityManagerServic中提供了对外操作的方法,可以清楚看到,方法中首先去检查权限

    @Override
    public void setProcessLimit(int max) {
        enforceCallingPermission(android.Manifest.permission.SET_PROCESS_LIMIT,
                "setProcessLimit()");
        synchronized (this) {
            mConstants.setOverrideMaxCachedProcesses(max);
        }
        trimApplications(OomAdjuster.OOM_ADJ_REASON_PROCESS_END);
    }



    @Override
    public void setAlwaysFinish(boolean enabled) {
        enforceCallingPermission(android.Manifest.permission.SET_ALWAYS_FINISH,
                "setAlwaysFinish()");

        long ident = Binder.clearCallingIdentity();
        try {
            Settings.Global.putInt(
                    mContext.getContentResolver(),
                    Settings.Global.ALWAYS_FINISH_ACTIVITIES, enabled ? 1 : 0);

            synchronized (this) {
                mAlwaysFinishActivities = enabled;
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

 

参考

https://blog.csdn.net/qq_34694875/article/details/103906890

 

posted on   二的次方  阅读(5355)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示