如何杀死 Activity 的特定实例?

How to kill a specific Instance of a Activity?

我知道我们只能保留一个实例

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

但我需要我的应用最多可以创建某些 activity 的两个实例,但不能超过此数量。
我正在使用链式 search 功能,如下图

创建 activity1 的 Instance3 时,我想销毁:-

  1. activity1
  2. 的实例 1
  3. 实例 1,共 activity2

试图用它来杀死特定的 activity 但 activity 应用程序中的所有进程都具有相同的 PID

 android.os.Process.killProcess( stack.getLast()); 

有什么方法可以调节哪些实例应该保持活动状态?
如有帮助将不胜感激!

兄弟,你可以的,

像这样声明一个 Activity 对象

public static Activity factivity;
    onCreate()
    {
        factivity = this;
    }

现在您可以使用该对象杀死另一个 activity 上的特定 activity,如下所示:

onCreate()
{
    FirstActivity.factivity.finish();
}

基本上你想在创建第 5 个时从后台堆栈中删除条目 1 和 2,但保留第 3 和第 4 个。不幸的是,backstack 不是那样工作的,你只能从顶部操作它。如果设置标志 FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK,您可以选择清除除最后一个活动之外的所有活动,您将只有刚刚开始的 activity.

如果我是你,我不会担心旧活动的内存消耗。只要在 Activity 离开屏幕时停止它们中的资源消耗进程并且不保留对它们的引用以便它们可以被垃圾收集,Android 就可以很好地管理内存本身。您应该考虑的是,如果用户按下返回键,返回到旧活动是否有意义。有就离开,没有就不要

如果您想在按下后退按钮时终止所有活动,可以使用 Activity.finishAffinity() 方法。只需覆盖 onBackPressed 方法即可调用它。

您可以对 EventBus 或 BroadcastReceiver 或其他一些总线进行一些修改。检查我的以下代码以了解我的想法。对于这个应用程序,我将保留最多 2 个 MainActivity

实例
public class MainActivity extends AppCompatActivity {
public static int count = 0;

int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    count ++;
    id = getIntent().getIntExtra("ID", 0);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, MainActivity.class);
            intent.putExtra("ID", count);
            startActivity(intent);
        }
    });
}

@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
    EventBus.getDefault().post(new Event(count));
}

@Subscribe
public void onEvent(Event event) {
    if (id < (event.getID() - 2)) {//put your logic code to finish the activity here
        Log.i("MainActivity", id + " is killed ");
        finish();
    }
}

@Override
protected void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

}

在我看来,这是错误的架构。对于链式搜索,每个 Activity 应该只有一个实例。您应该通过调用 startActivity() 并在您使用的 Intent 中设置 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 来在不同的 Activity 实例之间切换。还要在 Intent.

中添加要显示为 "extras" 的数据

为了能够使用 BACK 按钮通过链返回(无论它有多长),每个 Activity 都应该管理一个堆栈,其中包含它需要重新创建页面的数据用户支持它。在 onCreate()onNewIntent() 中,数据(来自 "extras")应该被压入堆栈并显示。然后,您通过调用 startActivity() 并在您使用的 Intent 中设置 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 来覆盖 onBackPressed() 并返回到之前的 Activity。您还向 Intent 添加了一个 "extra",表示用户想要 "go back"。在 onBackPressed() 中,您还应该丢弃 Activity 的数据堆栈中的顶部元素。这将确保当用户返回此 Activity.

时堆栈是正确的

onNewIntent() 中,如果用户刚刚返回到 Activity,您只需显示已位于托管数据堆栈顶部的数据。

这样一来,每个 Activity 都只有一个实例,用户可以一整天都通过一组活动进行链接,“后退”按钮始终有效,您不必担心 运行 内存不足。

尝试使用 taskAffinityIntent 标志或类似的方式来完成此操作是行不通的。不要浪费你的时间。这也是糟糕的编程风格。

我希望这是清楚的。