我的 android 应用程序在强制关闭后重新启动,整个应用程序包含 20 个 Activity ,我依赖于在主要 Activity 上创建的静态数据。因此,一旦应用程序崩溃,我的所有静态数据都会丢失,并且当应用程序自动重新启动时,它实际上没有任何基本数据可供操作。
我的问题是,在崩溃时我希望这件事发生
- 如果应用崩溃,我不希望应用重新启动,而是希望从内存中清除与此应用相关的所有堆栈/任务。用户可以从头开始重新启动它
- 如果我不能阻止应用重新启动,至少我想保留基本数据,以便在应用重新启动时可以将它们分配回来。此外,当它重新启动时,我希望我的应用从主要 Activity 开始。
我知道当 Activity 崩溃时,android 系统会将堆栈中的下一个 Activity 带到前台,这就是我的应用程序产生冗余结果的原因。我也通过了 android 开发人员,但我只知道在 Manifest android:finishOnTaskLaunch="true"
中设置一个属性。但不幸的是,这对我没有帮助。非常感谢您帮助解决这个问题,并告诉我原因和分析。
最佳答案
最好的解决方案不是使用静态数据,而是使用
Shared Preferences
或将数据存储在Database
中,如果有任何uncaught Exception
发生时,显示类似Application has crashed and a report is sent to the admin
的消息,然后重新启动导致崩溃的 Activity。这样用户可以继续使用应用程序。做同样的事情,但不要重新启动导致异常的 Activity 重新启动应用程序。
创建一个用于处理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);
}
}
并在每个Activity中创建一个此类的Object并将其设置为DefaultUncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this,
YourCurrentActivity.class));
关于Android 应用程序在崩溃/强制关闭时重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12560590/