只需按一下即可清除一堆活动

Posted

技术标签:

【中文标题】只需按一下即可清除一堆活动【英文标题】:clearing stack of activities with just one press 【发布时间】:2012-01-06 19:57:06 【问题描述】:

我有一个正在启动的 Activity A1,它有一个启动按钮,用于启动 Service S1:

startButton.setOnClickListener(new View.OnClickListener() 
            public void onClick(View v) 

                Log.i(TAG1, "Starting Update Service");
                startService(serviceIntentS1);
            
        );

S1 根据某些条件启动 Activity A2:

if (giveninteger>=2)
          
           Intent intentA2= new Intent(this, A2.class);
           // following line to avoid exception
           intentA2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //to avoid exception
           startActivity(intentA2);  

         

A2 订阅 S1,用户可以通过 S1 从 A2 看到定期更新的数据。 A2 有以下代码来停止 S1 服务:

public void onBackPressed() 
        try 
            Log.i(TAG2, "Killing Update Service");
            stopService(serviceIntentS1);

               catch (NullPointerException e) 
            Log.i(TAG3, "Service was not running " + e.toString());
        
        finish();
        System.exit(0);
        return;
      

我的问题是,如果更新从 A2 运行 10 次,用户必须按 10 次返回按钮才能退出 Activity A2。也就是说,A2 的实例在Activity 堆栈中累积。我在从 S1 启动 A2 期间尝试了所有标志,但没有成功。我想退出Activity A2 只需按一下即可,无论更新运行多少次。

任何建议都会有所帮助。

【问题讨论】:

“更新”是什么意思?您是在 A2 中使用 BroadcastReceiver 从 S1 捕获 Intent 还是什么? 是的,我在 A2 中使用 BroadcastReceiver 并获取网络服务 那么您是如何在活动堆栈中获得这些多个 A2 实例的?哪个组件启动了这一切?如果是 S1 服务,那么为什么每次都使用 startActivity() 而不是 sendBroadcast()?如果是其他任何一个,那么是哪个? 感谢 praetorian 的 cmets。该应用程序具有复杂的工作流程,我需要从服务启动活动,而不是使用 sendBroadcast()。请看下面我的cmets。我终于解决了这个问题。 【参考方案1】:

您需要的是 A2 的 SingleInstance,这样无论 A2 启动多少次,都只剩下一个实例,您只需按一次后退按钮。 在 androidManifest 文件中定义该属性。

<activity android:launchMode"singleInstance"/>

【讨论】:

感谢 Rajdeep...问题是,如果我使用它,活动 A2 的数据不会从服务 S1 更新。 我解决了这个问题。感谢 Rajdeep 将我引导至清单文件。我必须对清单文件中的活动 A2 进行以下设置: android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:noHistory="true"

以上是关于只需按一下即可清除一堆活动的主要内容,如果未能解决你的问题,请参考以下文章

如何清除 Android Stack 的活动?

活动和片段之间有啥区别?

linux系统卡死会导致硬盘不活动吗

如何在活动之前显示消息框?

在一段时间不活动后启用 esp32 深度睡眠模式

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