Android - 拦截被 LMK 杀死后发起活动的意图的最佳方法是什么?



我正在开发一个Android应用程序,我想在应用程序启动期间运行一些代码,特别是在我们直接启动活动的情况下。

我们看到的问题似乎是在LMK终止我们应用程序的进程时发生的;当用户重新启动应用程序时,Android将我们直接发送到堆栈顶部的活动,但是在这种情况下,我想要运行的代码没有运行,这会导致以后崩溃。

使事情复杂化的部分是,知道正在启动哪个活动很重要,因为这会改变我们的设置代码的运行方式。

我正在四处走动并试图设置一个ActivityMonitor(文档(,但它没有被解雇。实际初始化此监视器并将其添加到检测的代码确实会执行,但永远不会调用onStartActivity回调。

我做了以下工作:

Instrumentation instrumentation = getInstrumentation();
IntentFilter filter = new IntentFilter();
filter.addCategory(Intent.CATEGORY_LAUNCHER);
ActivityMonitor monitor =
new Instrumentation.ActivityMonitor(filter, null, true) {
@Override
public Instrumentation.ActivityResult onStartActivity(Intent intent) {
// Get name of activity to be launched
// Run set up code
startActivity(intent);
return new Instrumentation.ActivityResult(0, null);
}
};
instrumentation.addMonitor(monitor);

问题:

  1. 当系统在进程被终止后重新启动活动时,此意图是什么样子的?它有Intent.CATEGORY_LAUNCHER类别吗?
  2. 如果IntentFilter只有一个关联的类别(即没有活动类(,它们能工作吗?
  3. 这里还有什么明显的问题吗?我不是最伟大的Android开发人员,所以想在这里学习一些东西。

当系统在进程被终止后重新启动活动时,此意图是什么样子的?

它将与最初用于启动活动的Intent相同。

它有Intent.CATEGORY_LAUNCHER类别吗?

仅当最初用于启动活动的Intent具有该类别时。

如果 IntentFilters 只有一个关联的类别(即没有活动类(,它们是否可以工作?

没有。

这里还有什么明显的问题吗?

就问题中显示的代码而言,Instrumentation由测试使用,而不是由生产应用使用。

Android 将我们直接发送到堆栈顶部的活动,但在这种情况下,我想运行的代码无法运行,这会导致稍后崩溃

然后将该代码放入活动中。或者,将应用设置为支持此内容的延迟初始化。

使事情复杂化的部分是,知道正在启动哪个活动很重要,因为这会改变我们的设置代码的运行方式。

然后将该安装代码放入活动中。或者,将应用设置为支持此内容的延迟初始化。

欢迎您使用类似ApplicationonCreate()的东西进行快速初始化,无论出于何种原因创建您的进程,都应该进行初始化。但是,如果您的活动依赖于特定于该活动的内容,则该逻辑属于该活动(或该活动使用的类,例如ViewModel(。

最新更新