1.创建获取日志信息的类AppLogHandler,该类的功能是捕获导致应用程序意外退出的错误的日志信息,这里写的是一个错误保存一个log文件,保存到SD卡对应的目录下。代码如下:
package com.ryan.test.crash;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
import android.os.Environment;
import android.os.Looper;
public class AppLogHandler implements UncaughtExceptionHandler {
public static final boolean DEBUG = true;
public static final String AGR_LOG_DIRECOTORY = "agrlog";
private Thread.UncaughtExceptionHandler mDefaultHandler;
private static AppLogHandler instance;
private AppLogHandler() {
}
public static AppLogHandler getInstance() {
if (instance == null) {
instance = new AppLogHandler();
}
return instance;
}
public void init(Context context) {
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}
private boolean handleException(final Throwable ex) {
if (DEBUG) {
if (ex == null) {
return false;
}
final StackTraceElement[] stack = ex.getStackTrace();
final String message = ex.getMessage();
new Thread() {
@Override
public void run() {
Looper.prepare();
createLogDirectory();
String fileName = AGR_LOG_DIRECOTORY + "/crash-" + System.currentTimeMillis() + ".log";
File file = new File(
Environment.getExternalStorageDirectory(), fileName);
try {
FileOutputStream fos = new FileOutputStream(file, true);
fos.write(message.getBytes());
for (int i = 0; i < stack.length; i++) {
fos.write(stack[i].toString().getBytes());
}
fos.flush();
fos.close();
} catch (Exception e) {
}
Looper.loop();
}
}.start();
}
return false;
}
private void createLogDirectory() {
File file = new File(Environment.getExternalStorageDirectory(), AGR_LOG_DIRECOTORY);
try {
if (!file.exists() || !file.isDirectory()) {
file.mkdir();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:
import com.ryan.test.crash.AppLogHandler;
import android.app.Application;
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
AppLogHandler appLogHandler = AppLogHandler.getInstance();
appLogHandler.init(getApplicationContext());
}
}
4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:
<application
android:name="com.ryan.test.MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
<!-- 省略其他信息 -->
</application>
分享到:
相关推荐
Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...
"android程序意外退出自动重启"这个主题涉及到如何在程序出现意外错误导致崩溃时,实现程序的自动恢复和持续运行。以下是一些关键知识点的详细说明: 1. **异常处理**: - 在Android中,每个应用都有一个独立的...
"android 捕获异常重启APP"这一主题就是关于如何在Android应用中实现这种功能的讨论。 首先,要捕获异常,我们需要在应用的主进程中设置全局的异常处理器。Android系统提供了`Thread.UncaughtExceptionHandler`接口...
当Android应用在运行时遇到未被捕获的异常(Exception),系统会默认终止应用并显示一个简单的错误信息,这对于用户来说并不友好。因此,开发者通常会自定义CrashUI来提供更友好的错误反馈和调试信息。 首先,我们...
总结,要在Android Studio中实现Service在app退出后继续运行并开机自启动,需要理解Service的生命周期,正确配置BroadcastReceiver,以及采取保活策略。同时,对App的卡死崩溃进行监控和处理,以提升用户体验和应用...
然而,有些情况下,开发者需要提供一个明确的退出选项,比如教育类应用或者游戏,用户可能希望完全退出应用以节省资源或避免意外操作。本文将详细介绍如何实现“完美退出APP”的实例代码。 首先,我们需要理解...
"Android LOG日志抓取工具"专注于捕获异常日志,通常会在程序出现错误或崩溃时自动触发,收集相关的堆栈跟踪和上下文信息。这样,开发者无需在运行环境中实时监控,就能在后期分析日志以找出问题所在。 3. **集成...
为了解决这个问题,开发者通常会实现全局异常捕获机制,以便在程序崩溃时记录异常信息,并将这些日志保存到本地。此外,为了维护存储空间的有效利用,日志还需要定时清理。本文将详细介绍如何在Android中实现这一...
"UncaughtException不让Android应用异常退出"这个主题,就是关于如何处理程序中的未捕获异常,以防止应用突然崩溃,从而提升用户体验。在这个问题上,我们可以从以下几个方面来探讨: 1. **...
本篇文章将深入讲解如何在Android中实现捕获程序异常退出时的错误log信息。 首先,Android系统提供了`UncaughtExceptionHandler`接口,用于处理未被捕获的异常。当程序中的异常没有被try-catch块捕获,或者在主线程...
总的来说,Android应用的异常收集和处理是一个系统性的工程,涉及到异常的捕获、处理、日志记录、错误报告等多个环节。通过合理的异常处理策略,开发者可以快速定位和修复问题,提高应用的稳定性和用户体验。
在Android应用开发中,确保应用稳定性...它涵盖了从异常捕获、信息收集、数据上报到用户交互的多个环节,是Android开发中不可或缺的一部分。通过对这些知识点的理解和实践,开发者能够更好地管理和改进自己的应用程序。
2. **日志记录**: 当发生异常时,记录详细的错误信息,包括堆栈跟踪,便于后续调试。 3. **崩溃反馈**: 可以集成第三方服务(如Crashlytics)收集崩溃报告,以便开发者能及时发现和修复问题。 **自动重启应用** 1...
### Android完美退出程序详解 #### 一、引言 在Android开发过程中,有时我们需要实现一个“一键退出”功能,即用户点击某个按钮后能够迅速且干净地关闭整个应用程序。这不仅可以提升用户体验,还能确保程序资源...
在Android应用开发中,异常处理是一项至关重要的任务,它能够确保程序在遇到错误时不会突然崩溃,而是能够优雅地处理并记录错误信息。本篇主要介绍如何实现一个全局的异常处理机制,以便将未处理的异常日志保存到...
在Android平台,nativecrash一直是crash里的大头。nativecrash具有上下文不全、出错信息模糊...在Unix-like系统中,所有的崩溃都是编程错误或者硬件错误相关的,系统遇到不可恢复的错误时会触发崩溃机制让程序退出,如
在Android开发中,全局异常捕获是至关重要的一个环节,它可以帮助开发者在应用程序出现未预期错误时,收集必要的信息并进行处理,防止应用崩溃或提供友好的用户反馈。本篇文章将详细讲解如何在Android中实现全局异常...
这样,当程序中出现未被处理的异常时,这个处理器将被调用,我们可以在这个处理器中记录错误日志、展示错误信息,甚至启动重启应用的逻辑。 2. **Activity管理栈** Activity管理栈是Android系统管理应用程序界面的...
4. 反注册BroadcastReceiver:为了避免内存泄漏,记得在App退出或者不再需要监听状态变化时,使用unregisterReceiver()方法来取消注册BroadcastReceiver。 此外,ActivityMonitor可能还提供了其他辅助方法,比如...