📜  Android应用程序退出的原因是什么?

📅  最后修改于: 2022-05-13 01:58:45.021000             🧑  作者: Mango

Android应用程序退出的原因是什么?

开发 Android 应用程序可能是一项乏味的工作,如果我们的应用程序在不知不觉中退出,也会令人沮丧!为了在 Android 中记录退出,我们依赖于许多第三方库。使用 Android R,我们现在可以在我们的应用程序中记录退出,这可以帮助我们解决可能出现的任何问题。在这篇 Geeks for Geeks 文章中,我们将讨论如何记录用户从应用程序中的退出。让我们从讨论我们的应用程序中可能发生的不同类型的崩溃和退出开始。由于异常可能会导致崩溃,或者可能存在导致您的应用崩溃并退出用户的 ANR。用户也可以在使用完毕后故意退出应用程序。

考虑以下场景:我们正在使用 WhatsApp,并希望记录用户退出应用程序时发生的所有操作。它可能是崩溃或异常,也可能是用户退出应用程序的操作。因此,为了获取所有信息,我们将使用 ActivityManager。但首先,

ActivityManager 到底是什么?

ActivityManager 提供有关活动、服务和包含流程的信息,并与它们进行交互。此类的方法为我们提供了可用于调试应用程序的信息。

Kotlin
class gfgActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.gfg_main_act)
    }
}


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


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


Kotlin
Log.i(TAG, "Exit Reason: ${lastExitInformation.reason}")
Log.i(TAG, "Time of Exit: ${lastExitInformation.timestamp}")
lastExitInformation.description?.let {
    Log.i(TAG, "Some Vague Desc: ${it}")
}


然后初始化活动,我们:

科特林

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

现在我们仔细研究以下参数以获得更好的见解:

  1. getHistoricalProcessExitReasons:在这种情况下采用三个参数,
  2. 包名我们在这里传递了应用程序PID的包名:我们使用0作为默认值来获取所有原因。
  3. 退出原因列表的长度。结果,我们将在 ApplicationExitInfo 类型列表中获得单个项目。

由于它提供历史数据,gfgList 实时返回退出历史而不是退出信息。让我们首先配置 gfgitList 以返回我们崩溃的原因和原因。

科特林

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

gfgList 实时返回退出历史而不是退出信息,因为它提供了历史数据。首先,配置 gfgList 以返回我们崩溃的原因和原因。

在我们的 onCreate()函数中包含以下代码:

科特林

Log.i(TAG, "Exit Reason: ${lastExitInformation.reason}")
Log.i(TAG, "Time of Exit: ${lastExitInformation.timestamp}")
lastExitInformation.description?.let {
    Log.i(TAG, "Some Vague Desc: ${it}")
}

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

gfgActivity: Exit Reason: 10
gfgActivity: Time of Exit: 732973191
gfgActivity: Some Vague Desc: removed task

这里,原因代码 10 表示原因用户请求。我们还在日志中收到了时间戳,以及删除任务的描述,因为我们从最近的应用程序托盘中删除了该应用程序。

案例 2:当我们的应用程序崩溃时。所以,首先,让我们为我们的应用程序添加一个崩溃

我们将用它制作一个按钮,当点击 textView 时:

lateinit var myGfgButton: Button

我们将调用按钮的点击监听器,如下所示。这将导致我们的应用程序崩溃,因为该按钮未映射到 XML 中的任何小部件。

gfgTextView.setOnClickListener {
    myGfgButton.setOnClickListener {  }
}

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

MainActivity: Exit Reason: 14
MainActivity: Time of Exit: 2371217628126
MainActivity: Some Vague Desc: crash

原因码为4,对应上表的REASON CRASH,描述中还包含crash一词。

案例 3:让我们使用 System 来终止 JVM。出口()

因此,当我们单击 textView 时,我们将添加 System.

像退出(),

gfgTextView.setOnClickListener {
    System.exit(0)
}

该应用程序将因此操作而终止。当我们重新打开应用程序时,它会生成一个如下所示的日志:

MainActivity: Exit Reason: 1
MainActivity: Time of Exit: 92738172192

此处不做说明,但原因码为1,对应REASON EXIT SELF。这意味着它自毁。

案例4:当我们的申请被拒绝时

因此,要生成 ANR,我们将在 textView 点击时运行一个无限循环,使用,

gfgTextView.setOnClickListener {
    var spandan = 0
    while (true) {
        spandan++
    }
}

因此,如果应用收到 ANR,生成的日志将是,

MainActivity: Exit Reason: 6
MainActivity: Time of Exit: 27162871216

在这种情况下,原因码是 6,代表 REASON ANR。这些是我们可以记录应用程序退出的一些示例。

结论

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