【发布时间】:2017-02-15 05:19:16
【问题描述】:
在我的 Android 应用中,我有两个活动:
-
DemoActivity带有一个按钮以启动SearchActivity和Intent SearchActivity
按钮是一个自定义的ViewGroup:
SearchButton
一旦SearchButton 生效,它就会注册生命周期事件(对应的SearchActivity):
public class SearchButton extends CardView implements
Application.ActivityLifecycleCallbacks {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Context applicationContext = getContext().getApplicationContext();
if (applicationContext instanceof Application) {
((Application) applicationContext)
.registerActivityLifecycleCallbacks(this);
}
}
// ...
事件的消费方式如下:
// ...
@Override
public void onActivityStarted(Activity activity) {
if (activity instanceof SearchActivity) {
SearchActivity searchActivity = (SearchActivity) activity;
searchActivity.addSomeListener(someListener);
}
}
@Override
public void onActivityStopped(Activity activity) {
if (activity instanceof SearchActivity) {
SearchActivity searchActivity = (SearchActivity) activity;
searchActivity.removeSomeListener(someListener);
}
}
SearchActivity 启动后,我将应用程序置于后台,然后将其重新置于前台。可以看到如下调用栈:
1. SearchButton.onActivityStarted // triggered by DemoActivity
2. DemoActivity.onStart
3. SearchButton.onActivityStarted // triggered by SearchActivity
4. SearchActivity.addSomeListener
5. SearchActivity.onStart
如您所见,添加了侦听器。这很好用。
问题
一旦我在开发者选项中启用Don't keep activities,当我再次进入应用程序前台时,调用堆栈将如下所示:
1. DemoActivity.onCreate
2. SearchButton.init // Constructor
3. DemoActivity.onStart
4. SearchActivity.onStart
5. SearchButton.onAttachedToWindow
6. DemoApplication.registerActivityLifecycleCallbacks
这里的监听器没有添加。由SearchActivity.onStart 触发的所需onActivityStarted 回调缺失。
【问题讨论】:
-
显然因为
DemoActivity中的SearchButton从未附加到窗口,因为(如果我确实了解发生了什么)DemoActivity位于“下方”SearchActivity(就活动堆栈而言) ……还有你为什么要为此烦恼?在这种情况下,DemoActivity无论如何都处于停止状态 -
永远不会错。在这种情况下,对
onAttachToWindow的调用只是在onStart之后发生,这会导致问题。 -
老实说,您无法理解您发布的代码会发生什么。甚至调用堆栈对我来说也不够清楚(什么是 DemoApplication?)。您应该发布更多代码和您执行的步骤以重现此行为:当您启用“不保留活动”标志时,您将应用程序从最近的应用程序列表中移到前台,还是单击应用程序图标?跨度>
标签: android android-activity callback activity-lifecycle