java - solucion - porque se detiene mi aplicacion de android studio
Reinicie el servicio incluso si la aplicación se detiene por la fuerza y siga ejecutando el servicio en segundo plano incluso después de cerrar la aplicación ¿Cómo? (8)
Estoy tratando de ejecutar un servicio en segundo plano. Lo que hace mi aplicación es cuando el usuario marca la casilla de verificación, luego se inicia el servicio y cuando se desactiva, el servicio se detiene. Que está funcionando perfectamente bien. Pero el problema es que cuando cerré la aplicación desde el administrador de tareas, este también detiene el servicio. Lo que quiero es mantener el servicio en funcionamiento incluso después de que esté cerca del administrador de tareas. Entonces, la única forma de detener ese servicio es por el propio usuario, desmarcando la casilla.
¿Cómo puedo conseguir esto?
Aqui esta mi codigo
Mi actividad principal
public class SampleServiceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final CheckBox cb = (CheckBox) findViewById(R.id.checkBox1);
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked) {
Toast.makeText(getBaseContext(), "Checked", Toast.LENGTH_LONG).show();
startService(new Intent(getBaseContext(), MyService.class));
} else {
Toast.makeText(getBaseContext(), "Unchecked", Toast.LENGTH_LONG).show();
stopService(new Intent(getBaseContext(), MyService.class));
}
}
});
}
}
Mi clase de servicio
public class MyService extends Service {
Notify n = new Notify();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
n.initNotification(getBaseContext(), true);
return START_STICKY;
}
//method to stop service
public void onDestroy() {
super.onDestroy();
n.cancelNotification(getBaseContext());
Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
}
}
Actualizar
¿Cómo podemos hacer este servicio para que funcione como el servicio gtalk?
Pero el problema es que cuando cerré la aplicación desde el administrador de tareas, este también detiene el servicio.
Correcto.
Lo que quiero es mantener el servicio en funcionamiento incluso después de que esté cerca del administrador de tareas. Entonces, la única forma de detener ese servicio es por el propio usuario, desmarcando la casilla.
Puede implementar su servicio en C / C ++, integrarlo en un firmware personalizado y convencer a las personas para que instalen ese firmware en sus dispositivos.
Cuando instalamos gtalk y, una vez que iniciamos sesión, no aparece en la pestaña de aplicaciones activas en el administrador de tareas. Pero se ejecuta en el fondo.
Es parte del firmware.
Creo que este enlace te ayudará.
Desactivar el botón de parada de fuerza en la aplicación de gestión
Se desactiva el botón Forzar detención en la configuración del Instalador de paquetes, por lo que nadie puede detener su aplicación.
Deje que su Service
ejecute en un proceso separado. Hay un buen tutorial en este blog .
Puede especificar el atributo android:process
en la etiqueta <Service>
para que su aplicación se ejecute dentro de su propio proceso.
<service
android:name="MyServiceName"
android:process="my_process"
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>
No estoy completamente seguro de que pueda evitar que su aplicación sea cerrada por el Administrador de tareas. Si lo piensas bien, tiene sentido que sea así. Imagina que tienes una aplicación que no responde a la entrada del usuario y que tampoco responde a que el Administrador de tareas te mata. No está bien. Sin embargo, encontré this pregunta que es similar a la suya. También puede hacer que el sistema reinicie automáticamente su Servicio como se describe aquí (desplácese hacia abajo en esa página un poco antes de ''iniciar un servicio''
No estoy seguro de a qué Administrador de tareas al que se refiere como diferentes actuaría de manera diferente, por lo que baso mi respuesta en la acción cuando el usuario ingresa a Configuración -> Administrar aplicaciones y -> forzar detiene la aplicación de la manera Android le ha dado.
Suponiendo que su servicio se está ejecutando como parte del proceso y si el usuario detiene el proceso, se le impide volver a ejecutar el servicio hasta que el usuario lo inicie manualmente. Esto es especialmente válido a partir de la versión 3.0 o superior (verifique el suyo). ). También parece lógico cuando piensas que hay una aplicación que mantiene un servicio iniciado todo el tiempo y está molestando al usuario de alguna manera. Por lo tanto, cuando el usuario solicita un hit (:) forzar la detención) en la aplicación, no debe reiniciar el servicio para continuar molestando al usuario.
Por ejemplo, imagina lo que sucedería si pudieras crear aplicaciones que se comieran a la hora de tu procesador manteniendo un bloqueo de activación, y no podrías matarlas. Esto sería horrible y un gran desastre de seguridad.
Por lo tanto, no podrá reiniciar su servicio de ninguna manera hasta que el usuario inicie una de sus actividades.
Tampoco se puede desactivar el botón de parada de fuerza AFAIK. Debe tener el punto de vista de que no hay nada en el dispositivo que pueda controlar además de su aplicación y (hasta cierto punto) los recursos a los que tiene acceso.
Finalmente, incluso la aplicación gtalk se doblará a tu voluntad si deseas forzar la detención. Se iniciará solo cuando use Gtalk u otras aplicaciones que usen el servicio gtalk, como PUSH Gmail (para teléfonos donde gtalk no es parte del firmware). También echa un vistazo a Android C2DM aquí:
https://.com/a/11238779/1218762
No puedes evitar que tu servicio sea asesinado en todas las circunstancias. Sin embargo, puedes pedirle al sistema que lo reinicie. Hay dos casos: (1) el proceso muere por alguna razón anormal (2) el teléfono se reinicia. En el primero, START_STICKY o START_REDELIVER_INTENT se utilizan para reiniciar el servicio. En este último, deberá agregar un BroadcastReceiver para android.intent.action.BOOT_COMPLETED.
Su código está devolviendo START_STICKY desde onStartCommand, por lo que ha elegido una de las rutas de reinicio del servicio: "si el proceso de este servicio se cancela mientras se inicia (después de regresar de onStartCommand (Intent, int, int)), déjelo en el comenzó el estado pero no retiene esta intención entregada. Más tarde, el sistema intentará volver a crear el servicio ... "
"Este modo tiene sentido para las cosas que se iniciarán y detendrán explícitamente para que se ejecuten durante períodos de tiempo arbitrarios, como un servicio que realiza una reproducción de música de fondo".
También puedes usar START_REDELIVER_INTENT.
Tenga en cuenta que si su servicio está realizando un trabajo importante, debe ejecutarse en un subproceso en segundo plano.
http://developer.android.com/reference/android/app/Service.html#START_STICKY
Puede intentar reiniciar el servicio en el evento de servicio onDestroy. Use algunas banderas para encontrar si el servicio está cerrado por el usuario o su fuerza está cerrada.
Tenga en cuenta que no hay garantía de que onDestroy se llame cada vez.
usar mi método si desea iniciar una aplicación oculta por primera vez, hago una actividad de iniciador transparente como esta
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Transparent"
android:excludeFromRecents="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Así que hago la aplicación oculta en el iniciador colocando este código en oncreat () [Código]
PackageManager p = getPackageManager();
ComponentName componentName = new ComponentName(this, MainActivity.class); // activity which is first time open in manifiest file which is declare as <category android:name="android.intent.category.LAUNCHER" />
p.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Por lo tanto, uso este código para mostrar el ícono de la aplicación en el iniciador y lo habilito para ejecutarse en la clase de servicio que usa el arranque del receptor de difusión y en la clase de receptor de la conexión de red (autostart.java y networkConnectinCheck.java):
PackageManager p = context.getPackageManager();
ComponentName componentName = new ComponentName(context, MainActivity.class);
p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Ahora puedo ejecutar la aplicación por primera vez con las manos del usuario y después de esto, uso la aplicación de mi receptor para el almuerzo en cualquier momento.