2011-11-16 64 views
6

有问题的应用程序已被部署。我已经找到了关于ACRA的信息,并且将会添加这些信息以找出应用程序崩溃的原因。Android应用程序崩溃但不重新启动 - 从应用程序中的其他位置恢复

然而,我的问题是,应用程序将崩溃(对话框将显示给你的选项“强制关闭”或“等待”),但不是完全重新启动应用程序,它从前一个点恢复发生了事故。然而,这会导致问题,只有通过重新启动应用程序才能解决问题(例如突然丢失数据,无意义的崩溃等)。

那么,我怎么能强迫我的应用程序,一旦崩溃,刚刚结束? (不重新启动)。

编辑:最大的问题是,在应用程序崩溃后,我的首选项文件中的所有数据都会消失,直到应用程序重新启动时为止。

+0

我相信您在这里面对的是'ANR'或活动不是响应,这与应用程序崩溃(强制关闭)不同。应用程序中的某些操作似乎阻止主线程(UI线程)一段时间,这会提示此强制关闭/等待对话框。如果您选择等待,则该应用程序在该操作完成的范围内将保持无响应状态。然后,该应用程序将恢复。但是,一旦你按下“强制关闭”,应用程序将关闭,并在下次访问时重新启动。 – Abhijit

+0

这不是ANR的情况,有时会显示“强制关闭”或“等待”,这是UI线程被阻塞,但有时它只是一个“强制关闭”,所以应用程序实际上已经崩溃。应用程序不会一直关闭 - 在某些平台上它会关闭,但在其他平台上,它只是从以前的点开始恢复,并且已经丢失了所有的优先数据。 – digerati32

回答

3

默认情况下,Android将重新启动上次的活动活动。不要强迫它重新启动,更好的策略是修复您的应用程序,这样即使没有数据可用,活动也不会崩溃或正常退出。如果您绝对依赖某些数据(意图附加项目)并且没有默认值,那么如果它不可用,则可以致电finish()或启动主/主活动。

另一种方法是在使用ACRA报告崩溃(我相信在ACRA的错误跟踪器中有这个功能请求)后,让您自己的默认异常处理程序重新启动主要活动等。

+0

我想修复我的应用程序,但不幸的是它已经被部署了,而且我已经添加了ACRA来捕获异常现在,但为了万一发生任何事情,我想强制退出应用程序。我检查了ACRA并找不到该功能...我认为它还没有实施? – digerati32

+1

仅仅因为它的部署并不意味着你不能修复它并重新部署它,人们会很乐意更新他们的应用程序来修复崩溃。 –

+0

取决于它是哪个操作系统版本(或者它是如何通过电话实现的),它将在应用程序崩溃时关闭应用程序。即使使用ACRA,我也无法找到强制关闭应用程序的方法。你可以做的最多的事情是与ACRA目前发生的一次“安静”的碰撞,所以没有对话出现。 我已经添加了ACRA安装的更新,所以我希望能够得到崩溃的原因,然后我可以修复它们。我只是想把你的问题标记为正确的,因为它最接近正确的答案......尽管没有答案。 – digerati32

1

我知道这个问题是有点老了,但对于未来的参考和Google,这里是从另一个完整的答案,很难找到,计算器问题:Android App Restarts upon Crash/force close


创建用于处理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); 
    } 
} 

然后在每一个线程(通常你只有一个,除非你开始一个新的线程(异步或...着,当然你知道线程,如果你能做出新的;)),设置这个类作为DefaultUncaughtExceptionHandler

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

但请记住! 在开发应用程序的最后一步中,您必须至少尝试处理所有例外情况,然后再将它们留给DefaultUncaughtExceptionHandler

+0

我们需要两个ACRA以及重新启动整个应用程序 –