Is it possible to kill a "android:persistent=true" system
I have an app that is just a service that launches on boot. I am developing at the system level, so I am using android:persistent=true
in order to ensure my service is not killed under memory pressure.
However, I find this prevents me from killing my service under any conditions. I still want to be able to kill it myself - is there a way to do this, or is it impossible because "persistent=true" is defined in the manifest?
If this is not possible, how else can I protect my process from dying under memory pressure? Can I define a priority by hand? Perhaps oom_score
or something?
Figured it out. Most methods of stopping the service will not stop the persistent flag from restarting it. This includes stopService, killBackgroundService, and even System.exit(0);
There is a hidden function called forceStopPackage
in ActivityManagerService that you can invoke through the ActivityManager interface by reflection. Requires system privileges, but that shouldn't be an issue if you are using persistent.
In Manifest:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" tools:ignore="ProtectedPermissions"></uses-permission>
This will kill the process. Give it name of process/package.
try {
Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("forceStopPackage", new Class[]{String.class});
Object o = m.invoke(null, new Object[]{"com.your.process"});
}catch (Exception e){
Log.e(TAG, "Failed to kill service", e);
}
android:persistent=true
Works for preloaded applications, doesn't work for downloaded applications (eg APPs from Play Store, installed from apk or AS) Suggest to use foreground service method - The highest priority process. Official example here, Another full-code example here
链接地址: http://www.djcxy.com/p/34964.html