清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈

Posted

技术标签:

【中文标题】清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈【英文标题】:Clearing the full Android activity stack on older SDKs (that lack FLAG_ACTIVITY_CLEAR_TASK) 【发布时间】:2011-07-06 11:59:57 【问题描述】:

我在 SO 上进行了一些阅读和搜索,但找不到清除当前活动堆栈的方法。我的应用程序的上下文是由后台服务/通知启动的活动。

想象一下,我的应用程序允许您组织人员列表。几个小时前,您在“查看”活动中查看person X,现在这是您堆栈的顶部。在未来的某个时间点,服务会触发,我会为 person Y 弹出一个新的“通知”活动。从那里您可以编辑人 Y 的详细信息。

当您完成此活动时,弹出堆栈并最终查看人 X 将是一种令人困惑的用户体验。理想情况下,我想回到用户正在做的任何事情(电子邮件等......),或者至少到我的应用程序的家。

我尝试使用FLAG_ACTIVTY_NEW_TASK 启动“通知”,但这似乎没有帮助:当任务完成时,它只是返回到上一个任务。我想要的似乎是android 3 的新FLAG_ACTIVITY_CLEAR_TASK,这在以前的SDK 中是不存在的。

有没有人建议实现这一目标?

【问题讨论】:

您可能会发现 IntentCompat 类很有用:***.com/questions/19182233/… 【参考方案1】:

杀光他们

您可以使用BroadcastReceivers

像这样创建BaseActivity
public class BaseActivity extends GuiceActivity 
    private KillReceiver mKillReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        mKillReceiver = new KillReceiver();
        registerReceiver(mKillReceiver,
            IntentFilter.create("kill", "spartan!!!"));
    
    @Override
    protected void onDestroy() 
        super.onDestroy();
        unregisterReceiver(mKillReceiver);
    
    private final class KillReceiver extends BroadcastReceiver 
        @Override
        public void onReceive(Context context, Intent intent) 
            finish();
        
    


让您的活动扩展至 BaseActivity。 每当您想清除堆栈时:
Intent intent = new Intent("kill");
intent.setType("spartan!!!");
sendBroadcast(intent);

【讨论】:

感谢克里斯蒂安。由于回家是可以接受的,我想我会接受另一个稍微简单的建议。但是,如果我不想让其他任何东西运行,这看起来是一个很好的解决方案。 当您想要启动一个不在历史堆栈中的活动同时清除其余活动时效果很好。 “斯巴达人!!!” MIME 类型很有趣,但会抛出 RuntimeException: Bad MIME type。应该可能更改为“text/plain”,以便示例按原样工作。 :P 哦,你应该把杀意的名字改成maliciousIntent 这是完全错误的。它没有考虑 Android 的工作方式。假设任务中的 Activity 被系统杀死(例如内存不足)。这个 Activity 不会被 BroadcastReceiver 杀死,因为它已经被系统杀死了。问题是,它将保留在后台堆栈中。 这取决于您想要什么结果...对于通过密码网关的单实例输入,这是 12 之前的 Android 缺乏堆栈功能的完美解决方法【参考方案2】:

如果您已经在堆栈中运行了应用程序主页的实例,则当活动 Y 完成时,您可以使用标志 FLAG_ACTIVITY_CLEAR_TOP 启动应用程序主页(使用 startActivity())。由于它已经在堆栈中,而不是创建它的新实例,这会将您带回应用程序的主页并清除其顶部的堆栈。

【讨论】:

谢谢!我非常专注于 FLAG 文档,我完全忽略了这一点。我想如果我没有开始家庭活动,它只会开始一个新的活动,这不是一个真正的问题。这绝对应该这样做。 我只想补充一点,从onStop() 调用startActivity(HOME) 会导致一些闪烁。相反,我在调用finish()onBackPressed() 之前调用它。 我自己很难与活动堆栈作斗争,我知道要获得我们想要的应用程序并不容易。至于闪烁,以前从未注意到过……不过很好的补充!【参考方案3】:

获取一个 ArrayList 并将所有活动对象保存到每个活动的 oncreate() 中的 arraylist 中。每当您想完成特定活动时,只需从 arraylist 中检索该活动实例并完成它。

【讨论】:

以上是关于清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈的主要内容,如果未能解决你的问题,请参考以下文章

Xcode SDK IOS 4.2 安装和构建设置中缺少 iOS 4.1

如何删除或清除 S3 上的旧文件?

Spotify 清除播放列表拖放

Google Play 服务修订版 30 缺少 version.xml

友盟SDK升级记录

清除OpenLDAP旧日志