【问题标题】:Go back to MainActivity from any activities with Flag从任何带有标志的活动返回 MainActivity
【发布时间】:2017-04-26 04:37:52
【问题描述】:

我想从任何活动返回 MainActivity。 例如,我的一系列活动: A - B - C - D。 A(MainActivity)在栈底,D在栈顶。

当我使用 android:launchMode="singleTask" 时。我可以按照我的预期在任何活动中回到 A。

但是当我使用标志 FLAG_ACTIVITY_NEW_TASK(没有 launchMode="singleTask")时,它不能按预期工作,它会打开一个新的 Activity。 堆栈是: A - B - C - D - A 不像文件写的那样:

FLAG_ACTIVITY_NEW_TASK
在新任务中启动活动。如果一个任务是 已经为您现在开始的活动运行,该任务是 以恢复其最后状态和 Activity 在 onNewIntent() 中接收新的 Intent。

这会产生与“singleTask”launchMode 值相同的行为,在 上一节。

有人知道原因吗?谢谢。

【问题讨论】:

  • 看我的回答你不需要singleTask、newTask等。只需输入这段代码并完成。
  • 对不起,这不是答案。因为我想知道FLAG_ACTIVITY_NEW_TASK 不像文档所说的那样工作。
  • 我认为你应该为此使用广播接收器
  • 谢谢,singleTask 按我的预期工作。我以前使用广播接收器,我是一个解决方案,但是我在堆栈中有很多活动,需要听很多。所以singleTask 是一个很好的解决方案。

标签: android android-manifest android-task


【解决方案1】:

我希望这个解决方案可以解决您的问题::- 仅将其设置为 Intent

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

【讨论】:

  • 感谢您的回答。我尝试但没有按预期工作。
  • 非常感谢,我仍然与intentToLaunch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 合作。有 2 个标志,它像 FLAG_ACTIVITY_NEW_TASK 一样工作(但这个标志不能按预期工作)
  • 是的,你说得对。有时,标志不能按照名称、用途或描述工作。但是,经验将教会他们如何工作和解决问题。
【解决方案2】:

找到解决办法:

注意:它将清除所有以前的活动并启动 HomeActivity

Intent homeActivity = new Intent(context, DJ_HomeActivity.class);
homeActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(homeActivity); 

【讨论】:

    【解决方案3】:

    试试这个。您可以像这样从堆栈中添加和删除活动。

    // Add activity
    public static void addActivities(String actName, Activity _activity) {
        if (Config.screenStack == null)
            Config.screenStack = new HashMap<String, Activity>();
        if (_activity != null)
            Config.screenStack.put(actName, _activity);
    }
    
    // Remove Activity
    public static void removeActivity(String key) {
        if (Config.screenStack != null && Config.screenStack.size() > 0) {
            Activity _activity = Config.screenStack.get(key);
            if (_activity != null) {
                _activity.finish();
            }
        }
    }
    

    用户在 setContentView 之前添加活动以添加到堆栈中。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addActivities("DemoActivity", DemoActivity.this)
        setContentView(R.layout.activity_create_feed_post);
    }
    

    对于删除活动,您只需调用 removeActivity() 并传递您在添加活动时使用的密钥。

    【讨论】:

    • 抱歉,这不是我想要的答案。你的答案是How to remove a particular activity from android back stack? 但是你的回答是,使用HashMap来存储堆栈,不能像这样删除活动:A-B-C-D-C-D。如果我想删除堆栈中的 C,则不能。因为youf HashMap不能在Stack中存储2个C activties
    • 您可以将所有活动存储在此方法中。例如,如果您从 ABCDEF 现在从 F 转到活动 A,则 onBackPress 您只需调用 removeActivity("Your E activity"), removeActivity (“你的 D 活动”)到 B 活动,然后调用 finish() 当前活动。这样就完成了。
    • 不能使用上面的代码。例如:使用堆栈 A-B-C-D-C-D,您使用 HashMap 的代码无法像堆栈 A-B-C-D-C-D 那样存储堆栈,堆栈中的 2 个 C 活动
    • 从你的情况来看,你写了这样的东西 A - B - C - D - A 对。所以很简单。 1)当你来到A时添加你的活动,当你B时添加你的活动等等。当您从 D 调用活动 A 时,您只需调用 removeActivity("Your A activity") 因此通过这种方式,您的活动现在创建新的 A 活动,并且您有活动 A 的单个堆栈。
    【解决方案4】:

    覆盖每个活动的onBackpress 方法:

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    startActivity(intent);
    

    【讨论】:

    • 我知道FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_CLEAR_TASK会清空任务中的所有activity并打开新的Activity,而不是回到栈中的Activity
    【解决方案5】:

    您应该使用下面的代码跳转到 MainActivity。使用 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 以下意图标志它会清除所有以前的活动。

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

    注意一件事,你使用了android:launchMode="singleTask"所以在从A活动移动到另一个活动时,你必须使用this.finish()方法完成A活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-04-03
      • 2023-03-26
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多