我正在构建一个有时会崩溃的应用程序,我想知道它在下次打开它时崩溃了所以我可以向用户建议一些崩溃后的选项.我怎样才能发现崩溃?此外,我希望能够在崩溃之前保存用户的工作,我的意思是实时检测崩溃,我可以在不知道崩溃的地方进行吗?
我有没有办法注册一个全局错误处理程序,以防止应用程序崩溃?此处描述了崩溃报告:如何从Android应用程序获取崩溃数据?.我有一个想法是扩展这些解决方案以接受应用程序上下文,以便可以重定向到特定的报告活动?但是一旦报告崩溃,不确定应用程序上下文是否在此时有效?
但是,当发生崩溃时,如何将用户重定向到全局错误消息Activity?是否有一些高级方法来注册错误处理程序,以捕获所有错误并防止崩溃?有没有办法注册这样的处理程序,以便它可以防止或幸免于崩溃,然后将用户重定向到一个特定的活动,这将显示有问题的错误消息?
这是我对错误处理程序的修改:
1)只需将applicationContext构造函数作为ctx 传递给构造函数
2)添加reportError(stackTrace)方法将控制转移到错误消息页面
private void reportError(String stackTrace){
Intent i = new Intent(ctx, DisplayErrorActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setAction("DISPLAY_ERROR_ACTIVITY");
Bundle b = new Bundle();
b.putString("STACKTRACE", stackTrace);
i.putExtras(b);
try{
Log.d("MyErrorHandler","reportError ctx="+ctx);
ctx.startActivity(i);
} catch (Exception e) {
Exception ex = e;
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
并reportError在下面打电话:
public void uncaughtException(Thread t, Throwable e) {
Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx);
String timestamp=getDateTime();
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个全局异常处理服务,如本答案中所述.这种方法听起来合乎逻辑,因为在崩溃之后,我的自定义中的代码Thread.UncaughtExceptionHandler可能无法成功执行,因为应用程序可能不处于稳定状态,或者因为可能没有足够的时间在该进程被操作系统杀死之前.
不幸的是,这种方法似乎不起作用,因为服务在同一个过程中启动,所以它也被杀死了.如何从处理程序启动服务uncaughtException()?我可以强制服务在完全独立的过程中启动吗?
我正在设置我的自定义默认(VM级别)异常处理程序,Application如下所示:
public class MyApp extends Application {
@Override
public void onCreate() {
Thread.setDefaultUncaughtExceptionHandler(
MyExceptionReporter.getInstance(this));
...
Run Code Online (Sandbox Code Playgroud)
在我的自定义处理程序中,我正在启动这样的服务:
final Intent i = new Intent(MyExceptionService.INTENT);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra(MyExceptionService.EXTRA_STACK_TRACE,
Log.getStackTraceString(ex));
mContext.startService(i);
Run Code Online (Sandbox Code Playgroud)
该服务在AndroidMaifest.xml文件中被解析,并从应用程序的其他地方启动.
从我的搜索,我得到以下代码获取崩溃日志.
try {
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder log=new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null)
{
log.append(line);
}
Run Code Online (Sandbox Code Playgroud)
但是我在哪里添加此代码,以便每当我的应用程序崩溃时我都应该收到崩溃报告.
此外,我想通过电子邮件发送或发送到服务器,但在应用程序崩溃后,如何调用动作发送电子邮件/ HTTP发布方法.
请提前告知并提前致谢.
关于崩溃的Android应用程序,我有一个非常模糊的问题.
用户向我报告我的应用程序在获得正确的内容时崩溃.
基本上是这样的话:用户正确回答问题 - >显示Toast - >向我的服务发送消息 - >从服务收到的信息更新屏幕
我已经在我的G1上测试了这个,即使屏幕尺寸和分辨率不同,我也从未在模拟器上看到过这种情况.我尝试在我的所有屏幕更新代码周围放置try catch块,但它们仍然报告错误.
我的猜测是该服务可能正在终止或其他什么.但这只是猜测.有任何想法吗?
我试图从用户那里获得更多信息,但Android Market评论系统在这方面缺乏.