【问题标题】:Android: How to clear all activities in previous stack apart from the first activityAndroid:如何清除除第一个活动之外的先前堆栈中的所有活动
【发布时间】:2015-11-18 22:03:22
【问题描述】:

我有一个表单的活动堆栈列表,但是一旦表单完成,我想清除除第一个活动之外的所有堆栈,但显示一个新活动,因此当点击新活动时将返回到第一个活动。

例如A -> B -> C -> D 然后变成 A -> E 这样在 D 上提交表单后,E 将对用户可见。

我要以这种方式启动吗?

Intent message = new Intent();
message.setFlag(ACTIVITY_FLAG_CLEAR_TOP)
message.addClass(getContext(), E.class)
startActivity(E.class);

【问题讨论】:

  • 您可以使用 Finish() 方法或向意图添加标志。 stackoverflow.com/a/24524014/5577385
  • 我认为这行不通。 CLEAR_TOP 表示如果你启动A,B orC,它上面的活动将被清除。如果你在启动C和D时使用finish,你可以实现A->E,但D不能回到C,C不能回到B。如果你确实想要A->B->C->D然后变成A->E,一种可能的方法是使用 StartActivityForResult 并在 A、B、C、D 中处理 onActivityForResult,然后在 A 中启动 E。
  • 你的意思是完成每个 onActivityForResult 上的每个活动

标签: android android-intent activity-stack


【解决方案1】:

我认为正确的是FLAG_ACTIVITY_CLEAR_TOP

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

【讨论】:

    【解决方案2】:

    当我想从应用程序中注销时,我将向您展示我的操作方式。

    这可以让你完成活动 B -> C -> D 并开始活动 A

    首先我在具有会话详细信息的类中创建一个注销方法

    public void logoutUser(){
    
        clearSharedPreferences();
    
        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("com.test.your.packgage.ACTION_LOGOUT");
        _context.sendBroadcast(broadcastIntent);
    
        // We send a broadcast to all registered activities
        // this way all activities will run finish ()
        // And they will be automatically closed
        LocalBroadcastManager.getInstance(_context).sendBroadcast(broadcastIntent);
    
    }
    
    public void clearSharedPreferences() {
        // Clearing all data from Shared Preferences
        editor.clear();
        editor.commit();
    }
    

    然后,在每一个活动中你必须这样做:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.test.your.packgage.ACTION_LOGOUT");
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("onReceive","Logout in progress");
    
                finish();
            }
        }, intentFilter);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2012-04-20
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多