在Android应用程序中查找退出的原因

Android ANR介绍诊断和解决 如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误。如果应用位于前台,系统会向用户显示一个对话框,如图 1 所示。ANR 对话框会为用户提供强制退出应用的选项。向用户显示的 ANR 对话框ANR 是一个问题,因为负责更新界面的应用主线程无法处理用户输入事件或绘制操作,这会引起用户的不满。如需详细了解应用的主线程,请参阅。如果您的应用遇到 ANR 错误,您可以使用本文中的指南来诊断和解决问题。 阅读详情

前言

在使用 Android 应用程序时,我们可能必须留意崩溃或用户退出应用程序的不必要方式。我们使用许多第三方库来记录 android 中的退出。

现在,使用Android R,我们可以在应用中记录退出,这可以帮助我们解决应用中可能存在的任何问题。

在这篇博客中,我们将讨论如何从应用程序中记录用户的退出。

让我们首先讨论我们可能在应用程序中看到的崩溃和退出的类型。异常可能会导致崩溃,或者可能存在 ANR,这可能会导致您的应用程序崩溃并使用户退出应用程序。用户也可能在完成使用应用程序后有意退出应用程序。

举个例子,假设我们正在使用 WhatsApp,并且我们希望在用户退出应用程序时记录所有操作。它可能是崩溃或异常,也可能是用户关闭应用程序的操作。

因此,要获取所有信息,我们将使用ActivityManager.

但在那之前,

什么是活动管理器?

ActivityManager 提供有关活动、服务和包含过程的信息并与之交互。此类中的方法为我们提供了可用于调试应用程序的某些信息。

因此,首先,我将使用 MainActivity 创建一个项目,例如,

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

现在,我们将初始化ActivityManager类似,

val am = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

现在,我们将使用ActivityManager来获取应用程序的历史退出原因列表。要获取列表,我们将使用,

val exitList = am.getHistoricalProcessExitReasons(applicationContext.packageName, 0, 1)

这里,getHistoricalProcessExitReasons接受三个参数,

  • Package name:在这里,我们传递了我们应用程序的包名
  • PID:我们默认通过 0 来获取所有原因
  • Size:退出原因列表的大小。因此,我们将得到一个只有一项的 ApplicationExitInfo 类型的列表。

这里exitList返回的是退出历史,而不是实时的退出信息,因为它提供了历史数据。

现在,让我们首先设置exitList来返回我们崩溃的原因和原因。

在我们的onCreate()中,我将添加,

if (exitList.isNotEmpty()) {
    val lastExitInformation: ApplicationExitInfo = exitList.first()
}

由于列表中只有一项,lastExitInformation 将使用从列表中获取值.first()

现在,我们将使用记录退出原因、时间和描述,

Log.d(TAG, "Reason: ${lastExitInformation.reason}")

Log.d(TAG, "Timestamp: ${lastExitInformation.timestamp}")

lastExitInformation.description?.let {
    Log.d(TAG, "Description: ${it}")
}

这里

  • lastExitInformation将返回一个与崩溃原因相对应的整数
  • 时间戳返回时代中的时间,并且,
  • 描述返回崩溃的描述性版本。

现在,让我们在 XML 文件中添加一个 TextView,例如

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/textView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

并使用 textView 设置崩溃的原因,

textView.text = lastExitInformation.reason.toString()

我们已经完成了所有设置以获取历史退出原因。现在,让我们开始记录原因。

案例1:

当我们从最近的应用程序托盘中关闭应用程序然后再次重新打开应用程序时,我们会看到以下日志,

MainActivity: Reason: 10
MainActivity: Timestamp: 1589626919924
MainActivity: Description: remove task

这里

  • 原因代码是 10,这意味着REASON_USER_REQUESTED。
  • 我们的日志中也有时间戳,
  • 我们得到的描述是删除任务,因为我们从最近的应用程序托盘中删除了该应用程序。

我们还可以在textView.

原因码及其含义是

const val REASON_ANR = 6
const val REASON_CRASH = 4
const val REASON_CRASH_NATIVE = 5
const val REASON_DEPENDENCY_DIED = 12
const val REASON_EXCESSIVE_RESOURCE_USAGE = 9
const val REASON_EXIT_SELF = 1
const val REASON_INITIALIZATION_FAILURE = 7
const val REASON_LOW_MEMORY = 3
const val REASON_OTHER = 13
const val REASON_PERMISSION_CHANGE = 8
const val REASON_SIGNALED = 2
const val REASON_UNKNOWN = 0
const val REASON_USER_REQUESTED = 10
const val REASON_USER_STOPPED = 11

因此,例如,如果我们遇到崩溃,根据上表,原因代码将为 4。

案例2:

当我们的应用程序崩溃时。所以,首先,让我们在我们的应用程序中引入一个崩溃。我们将使用创建一个按钮,

lateinit var button: Button

在点击 textView 时,我们将调用按钮的点击监听器,例如,

textView.setOnClickListener {
    button.setOnClickListener {  }
}

