当前位置:   article > 正文

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

android exit_self

前言

在使用 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)
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

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

这里,getHistoricalProcessExitReasons接受三个参数,

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

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

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

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

if (exitList.isNotEmpty()) {
    val lastExitInformation: ApplicationExitInfo = exitList.first()
}
  • 1
  • 2
  • 3

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

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

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

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

lastExitInformation.description?.let {
    Log.d(TAG, "Description: ${it}")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里

  • 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

textView.text = lastExitInformation.reason.toString()
  • 1

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

案例1:

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

MainActivity: Reason: 10
MainActivity: Timestamp: 1589626919924
MainActivity: Description: remove task
  • 1
  • 2
  • 3

这里

  • 原因代码是 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

案例2:

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

lateinit var button: Button
  • 1

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

textView.setOnClickListener {
    button.setOnClickListener {  }
}
  • 1
  • 2
  • 3

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

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

MainActivity: Reason: 14
MainActivity: Timestamp: 1589627622761
MainActivity: Description: crash
  • 1
  • 2
  • 3

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

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

案例3:

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

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

textView.setOnClickListener {
    System.exit(0)
}
  • 1
  • 2
  • 3

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

MainActivity: Reason: 1
MainActivity: Timestamp: 1589627880910
  • 1
  • 2

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

案例4:

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

textView.setOnClickListener {
    var a = 0
    while (true) {
        a++
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

MainActivity: Reason: 6
MainActivity: Timestamp: 1589628198405
  • 1
  • 2

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/245472
推荐阅读
相关标签
  

闽ICP备14008679号