【问题标题】:delete activity from recent, when the application is running当应用程序运行时,从最近删除活动
【发布时间】:2015-02-08 22:31:26
【问题描述】:

当活动已经在运行时,我会打开标志 noHistoryexcludeFromRecents。 例如,当谷歌浏览器以隐身模式打开时会生成通知, 当您单击它时,它会消除堆栈的所有活动并从最近删除。我想用我的应用程序的一些活动来做这样的事情。

编辑: David Wasser 提出的解决方案可行,但我的问题有点复杂。 这是我的 manifest.xml

...
    <activity
        android:name=".ActivityRecive"
        android:excludeFromRecents="true"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SEND_MULTIPLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
            <data android:mimeType="video/*" />
        </intent-filter>            
    </activity>



    <activity
        android:name=".ActivityPasswordToIncognito">
    </activity>
    <activity
        android:name=".ActivityIncognitoMode1">
    </activity>
    <activity
        android:name=".ActivityIncognitoMode2">
    </activity>
    <activity
        android:name=".ActivityIncognitoMode3"
    </activity>
...

ActivityRecive:作为意图的结果开始。我希望将此活动从堆栈中排除并从最近排除。 ActivityRecive 可以启动 ActivityPasswordToIncognito。

ActivityPasswordToIncognito:“正常”活动。 ActivityPasswordToIncognito 可以启动 ActivityIncognitoMode(X)。

ActivityIncognitoMode(X):他们可以启动 ActivityIncognitoMode(x+1),我希望在用户退出隐身模式时从最近和堆栈中删除。

问题是根Activity(ActivityRecive)使用了android:excludeFromRecents="true",那么task中的所有activity都从recent中排除。我曾尝试使用 FLAG_ACTIVITY_NEW_TASK 启动 ActivityPasswordToIncognito,但不起作用。

【问题讨论】:

  • 你试过什么?你看到的行为是什么?什么不工作?更具体。
  • @DavidWasser 我想在活动已经运行时模拟标志 noHistory 和 excludeFromRecents 的操作。据我所知,完成()活动。但这不会从最近删除,如果它是堆栈的最后一个,则会重新创建。对不起我的英语。

标签: android android-activity activity-lifecycle


【解决方案1】:

如果你想让你的整个应用程序消失,并且在“最近的任务”列表中不留下任何痕迹,你应该可以这样做:

Intent intent = new Intent(this, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.putExtra("finish", true);
startActivity(intent);

在您的根活动中,将以下代码添加到onCreate()

super.onCreate();
if (getIntent().hasExtra("finish")) {
    // Need to finish now
    finish();
    return;
}
... rest of your onCreate() code...

这会将堆栈清除回您的根活动(ACTION=MAIN 和 CATEGORY=LAUNCHER 的那个),然后根活动将退出。因为根活动是使用Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 启动的,所以它不应该出现在最近的任务列表中。

注意:这仅在根 Activity 在启动应用程序中的其他 Activity 时保留在 Activity 堆栈中时才有效(即:不调用 finish())。

【讨论】:

  • 谢谢!在我的例子中,fakerootactivity 是作为接收到 intent.action.send 的结果开始的。 fakerootactivity 使用标志 cleartop 和 excludefromrecent 启动 rootactivity。然后rootactivity创建其他活动(例如activityX),然后在activityX的意图中使用“finish”清除启动rootactivity。但这不会从最近删除(显示最近的activityX,但打开时开始rootactivity)。我在 manifest.xml 中为 rootActivity 添加 ACTION=MAIN 和 CATEGORY=LAUNCHER
  • 请发布您的清单。我不完全理解这一点。
  • 仍然不确定我是否完全理解,但是请尝试以下操作:将 android:taskAffinity="" 添加到 &lt;activity&gt; 定义为 ActivityRecive 并在从 ActivityRecive 启动 ActivityPasswordToIncognito 时使用 Intent.FLAG_ACTIVITY_NEW_TASK。这将确保ActivityPasswordToIncognito 是新任务的根,并且该任务应显示在最近的任务列表中。
  • 它不起作用,不知道为什么。 ActivityPasswordToIncognito 停留在最近的任务列表中。如果不是使用Intent.FLAG_ACTIVITY_NEW_TASK 而是使用Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT 工作正常
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多