这将导致我们的应用程序崩溃,因为该按钮未映射到 XML 中的任何小部件。

当我们再次重新打开应用程序时,应用程序会生成一个日志,

MainActivity: Reason: 14
MainActivity: Timestamp: 1589627622761
MainActivity: Description: crash

这里的原因码是4,对应上表中的REASON_CRASH,描述中也指定了crash。

如果也发生任何异常,原因代码将是REASON_CRASH

案例3:

让我们使用 System.exit() 终止 JVM。

因此,在点击 textView 时,我们将添加System.exit() 之类的,

textView.setOnClickListener {
    System.exit(0)
}

这将终止应用程序。当我们重新打开应用程序时,它会生成一个日志,例如,

MainActivity: Reason: 1
MainActivity: Timestamp: 1589627880910

在这里,我们不会看到任何描述,但原因代码是 1,它映射到REASON_EXIT_SELF。这意味着它自己终止了。

案例4:

当我们的应用程序获得 ANR 时。
因此,要生成 ANR,我们将在单击 textView 时运行无限循环,使用:

textView.setOnClickListener {
    var a = 0
    while (true) {
        a++
    }
}

因此,当 App 获得 ANR 时,生成的日志将是,

MainActivity: Reason: 6
MainActivity: Timestamp: 1589628198405

这里,原因码是 6,表示REASON_ANR。

这些是我们可以从应用程序中记录退出的几种情况。

在本文章中,我们使用最大大小为 1。如果我们将其更改为大于 1 的任何数字,假设可能是 10。它将返回最后 10 个退出原因信息的列表。要将最大大小设置为 10,我们更新代码,

val exitList = am.getHistoricalProcessExitReasons(applicationContext.packageName, 0, 10)

这就是我们可以getHistoricalProcessExitReasons用来获取应用程序退出原因的方法,这对于开发人员了解用户使用应用程序的行为或检查崩溃可能非常有用。

LPDDR4协议规范之 (四)命令和时序 LPDDR4协议规范之 (四)命令和时序命令真值表激活操作读写访问操作读前沿和后沿突发读取操作流程读操作时序写前沿和后沿突发写操作写入均衡(待更新) 命令真值表 激活操作 ACTIVATE命令由两个连续命令组成,Activate-1命令和Activate-2。通过在(Activate-1)时钟的第一个上升沿保持CS HIGH,CA0 HIGH和CA1 LOW来发出Activate-1命令,通过... 阅读详情

相关推荐

echarts实现折线图上下限区域展示

效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、

小太阳的博客 1万+

android T 前台Service

https://developer.android.com/about/versions/13/get 用户控制: 用户在长时间运行的应用程序上获得更多透明度和控制权: 前台服务仍然需要包含通知,并且应用程序必须请求权限才能显示通知。 FGS 通知现在可以被用户关闭而不影响 FGS 用户可以在任务管理器中查看长时间运行的应用列表 任务管理器还允许用户停止应用程序 通知权限 介绍 https://developer.android.com/reference/android/Manifest.

xiaoyantan的博客 2920

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2462

Android BugReport异常快速排查手册

阅读错误报告 无论是任何类型的开发工作,出错都在所难免,而错误报告对于找出和解决问题至关重要。Android 的所有版本都支持通过 Android 调试桥 (adb) 获取错误报告;Android 4.2 及更高版本支持一个旨在获取错误报告以及通过电子邮件、云端硬盘等分享报告的开发者选项。 Android 错误报告中包含文本 (.txt) 格式的 dumpsys、dumpstate 和 logcat 数据,以便您轻松搜索特定内容。以下各部分详细说明了错误报告的组成部分、介绍了常见问题,并提供了关于查找与这些

zhonglunshun的专栏 1万+

爆改YOLOv8 | PSA注意力机制融合入YOLOv8

yolov8,PSA注意力,即插即用

weixin_43986124的博客 2498

FPGA 高速接口Aurora8B/10B 协议详解与仿真

Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可扩展轻量级链路层协议,为板对板、芯片对芯片以及一些单向链接提供低成本低资源的解决方案。信号源信号描述ref_clk时钟源GT的外部时钟INIT CLK时钟源全局复位,低电平有效DRP CLK时钟源DRP时钟,动态重配置时钟时钟源用户传输的数据钟及逻辑时钟域。

toonyhe的博客 3999

android 11 新功能 抢先体验

新功能和API 应用进程退出原因 获取应用近期任何进程终止原因 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ApplicationExitInfo> list = activityManager.getHistoricalProcessExitReasons(getPackageName(), 0, 5); Log.d(TAG, "

johndon_forever的博客 1982

idea出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005) 的解决方法

idea启动的时候出现如下问题,以为没啥事,就索性关闭 后面再打开idea的时候发现直接闪退,之后打开其他软件,直接蓝屏

码农研究僧的博客 4817

适配Android11——Android 11新增api:私密数据OnOpNotedCallback与退出原因getHistoricalProcessExitReasons介绍

