【问题标题】:Activity sopped when should be started应开始的活动停止
【发布时间】:2016-11-08 08:53:37
【问题描述】:

我从服务创建通知。此通知包含创建活动 A 的意图:

...
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
...

而活动A,当接收到意图时,使用相同的标志创建活动B

问题是:当我目前什么都不显示(应用程序已关闭或在后台)时,它可以工作。当我点击通知并且当前显示活动 A 时,它也可以工作,并且我有这个跟踪:

onActivityPaused(com.*****.A)
onActivityCreated(com..*****.A)
onActivityStarted(com..*****.A)
onActivityResumed(com..*****.A)
onActivityPaused(com..*****.A)
onActivityCreated(com..*****.B)
onActivityStarted(com..*****.B)
onActivityResumed(com..*****.B)
onActivityStopped(com..*****.A)
onActivityDestroyed(com..*****.A)
onActivityStopped(com..*****.A)

(有些奇怪,因为 A 停止了两次,而我的标志 FLAG_ACTIVITY_CLEAR_TOP 不应该重新创建一个新标志?)

但是当我当前显示活动 B 时,它会启动然后停止并销毁......我不明白为什么,我需要这个活动才能(重新)开始。这里的痕迹:

onActivityPaused(com.*****.B)         ? Why existing B is not destroyed ?
onActivityDestroyed(com.*****.A)
onActivityCreated(com.*****.A)
onActivityStarted(com.*****.A)
onActivityResumed(com.*****.A)
onActivityPaused(com.*****.A)
onActivityCreated(com.*****.B)
onActivityStarted(com.*****.B)
onActivityResumed(com.*****.B)
onActivityStopped(com.*****.B)        ??
onActivityDestroyed(com.*****.B)      ??
onActivityStopped(com.*****.A)

我忘记了什么?

编辑:

我的清单是:

    <activity
        android:name="com.*****.A"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.*****.B"
        android:launchMode="singleTop" //Try just now with this line, should I keep it?
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    </activity>

【问题讨论】:

  • 请发布您的清单

标签: android android-intent android-activity android-notifications


【解决方案1】:

如果您使用Intent.FLAG_ACTIVITY_CLEAR_TOP,并且堆栈中已经有目标Activity 的现有实例,则默认行为是从最顶部的Activity 清除(完成)堆栈中的所有活动返回到并包含目标Activity,然后创建目标Activity 的新实例。在这种情况下,新的Intent 将被传递到新实例的onCreate()

如果您不希望重新创建目标Activity,则需要将Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_SINGLE_TOP 组合在一起,或者您需要将目标ActivitylaunchMode="singleTop" in the manifest. In this case, the newIntentwill be delivered toonNewIntent( )` 的现有实例。

【讨论】:

  • 感谢您的回答。 onNewIntent 永远不会为活动 B 调用。在我的通知中,我使用Intent.FLAG_ACTIVITY_CLEAR_TOP 启动活动A,在活动A 中,使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP 启动活动B(我添加了android:launchMode="singleTop" 也在活动 B 的清单中),但它不起作用,onNewIntent() 永远不会为 B 调用
  • 当您从ActivityA 启动ActivityB 时堆栈中不存在它,因此Android 会创建一个ActivityB 的新实例。在这种情况下它不会调用onNewIntent()
  • 为什么使用这些标志从ActivityA 启动ActivityB?你想做什么?
  • 好的,我明白了。问题是,我想在点击通知时启动Activity B,但我想在退出Activity B 时回到Activity A。最好的方法是什么?
  • 换句话说,我的通知如何在Activity B 中启动Activity BonBackPress 创建/重用Activity A
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多