Android O background restriction
https://developer.android.com/about/versions/oreo/background
Android 8.0: 系統(tǒng)不允許后臺應用創(chuàng)建后臺服務澜薄。這個應該包含android8.0及以上秩贰。
默認情況下桨吊,這些限制僅適用于針對 O 的應用勋颖。 不過似嗤,用戶可以從 Settings 屏幕為任意應用啟用這些限制,即使應用并不是以 O 為目標平臺巡球。
public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
super.handlePositiveAction(anomaly, contextMetricsKey);
if (anomaly.targetSdkVersion < Build.VERSION_CODES.O) {
mAppOpsManager.setMode(**AppOpsManager.OP_RUN_IN_BACKGROUND**, anomaly.uid,
anomaly.packageName,
AppOpsManager.MODE_IGNORED);
}
}
Android P background restriction
https://developer.android.com/preview/features/power
· Excessive wake locks: 1 partial wake lock held for an hour when screen is off
· Excessive background services: If app targets API levels lower than 26 and has excessive background services
int EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF = 1;
int EXCESSIVE_WAKEUPS_IN_BACKGROUND = 2;
int EXCESSIVE_UNOPTIMIZED_BLE_SCAN = 3;
int EXCESSIVE_BACKGROUND_SERVICE = 4;
int EXCESSIVE_WIFI_SCAN = 5;
Action:
Force stop
Force app standby, disable running in background
public void setForceAppStandby(int uid, String packageName, int mode) {
final boolean isPreOApp = isPreOApp(packageName);
if (isPreOApp) {
// Control whether app could run in the background if it is pre O app
mAppOpsManager.setMode(**AppOpsManager.OP_RUN_IN_BACKGROUND**, uid, packageName, mode);
}
// Control whether app could run jobs in the background
mAppOpsManager.setMode(**AppOpsManager.OP_RUN_ANY_IN_BACKGROUND**, uid, packageName, mode);
}
Settings收到廣播會把異常信息存入數(shù)據(jù)庫壁酬,異常信息中有此字段anomalyInfo.autoRestriction,若為true辖所,會自動處理惰说,即setForceAppStandby(uid, packageName, AppOpsManager.MODE_IGNORED),若為false會提示用戶處理缘回。