Java 如何知道android应用程序上次是否崩溃
我有一个android应用程序,我想知道在启动这个应用程序时,我的应用程序之前是否崩溃了。此崩溃可能是应用程序上的操作系统出于节省内存或任何其他原因强制执行的崩溃。在未处理的ExceptionHandler中可能无法捕获它。到目前为止,我所处理的内容如下所示,它并没有缓存那些与本机操作系统相关且强制执行内存的情况Java 如何知道android应用程序上次是否崩溃,java,android,crash,crash-reports,Java,Android,Crash,Crash Reports,我有一个android应用程序,我想知道在启动这个应用程序时,我的应用程序之前是否崩溃了。此崩溃可能是应用程序上的操作系统出于节省内存或任何其他原因强制执行的崩溃。在未处理的ExceptionHandler中可能无法捕获它。到目前为止,我所处理的内容如下所示,它并没有缓存那些与本机操作系统相关且强制执行内存的情况 UncaughtExceptionHandler handler = new UncaughtExceptionHandler(); Thread.setDefaultUncaught
UncaughtExceptionHandler handler = new UncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);
编辑:
请不要建议使用第三方库 这将通过
SharedReferences
实现,首先,当您在MainActivity
中输入应用程序时,创建一个名为crash
的boolean
变量,并将其保存到您的SharedReferences
,值为false
,然后在捕获崩溃时,只需使用值true
重新保存此变量,这将自动覆盖以前存储的crash
值
保存值:
private void savePreferences(String key, String value) {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
Editor editor = sharedPreferences.edit();
editor.putBoolean("crash", false);
editor.commit();
}
private void loadSavedPreferences() {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
boolean crash = sharedPreferences.getBoolean("crash", false);
if(crash){
// then your app crashed the last time
}else{
// then your app worked perfectly the last time
}
}
加载保存的值:
private void savePreferences(String key, String value) {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
Editor editor = sharedPreferences.edit();
editor.putBoolean("crash", false);
editor.commit();
}
private void loadSavedPreferences() {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
boolean crash = sharedPreferences.getBoolean("crash", false);
if(crash){
// then your app crashed the last time
}else{
// then your app worked perfectly the last time
}
}
因此,在崩溃处理程序类中,只需将值保存为true:
p、 这必须针对所有未处理的异常运行,无论来自的应用程序还是来自操作系统
1) 当Android终止并重新启动应用程序时,静态变量被设置为null(更准确地说,最初设置为null,稍后很快设置为初始值;静态初始值设定项可能会在尚未初始化的变量中看到null)。因此,如果某个静态变量被设置为null,而捆绑包中的数据表示用户正在执行某项操作,则会重新启动进程(我假设您知道onCreate(Bundle)中捆绑包的用途)
2) 您可能在持久存储中有一个标志;例如,当应用程序启动时,该标志将设置为true,在正常完成之前,该标志将设置为false。如果应用程序启动时该标志为true,则表示发生了崩溃。
(应用程序正常关闭后崩溃的可能性仍然很小……但这对你来说重要吗?)
3) 您可以将应用程序的pid保存在持久内存中(请参阅)。我发现了一个黑客程序,它对我有效。如果知道用户是否离开了应用程序或关闭了系统,或者做了任何类似的事情,或者应用程序本身关闭了,就可以检查其应用程序是否崩溃。如果应用程序本身被关闭,则意味着它已崩溃,否则它不会崩溃(在用户关闭应用程序或关闭系统的情况下) 在共享首选项的帮助下,您可以存储并获取一个变量,该变量将告诉您应用程序是否崩溃。下面给出了代码
public class Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
boolean appcrashed=false;
super.onCreate(savedInstanceState);
boolean didUserLeft=loadSavedPreferences();
appcrashed=!didUserLeft;
if(appcrashed)
Toast.makeText(this, "App Crashed!", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "App OK!", Toast.LENGTH_LONG).show();
savePreferences(false);
UnhandledExceptionHandler handler = new UnhandledExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);
}
public boolean loadSavedPreferences() {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
boolean didUserLeft = sharedPreferences.getBoolean("didUserLeft", true);
return didUserLeft;
}
public void savePreferences(boolean value) {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
Editor editor = sharedPreferences.edit();
editor.putBoolean("didUserLeft", value);
editor.commit();
}
@Override
public void onResume(){
super.onResume();
savePreferences(false);
}
@Override
public void onDestroy(){
savePreferences(true);
}
@Override
public void onPause() {
super.onPause(); // Always call the superclass method first
savePreferences(true);
}
@Override
public void onUserLeaveHint(){
savePreferences(true);
}
看一看,听起来你想要这样的东西。@G_V我已经研究过了,但它向我展示了外部库,加上这些报告也不会捕捉操作系统相关的崩溃,比如内存崩溃等等。你不能要求你的应用程序检测以前发生的系统崩溃,因为它甚至没有注意到。它刚刚被操作系统/内核杀死。你问的是不可能的,至少在那个程度上是不可能的。但当用户从任务栏关闭应用程序或用户关闭操作系统时会发生什么呢?在我看来,这两种情况无异于终止进程,尤其是当用户取下电池时。我怀疑在关机时,你的应用程序将调用onDestroy()。但我的问题是,内存泄漏和其他操作系统生成的崩溃没有在你的上述代码中捕获。如何获取它们?任何应用程序崩溃都必须由上述代码捕获,如果应用程序崩溃而没有被上述代码捕获,请给我一个关于您日志的提示。如果用户清除ram,它将返回true,但没有发生崩溃!