Cómo reiniciar automáticamente un servicio cancelado por el administrador
El método de la red para resolver este problema:
(1)
Anule el método OnStartCommand en el servicio. Este método tiene tres valores de retorno. servicio que se llama Reescribe automáticamente el @Override creado después de eliminar public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY }
(2)
En el servicio. onDestroy( ) para reiniciar el servicio.
public void onDestroy() {
Intent localIntent = new Intent();
localIntent.setClass(this, MyService.class); // Antes de la destrucción Reinicie el servicio cuando
este .startService(localIntent);
}
Para la (2) solución, escribí mi propio código para probarlo, 1: Si DOWNLOADED cierra toda la aplicación (detención forzada) en la configuración del sistema, el método onDestory en la clase de servicios no escuchará (el registro del método onDestory en la clase de servicios no imprimirá el registro) , si RUNNING mata el servicio del proyecto en la configuración del sistema, el método onDestory escuchará (registro del método onDestory en la clase de servicios). También hay registros de impresión), por lo que esta solución puede no ser necesariamente aplicable. 2: O eliminar directamente mi aplicación a través de otras aplicaciones, pero no se llamará al método onDestory de la clase de servicio.
(3)
Luego escriba un apk y use la transmisión para monitorear si el APK está cerrado. Si está cerrado, reinicie el APK. Reinicie APK, aquí usamos otro APK, porque una aplicación cerrada no puede detectar el evento de su propio cierre, sino que solo puede recibir la transmisión del cierre de otras aplicaciones.
Receptor para esta operación
public class ProtectorHelperReceiver extiende BroadcastReceiver {
@Override
public void onReceive( Context context, Intent intent) {
String pkg = "com.innofidei.myprotector";// El nombre del paquete de la aplicación cerrada
String action = pkg + ".action.START_ SERVICE";// acción para reiniciar el servicio p>
Cadena str = intent.getData().toString().toLowerCase().replace("paquete:", "");
Cadena de datos = intent.getAction( ); /p>
if (str! = null && str.equals(pkg)) {
if (data!= null && data.equals("android.intent.action.PACKAGE_REMOVED ")) {
Archivo archivo = nuevo Archivo("/sdcard/")+ contexto.getPackageName() + " /ProtectorHelper.apk");
archivo.delete() ; p>
file.getParentFile().delete();
Intent intent2 = new Intent(context, UninstallActivity.class);
intent2.setFlags(Intent .FLAG_ACTIVITY_NEW_TASK) ;
context.startActivity(intent2);
} else {
context.sendBroadcast(new Intent(action));//Notificar aplicación Servicio de reinicio del programa
}
}
}
}
}
(4)
android:sharedUserId="android.uid.system"> android:allowClearUserData="false" android:process="system" android:killAfterRestore =" false"> Esto debería funcionar. También imito la escritura de AndroidManifest.xml que las aplicaciones del sistema no pueden eliminar, pero para escribir así, debes poder compilar el entorno del código fuente. , eclipse no tiene permiso para compilar este proyecto, (5) Agregue el archivo de configuración de la función del proyecto AndroidManifest.xml: (5) p> android:persistent="true" // Bajo el nodo (6) Cómo aumentar la prioridad de los servicios de Android: Echemos un vistazo en el primer nivel de proceso del sistema: Ingrese $SDK/tools y ejecute el comando: # adb shell dumpsys actividad|grep oom_adj Código: Ejecute el proceso de especificación #6: oom_adj= 0ProcessRecord{43635cf0 12689.} Ejecute la especificación programa n.º 5: oom_adj = 7 ProcessRecord{436feda012729:com.android.browser/10006} Ejecutando el proceso canónico n.º 4: oom_adj= 8 ProcessRecord{4367e83812761:android.process.acore/10016} Ejecutando el proceso canónico n.º 3: oom_adj= 8 ProcessRecord {43691cd812754: com.google.}Ejecutando el proceso PERS n.° 1: oom_adj=-12 ProcessRecord{435067505941:com.android.phone/1001}Ejecutando el proceso PERS n.° 0: oom_adj=-100 ProcessRecord{4348fde0 5908:system/1000} seguido por Hay muchas cosas. Observe el valor de oom_adj. Si es mayor que 8, generalmente pertenece al fondo y puede eliminarse en cualquier momento. Cuanto menor sea el valor, mayor será la prioridad y más tarde. delicado. Cuando miras el programa del teléfono, es -12, lo que significa que el teléfono es un teléfono, todo lo demás está a cargo y aún puede responder llamadas, ¿verdad? También está -100, lo cual es bastante malo, porque es el sistema. Si se bloquea, el sistema también se bloqueará si así lo deseas. El sistema Android tiene su propio. Sistema propio para la gestión de la memoria Para garantizar el funcionamiento ordenado y estable del sistema, el sistema asignará automáticamente el uso de la memoria interna del programa de control. Cuando el sistema siente que los recursos actuales son muy limitados, para garantizar que algunos programas de alta prioridad puedan ejecutarse, eliminará algunos programas o servicios que considera sin importancia. Para liberar memoria. Esto garantizará que los programas que son realmente útiles para el usuario sigan ejecutándose. Si esto le sucede a su servicio, lo más probable es que lo eliminen primero. Sin embargo, si aumenta la prioridad del servicio, puede establecer la prioridad del servicio para que se ejecute durante un período de tiempo más largo usando setForeground(true). ¿Por qué prospectar? De forma predeterminada, los servicios están marcados como fondo y las actividades en ejecución están marcadas como primer plano. Esto significa que si configura un servicio en primer plano, obtendrá mayor prioridad, que es lo mismo que las actividades en ejecución son similares. . Esto no garantiza que su servicio nunca se cerrará, solo aumenta su prioridad. (7) Consulte mi otro artículo "Cómo evitar que el sistema o las aplicaciones de terceros eliminen las aplicaciones de Android", ( 8) @Override public IBinder onBind(Intent arg0) { //TODO código auxiliar de método generado automáticamente Log.v ( "TrafficService", "Bind"); estado = BINLD; Usando subprocesos, el subproceso no será destruido return myBinder;< } class TrafficBinder extends Binder { public float his = historial ; TrafficService getService(){ return TrafficService.this; } } @ Anular public void onCreate() { // TODO Código auxiliar de método generado automáticamente receptor = new NetReceiver(); IntentFilter nfilter=new IntentFilter(); nfilter.addAction("android.net.conn.CONNECTIVER")net.conn.CONNECTIVITY_CHANGE"); this.registerReceiver(receptor, nfilter ); tratoBuffer(); handler.post(createBrod); Log.v(" TrafficService", "Crear "+historial+" " + todayTraffic+" "+tempTraffic); super.onCreate(); } @Override público booleano onUnbind(Intent intent ) { // TODO genera automáticamente resguardos de métodos state = UNBINLD; Log.v("TrafficService", "Unbind"); p > return true; } @Override public void onRebind(Intent intent) { // TODO automático Generar código auxiliar de método Log.v( "TrafficService", "Rebind"); state = BINLD;; super.onRebind(intent); } @Override public void onDestroy() { // TODO genera automáticamente códigos auxiliares de métodos handler.removeCallbacks(updateBrod); momorybuffer(); nManger.cancel(R. layou t.notifi); unregisterReceiver(receptor); Log.v("TrafficService", "destroy "+history+" "+todayTraffic+" "+tempTraffic); super.onDestroy(); } @Override stopService público booleano (nombre de la intención) { / / TODO Generar automáticamente códigos auxiliares de métodos momorybuffer(); nManger.cancel(R.layout.notifi); nManger.cancel(R.layout. notifi); super.notifi); Log.v("TrafficService", nombre.getAction()); Log.v(" TrafficService ", "detener "+historial+" "+todayTraffic+" "+tempTraffic); return super.stopService(nombre); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //TODO código auxiliar de método generado automáticamente Log.v("TrafficService", " startCommand"); flags = START_STICKY; return super.stopService(nombre); } return super.stopService ( name)onStartCommand(intent, flags, startId); // return START_REDELIVER_ INTENT; } // onstartCommand en el código anterior devolverá START_STICKY, y reinicie el servicio al final de la destrucción, para que no haya ningún problema.