Android 11新api—使应用程序更私密稳定 作为谷歌不断努力帮助您构建高质量应用程序的一部分,谷歌经常寻找可以在其上投资的工具和资源领域,这些信息可以使您更好地了解应用程序的性能。 大新闻 在Android 11中,谷歌引入了两个新工具:数据访问审核API和流程退出原因,以使您对私有数据访问和流程退出的原因更加透明。 数据访问审核API Android鼓励开发人员谨慎敏感地访问敏感数据。在Android 11中,您将可以访问新的API,从而使您对使用私有数据和受保护数据更加透明。例如,这对于可能具有

太书红叶的博客 4157

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5866

YOLO系列算法改进 | C2PSA改进篇 | 融合BinaryAttention二值化注意力 | 轻量化与效率双提升,适用于高分辨率图像检测与边缘部署场景 | CVPR 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合BinaryAttention二值化注意力 | 轻量化与效率双提升,适用于高分辨率图像检测与边缘部署场景 | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_BinaryAttention创新模块进行改进)

2502_91881744的博客 165

android中点击按钮退出应用程序,Android实现长按back键退出应用程序的方法

本文实例讲述了Android实现长按back键退出应用程序的方法。分享给大家供大家参考。具体分析如下:最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单:@Overridepu...

weixin_34086714的博客 1005

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android一键退出整个应用程序

之前做FM时

易辰Android 3493

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 应用强制退出_应用程序卡住了,该怎么强制退出?

我们在使用Mac的时候,Mac OS系统虽然非常稳定,但有时候也会受到不良APP影响,或者软件与系统不兼容等等,难免会遇到程序卡住。这个时候我们就需要强制退出这个程序了,下面由小编为你带来在Mac OS里强制退出应用程序的六种方法使用键盘快捷键强制退出处于活跃状态的Mac程序:快捷键:Command+Option+Shift+Esc这样按住一两秒钟,就可以强制退出当前程序了,算是最方便的一种方法。...

weixin_42297714的博客 1867

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android开发之应用程序如何完全退出

一步两步,是帅哥的步伐,是帅哥的成长!

ZaneLove's blog 1125

unity android点击返回键,Unity3D-实现连续点击两次返回键退出游戏(安卓/IOS)

Unity3D-连续点击两次返回键退出游戏本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)1Count Down —— 倒计时在 Update() 中直接调用 EixtDetection()using UnityEngine;/// /// 一个测试倒计时的类/// public class TestCo...

weixin_32506743的博客 1471

Android 关于长按back键退出应用程序的实现

                Android 关于长按back键退出应用程序的实现      最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单: //代码来自:ht...

weixin_33882452的博客 272

android退出应用方法_在Mac OS里强制退出应用程序的六种方法

我们在使用Mac的时候,Mac OS系统虽然非常稳定,但有时候也会受到不良APP影响,或者软件与系统不兼容等等,难免会遇到程序卡住。这个时候我们就需要强制退出这个程序了,下面由小编为你带来在Mac OS里强制退出应用程序的六种方法使用键盘快捷键强制退出处于活跃状态的Mac程序快捷键:Command+Option+Shift+Esc这样按住一两秒钟,就可以强制退出当前程序了,算是最方便的一种方法。打...

weixin_39880490的博客 250

一起Talk Android吧(第三百零一回:如何正确地退出应用程序)

各位看官们,大家好,上一回中咱们说的是Android中修改应用程序包名的例子,这一回咱们说的例子是如何正确地退出应用程序。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,程序中有一个常见的操作是快速按下两次返回键退出当前程序,判断返回键被按下两次的方法比较多,这里不做介绍,大家自行去查找,把此方法添加到onBackPressed()方法中就可以了,最重要的是如何退出应用程序,大家常用的方法是使用finish()方法结束Activity,其实此无法退出程序,另外一种方法是使用Syst..

talk_8的专栏 481

Android实现点击两次退出APP

原文地址: Android实现点击两次退出APP Android 监听返回键退出程序的两种实现 这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客。 这里我主要以我的项目为例,实现了登录界面,注册界面,在登录界面登录成功则跳转到主界面上,而主界面点击退出回到了登录界面,这显然是不合理的...

lwh156541064的博客 600

Android 程序完全退出的几种方式

最近做一个即时通讯项目,在做退出功能的时候,才发现自己不知不觉纠结了半天时间,查找各种资料,使出各种招,没有使程序完全退出,要么Service还在后台跑着,要么只是退出当前Activity,也是醉了. 如果想退出Android程序,找到了一些方法: Dalvik VM的本地方法: android.os.Process.killProcess(android.os.Process.myPid())

qq_16051379的博客 743

android强制退出应用_如何在Windows 10上强制退出应用

android强制退出应用It’s not uncommon for an application to stop responding on Windows 10. When it happens, you can force the app to shut down, effectively unfreezing said application. Here’s how to force qu...

culul01313的博客 1122
上一篇: 【Android】在 Flutter 中使用 WebView
下一篇: Android 中的 Canvas API
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值