前言
相信大家都遇到过测试人员测试的时候一些偶发性的bug导致程序崩溃,实在是难以复现,所以只能通过一遍遍的检查代码然后猜测可能出现问题的代码,非常难受,因为难以复现所以很多时候改完也难以验证,接下来就为大家介绍一个“轮子”,可以帮助我们在程序崩溃的时候跳转到指定页面,并且输出日志,可复制到粘贴板,然后保留下来,有了崩溃日志,问题出在哪儿就好分析啦。

首先肯定是先感谢大神的分享

https://github.com/Ereza/CustomActivityOnCrash

好了接下来就是实现的方法,第一步是导入处理崩溃的依赖

implementation 'cat.ereza:customactivityoncrash:2.3.0'//崩溃处理依赖

然后是在自己的Application中的onCreate()中添加以下代码

@Override
public void onCreate() {super.onCreate();
/**
//此方法定义当应用程序在后台崩溃时是否应启动错误活动。共有三种模式:
//CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM:即使应用程序在后台运行,也会启动错误活动。
//CaocConfig.BACKGROUND_MODE_CRASH:当应用程序在后台运行时,启动默认系统错误。
//CaocConfig.BACKGROUND_MODE_SILENT:当应用程序在后台运行时,它会以静默方式崩溃。
//默认值为CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM。
*/CaocConfig.Builder.create().backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //default: CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM.enabled(false) //是否启用 default: true.showErrorDetails(false) //default: true 隐藏错误活动中的“错误详细信息”按钮.showRestartButton(false) //default: true 是否可以重启页面.logErrorOnRestart(false) //default: true .trackActivities(true) //default: false.minTimeBetweenCrashesMs(2000) //default: 3000.errorDrawable(R.drawable.ic_custom_drawable) //default: bug image.restartActivity(YourCustomActivity.class) //默认程序崩溃时重启的的activity default: null (your app's launch activity).errorActivity(YourCustomErrorActivity.class) //默认程序崩溃时跳转的activity default: null (default error activity).eventListener(new YourCustomEventListener()) //default: null.apply();
}

然后是实现CustomEventListener

class CustomEventListener implements CustomActivityOnCrash.EventListener {@Overridepublic void onLaunchErrorActivity() {Log.i(TAG, "onLaunchErrorActivity()");}@Overridepublic void onRestartAppFromErrorActivity() {Log.i(TAG, "onRestartAppFromErrorActivity()");}@Overridepublic void onCloseAppFromErrorActivity() {Log.i(TAG, "onCloseAppFromErrorActivity()");}}

重启页面就不多介绍了

.restartActivity(YourCustomActivity.class) //默认程序崩溃时重启的的activity default: null (your app's launch activity)

主要介绍一下,崩溃时跳转的页面,然后这个页面UI和流程设计的的好的话,其实还是比较好的,最起码比程序崩溃了闪退就好多了

.errorActivity(YourCustomErrorActivity.class) //默认程序崩溃时跳转的activity default: null (default error activity)

这是我的,因为我只是用作测试阶段的时候供测试人员提供崩溃日志,所以就随便写了;
首先是布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:ignore="MissingDefaultResource"><Viewandroid:id="@+id/V_statusBar"android:layout_width="match_parent"android:layout_height="0dp"android:background="@color/colorPrimary" /><TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@color/colorPrimary"android:gravity="center"android:text="出错啦"android:textColor="#FFFFFF"android:textSize="17sp"android:textStyle="bold" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"><ImageViewandroid:id="@+id/IMG_null"android:layout_width="248dp"android:layout_height="248dp"android:layout_centerInParent="true"android:layout_marginTop="100dp"android:src="@drawable/ic_null_page" /><TextViewandroid:id="@+id/data_null_tip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/IMG_null"android:layout_centerHorizontal="true"android:gravity="center"android:textSize="16dp"android:text="@string/error_occurred"android:textColor="#FFD0DDF8" /><Buttonandroid:id="@+id/restart_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_margin="30dp"android:layout_centerHorizontal="true"android:text="@string/close_app" /><Buttonandroid:id="@+id/more_info_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_margin="30dp"android:layout_centerHorizontal="true"android:text="@string/error_details" /></RelativeLayout>
</LinearLayout>


