2011-11-16 13 views
6

La aplicación en cuestión ya se ha implementado. Descubrí ACRA y lo agregaré para descubrir por qué están ocurriendo los bloqueos de la aplicación.La aplicación Android se bloquea, pero no se reinicia: se reanuda desde otro punto de la aplicación

Mi problema, sin embargo, es que la aplicación se bloqueará (aparecerá el diálogo que le da la opción de "Forzar cierre" o "Esperar"), pero en lugar de reiniciar completamente la aplicación, se reanuda desde un punto anterior el accidente ocurrió. Sin embargo, esto causa problemas, que solo se solucionan reiniciando la aplicación (por ejemplo, pérdida repentina de datos, bloqueos que no tienen sentido, etc.).

Entonces, ¿cómo puedo forzar mi aplicación, una vez que se estrelló, para terminar? (NO reiniciar).

Editar: El mayor problema es que después de que la aplicación falla, todos los datos en mi archivo de preferencias desaparecen, hasta que la aplicación se reinicia cuando vuelve.

+0

Creo que lo que enfrenta aquí es un 'ANR' o Actividad No Respondiendo, que es diferente de un bloqueo de la aplicación (cierre de la fuerza). Algunas operaciones en su aplicación parecen estar bloqueando el hilo principal (el hilo de la interfaz de usuario) durante un cierto período de tiempo, lo que provoca este diálogo de cierre/espera de la fuerza. Si elige esperar, la aplicación no responderá en la medida de la finalización de esa operación. Entonces, la aplicación se reanudaría. Pero una vez que presione 'Forzar cierre', la aplicación se apagará y se reiniciará cuando acceda a ella la próxima vez – Abhijit

+0

No es el caso de un ANR, a veces muestra "Forzar cierre" o "Esperar", que es el El hilo de la interfaz de usuario está bloqueado, pero a veces solo se trata de un "cierre forzado", por lo que la aplicación se ha bloqueado. Y la aplicación no se apaga de manera constante: en algunas plataformas se apaga, pero en otras solo se reanuda desde un punto anterior y ha perdido todos los datos de las prefrencias. – digerati32

Respuesta

3

Android reiniciará la última actividad activa de forma predeterminada. En lugar de obligarlo a reiniciar, la mejor estrategia sería arreglar su aplicación, de modo que las actividades no se bloqueen o salgan con gracia incluso si no hay datos disponibles. Si depende absolutamente de algunos datos (extras intencionados) y no hay valores predeterminados, puede simplemente llamar al finish() si no está disponible, o iniciar la actividad principal/primaria.

Otra forma es tener su propio manejador de excepciones predeterminado que reinicie la actividad principal, etc. después de informar el bloqueo usando ACRA (creo que hay una solicitud de funciones para esto en el rastreador de errores de ACRA).

+0

Me gustaría arreglar mi aplicación, pero desafortunadamente ya se ha implementado, y he agregado ACRA para detectar las excepciones ahora, pero en caso de que algo pase, quiero salir de la aplicación con fuerza. Revisé ACRA y no pude encontrar esa característica ...Supongo que todavía no se ha implementado. – digerati32

+1

El hecho de que su implementación no signifique que no pueda solucionarlo y volver a implementarlo, la gente actualizará gustosamente sus aplicaciones para solucionar bloqueos. –

+0

Dependiendo de la versión del SO que sea (o cómo fue implementado por el teléfono) cerrará la aplicación si la aplicación falla. No he podido encontrar la manera de forzar el cierre de la aplicación cuando se bloquea, incluso con ACRA. Lo máximo que puede hacer ahora es un bloqueo "silencioso" con ACRA, de modo que no aparezca ningún cuadro de diálogo. He agregado la actualización con ACRA instalado, así que con suerte podré obtener los motivos de los fallos y luego puedo solucionarlos. Solo voy a marcar su pregunta como correcta porque es lo más cercano a ser correcto ... sin embargo, no hay una respuesta. – digerati32

1

Sé que esta pregunta es un poco viejo, pero para futuras referencias y empleados de Google, aquí hay una respuesta completa de otro, difícil de encontrar, pregunta StackOverflow: Android App Restarts upon Crash/force close


crear una clase utilizada para manejar unCaughtException

public class MyExceptionHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final Class<?> myActivityClass; 

    public MyExceptionHandler(Context context, Class<?> c) { 

     myContext = context; 
     myActivityClass = c; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, myActivityClass); 
     String s = stackTrace.toString(); 
     //you can use this String to know what caused the exception and in which Activity 
     intent.putExtra("uncaughtException", 
       "Exception is: " + stackTrace.toString()); 
     intent.putExtra("stacktrace", s); 
     myContext.startActivity(intent); 
     //for restarting the Activity 
     Process.killProcess(Process.myPid()); 
     System.exit(0); 
    } 
} 

Luego, en cada hilo (por lo general sólo tiene una, a menos que inicie un nuevo hilo (asíncrono o ..., por supuesto que sabes sobre las discusiones si usted es capaz de hacer nueva;)), establezca esta clase como el DefaultUncaughtExceptionHandler

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, 
      YourCurrentActivity.class)); 

¡Recuerde! Hágalo en el último paso del desarrollo de su aplicación, TIENE que intentar al menos manejar todas sus excepciones una por una antes de dejarlas para DefaultUncaughtExceptionHandler

+0

necesitamos tanto ACRA como reiniciar toda la aplicación –

Cuestiones relacionadas