如何从栈中移除特定的活动?

3
让我们假设有一组栈的操作顺序为A->B->C
如果B打开了C,我该如何关闭A并保留B->C,但仅当B打开了C时才进行操作? C并不总是被打开,但只有在打开C时,A才应该被删除,从而保留栈为B->C。否则将继续保持为A->B
我认为在A中使用finish()的可能性不大,因为应该在从B中打开C时关闭它。
另外,A是具有自己亲和力的单个实例。
1个回答

1

编写一个 抽象BaseActivity 类,并在其中实现 LocalBroadcastManager 并注册一个 BroadcastReceiver。注意,我们还引入了一个抽象的 onFinishReceived 方法。

public abstract class BaseActivity extends AppCompatActivity {

  private LocalBroadcastManager mLBM;
  private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      onFinishReceived(intent.getStringExtra("activity"));
    }
  }

  protected void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    mLBM = LocalBroadcastManager.getInstance(this);
    IntentFilter filter = new IntentFilter();
    filter.addAction(...);
    mLBM.registerReceiver(receiver, filter);
  }

  protected void onDestroy() {
    mLBM.unregisterReceiver(receiver);
    mLBM = null;
  }

  abstract void onFinishReceived(String activity);
}

然后,从BaseActivity扩展所有ABC活动,并覆盖onFinishReceived()方法。

public class A extends BaseActivity {

  void onFinishReceived(String activity) {
    if (activity.equals("A") { // or "B" or "C"
        finish();
      }
    }
  }
}

现在,每当你想完成特定的活动时,请使用以下方法:
LocalBroadcastManager.getInstance(context)
    .sendBroadcast(new Intent()
        .setAction(...)
        .putExtra("activity", "A") // or "B" or "C"
    );

LocalBroadcastManager 已经被弃用,最好使用像 RxJava 这样的东西。想法是使用异步和基于事件的机制,而不是选择简单丑陋的解决方案,例如将 Activity 存储在静态变量中。


1
相当不错的想法 - API_1024

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接