其中的文字,颜色和图片资源就自己替换一下哈;
加下来就是具体的activity,自定义的内容比较多,懒得一一复赘了,关键代码拷贝下来就可以哈;

public final class DefaultErrorActivity extends BaseActivity<ActivityErrorBinding> {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);viewBinding.VStatusBar.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(this)));QMUIStatusBarHelper.translucent(this);QMUIStatusBarHelper.setStatusBarDarkMode(this);//This is needed to avoid a crash if the developer has not specified//an app-level theme that extends Theme.AppCompatTypedArray a = obtainStyledAttributes(R.styleable.AppCompatTheme);if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {setTheme(R.style.Theme_AppCompat_Light_DarkActionBar);}a.recycle();//Close/restart button logic://If a class if set, use restart.//Else, use close and just finish the app.//It is recommended that you follow this logic if implementing a custom error activity.Button restartButton = viewBinding.restartButton;final CaocConfig config = CustomActivityOnCrash.getConfigFromIntent(getIntent());if (config == null) {//This should never happen - Just finish the activity to avoid a recursive crash.finish();return;}if (config.isShowRestartButton() && config.getRestartActivityClass() != null) {restartButton.setText(R.string.restart_app);restartButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {CustomActivityOnCrash.restartApplication(DefaultErrorActivity.this, config);}});} else {restartButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {CustomActivityOnCrash.closeApplication(DefaultErrorActivity.this, config);}});}Button moreInfoButton = viewBinding.moreInfoButton;if (config.isShowErrorDetails()) {moreInfoButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//We retrieve all the error data and show itAlertDialog dialog = new AlertDialog.Builder(DefaultErrorActivity.this).setTitle(R.string.error_details).setMessage(CustomActivityOnCrash.getAllErrorDetailsFromIntent(DefaultErrorActivity.this, getIntent())).setPositiveButton(R.string.customactivityoncrash_error_activity_error_details_close, null).setNeutralButton(R.string.customactivityoncrash_error_activity_error_details_copy,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {copyErrorToClipboard();}}).show();TextView textView = dialog.findViewById(android.R.id.message);if (textView != null) {textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.error_details_text_size));}}});} else {moreInfoButton.setVisibility(View.GONE);}Integer defaultErrorActivityDrawableId = config.getErrorDrawable();ImageView errorImageView = findViewById(R.id.customactivityoncrash_error_activity_image);if (defaultErrorActivityDrawableId != null) {errorImageView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), defaultErrorActivityDrawableId, getTheme()));}}private void copyErrorToClipboard() {String errorInformation = CustomActivityOnCrash.getAllErrorDetailsFromIntent(DefaultErrorActivity.this, getIntent());ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);//Are there any devices without clipboard...?if (clipboard != null) {ClipData clip = ClipData.newPlainText(getString(R.string.customactivityoncrash_error_activity_error_details_clipboard_label), errorInformation);clipboard.setPrimaryClip(clip);Toast.makeText(DefaultErrorActivity.this, R.string.customactivityoncrash_error_activity_error_details_copied, Toast.LENGTH_SHORT).show();}}
}

最后,别忘了在AndroidManifest.xml中添加自己的Application文件名

<applicationandroid:name=".Application"...

至此就可以了,程序遇到崩溃时就会自动跳转到自己定义的界面,和输出日志啦;

再次感谢分享,也可以查看原分享者的详细介绍

https://github.com/Ereza/CustomActivityOnCrash

