如何知道android应用程序上次是否崩溃了

时间:2015-01-12 10:19:58

标签: java android crash crash-reports

我有一个Android应用程序,我想知道这个应用程序的启动是否我的应用程序先前崩溃了。此故障可能是由应用程序上的操作系统强制执行的崩溃,以节省内存或任何其他原因。它可能无法在UnhandledExceptionHandler中捕获。我到目前为止所处理的内容如下所示,并没有缓存那些本机操作系统相关和内存强制执行的情况

UncaughtExceptionHandler handler = new UncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);

编辑:

请不要建议第三方图书馆。

3 个答案:

答案 0 :(得分:1)

这将通过SharedPreferences进行,首先当您在MainActivity中输入应用时,创建一个名为boolean的{​​{1}}变量并将其保存到您的{ {1}}的值为crash,然后在捕获崩溃时,只需使用值SharedPreferences重新保存此变量,这将自动覆盖之前存储的false值。

保存值:

true

加载保存的值:

crash

因此,在崩溃处理程序类中,只需将值保存为true:

P.S。这必须针对所有unHandled Exceptions运行,无论是来自操作系统的应用程序。

private void savePreferences(String key, String value) {
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    Editor editor = sharedPreferences.edit();
    editor.putBoolean("crash", false);
    editor.commit();
}

答案 1 :(得分:1)

我找到了一个黑客,它对我有用。如果有人知道用户是否离开了应用程序或关闭了系统或是否做了任何此类事情或应用程序本身已关闭,则可以检查其应用程序是否崩溃。如果应用程序本身已关闭,则意味着它已崩溃,否则不会(在用户关闭应用程序或关闭系统的情况下)。

借助共享首选项,可以存储并获取一个变量,该变量将告知应用程序是否已崩溃,代码如下所示

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);
}

答案 2 :(得分:0)

1)当Android杀死并重新启动你的app时,静态变量被设置为null(更确切地说,最初设置为null,稍后,很快就会设置为初始值;静态初始值设定项可能会在变量中看到null尚未初始化)。因此,如果某个静态变量设置为null而Bundle中的数据表明用户已经在做某事,则会重新启动进程(我假设您知道 onCreate中的Bundle是什么( Bundle )。

2)你可能在持久存储中有一个标志;例如,当应用程序启动时,该标志将设置为true,并在正常结束之前设置为false。如果应用程序启动时该标志为true,则表示发生了崩溃。 (应用程序在正常关闭后崩溃的可能性仍然很小......但这对你来说很重要吗?)

3)您可以将应用程序的pid保存在持久性内存中(请参阅myPid())。