我正在开发一个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);
问题:
- 当系统在进程被终止后重新启动活动时,此意图是什么样子的?它有
Intent.CATEGORY_LAUNCHER
类别吗? - 如果
IntentFilter
只有一个关联的类别(即没有活动类(,它们能工作吗? - 这里还有什么明显的问题吗?我不是最伟大的Android开发人员,所以想在这里学习一些东西。
当系统在进程被终止后重新启动活动时,此意图是什么样子的?
它将与最初用于启动活动的Intent
相同。
它有Intent.CATEGORY_LAUNCHER类别吗?
仅当最初用于启动活动的Intent
具有该类别时。
如果 IntentFilters 只有一个关联的类别(即没有活动类(,它们是否可以工作?
没有。
这里还有什么明显的问题吗?
就问题中显示的代码而言,Instrumentation
由测试使用,而不是由生产应用使用。
Android 将我们直接发送到堆栈顶部的活动,但在这种情况下,我想运行的代码无法运行,这会导致稍后崩溃
然后将该代码放入活动中。或者,将应用设置为支持此内容的延迟初始化。
使事情复杂化的部分是,知道正在启动哪个活动很重要,因为这会改变我们的设置代码的运行方式。
然后将该安装代码放入活动中。或者,将应用设置为支持此内容的延迟初始化。
欢迎您使用类似Application
和onCreate()
的东西进行快速初始化,无论出于何种原因创建您的进程,都应该进行初始化。但是,如果您的活动依赖于特定于该活动的内容,则该逻辑属于该活动(或该活动使用的类,例如ViewModel
(。