Android程序崩溃处理相关推荐

  1. android查找邮件程序,Android 程序崩溃日志邮件获取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没 ...

  2. android+程序崩溃,Android平台程序崩溃的类型及原因列举

    Android平台程序崩溃大家都应该遇到过,force close和ANR应该是大家遇到较多的. 这里把Android平台程序崩溃的各种类型做一个简述和原因列举. 1.ANR(可见ANR): 发生场景 ...

  3. android 程序崩溃处理,Android应用崩溃的应急处理

    在我们开发Android应用程序的时候总是难免遇到程序崩溃的问题:(很抱歉,"××"已停止运行.) 每次看到这个问题心都是哇凉哇凉的 一般遇到这样问题,有两种可能: 1.自己的代码 ...

  4. qt调试android程序崩溃,使用qt5开发的Android应用程序合并了AWS C++库崩溃

    我想开发一种 Android应用程序 它在行刑一开始就崩溃了. 我在用 第5.11节 我认为配置很好(我正在使用 上一个Android SDK和ndk10e )因为我可以运行一个简单的Android应 ...

  5. android程序崩溃后重启

    有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...

  6. android 程序崩溃日记捕捉

    1.重新UncaughtExceptionHandler public class CrashHandler implements Thread.UncaughtExceptionHandler {p ...

  7. android程序崩溃后,在appuard混淆之后,Android应用程序崩溃了

    我在我的应用程序上运行了proguard工具来进行混淆.我知道,当混淆发生时,proguard会缩小并优化应用程序.因此,在混淆应用程序正确打开后,然后当我尝试登录时崩溃.我得到的最好的是这个日志,因 ...

  8. android 程序崩溃后自动重启,Android 应用Crash 后自动重启的方法小结

    前提 首先,我们肯定要在Application里面注册一个CrashHandler,监听应用crash public class TestApplication extends MultiDexApp ...

  9. android 程序崩溃后自动重启,【Android】App应用崩溃(Crash/Force Close)之后如何让它自动重启?...

    英文原文: Auto Restart application after Crash/Force Close in Android. 手机上的Android应用,经常会出现"Force Cl ...

  10. android程序崩溃了却没法通过log查看错误日志

    接一个bugly就可以了,在bugly上直接查看错误信息. BUGLY的文档写的很清楚,流程我就不写了,附上链接: https://cas.bugly.qq.com/cas/login?service ...

最新文章

  1. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
  2. Linux 内核源代码分析 chap 2 存储管理 (5)
  3. PHP不能精确表达小数 PHP除法结果不准确 php 为什么数字除法不准确 PHP浮点数运算不准确的问题...
  4. 【AI不惑境】学习率和batchsize如何影响模型的性能?
  5. 朱峰谈概念设计(四):游戏和电影的不同
  6. animation停留_这些Animation动画技巧与细节你知道么
  7. Orchard Core一分钟搭建ASP.NET Core CMS
  8. C++11新特性之智能指针
  9. phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇
  10. qwidget show 是否有信号_c++笔记(信号集处理函数)
  11. Cookie介绍与操作
  12. js之类 面向对象的书写方式(详细篇)
  13. 小猫跳圈-第12届蓝桥杯Scratch省赛3真题第1题
  14. 有源反射系数与有源驻波比测试方法
  15. RPS基准点系统 2020
  16. 三星android怎么解锁屏幕旋转,三星S10如何设置打开应用自动旋转屏幕
  17. 单片机驱动为什么要设置为低电平有效?
  18. 3.4.3 区域与图像的平均灰度值
  19. 329 矩阵中的最长递增路径
  20. Python模拟post提交表单数据 ——某二手车网站回拨电话的分析与利用

热门文章

  1. burst.网络_使用Burst Compiler 1.3优化项目
  2. 【Monte Carlo】一种器件参数变化分析
  3. OpenNLP进行中文命名实体识别(上:预处理及训练模型)
  4. Sklearn聚类算法之Affinity Propagation
  5. Exif的Orientation信息说明
  6. android java char_Android句子迷客户端
  7. .wav音乐文件转换为.fft.npy频谱格式文件
  8. (转自)何新:谈“玄”(二)
  9. 关于谷哥传奇工程师Jeff Dean的笑话
  10. 一起学习Spring boot 2.1.X | 第十五篇:登陆拦截器