Android 如何杀死活动的特定实例?

Android 如何杀死活动的特定实例?,android,android-activity,android-lifecycle,Android,Android Activity,Android Lifecycle,我知道我们只能保留一个实例 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 但我需要我的应用程序最多可以创建两个特定活动的实例,但不能超过这两个实例。 我正在使用链接的搜索功能,如下图 创建activity1的Instance3时,我要销毁:- 活动1的实例1 活动2的实例1 试图使用此方法终止特定活动,但活动对应用程序中的所有进程具有相同的Pid android.os.Process.killProcess( stack.ge

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

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
但我需要我的应用程序最多可以创建两个特定活动的实例,但不能超过这两个实例。
我正在使用链接的搜索功能,如下图

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

  • 活动1的实例1
  • 活动2的实例1
  • 试图使用此方法终止特定活动,但活动对应用程序中的所有进程具有相同的Pid

     android.os.Process.killProcess( stack.getLast()); 
    
    我们有没有办法控制哪些实例应该保持活动状态?
    任何帮助都很好,谢谢

    你可以这样做,兄弟

    像这样声明一个活动对象

    public static Activity factivity;
        onCreate()
        {
            factivity = this;
        }
    
    现在,您可以使用该对象终止另一个活动上的特定活动,如下所示:

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

    基本上,当创建第五个条目时,您希望从backbackback中删除条目1和条目2,但保留第三个和第四个条目。不幸的是,后退不能那样工作,你只能从顶部操纵它。您可以选择清除除最后一个活动之外的所有活动。如果设置标志
    标志活动清除任务
    标志活动新任务
    ,则只有刚启动的活动才有一个空任务

    如果我是你,我就不会担心旧的活动会消耗内存。只要在活动中的资源消耗进程离开屏幕时停止它们,并且不保留对它们的引用,这样它们就可以被垃圾收集,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);
    }
    
    public类MainActivity扩展了AppCompatActivity{
    公共静态整数计数=0;
    int-id;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    计数++;
    id=getIntent().getIntExtra(“id”,0);
    setContentView(R.layout.activity_main);
    findviewbyd(R.id.button).setOnClickListener(新视图.OnClickListener()){
    @凌驾
    公共void onClick(视图){
    意向意向=新意向(MainActivity.this,MainActivity.class);
    意向。额外(“ID”,计数);
    星触觉(意向);
    }
    });
    }
    @凌驾
    受保护的void onStart(){
    super.onStart();
    EventBus.getDefault()寄存器(此);
    EventBus.getDefault().post(新事件(计数));
    }
    @订阅
    公共无效事件(事件){
    如果(id<(event.getID()-2)){//请在此处输入逻辑代码以完成活动
    Log.i(“MainActivity”,id+“已终止”);
    完成();
    }
    }
    @凌驾
    受保护的void onStop(){
    super.onStop();
    EventBus.getDefault().unregister(此);
    }
    

    }在我看来,这是错误的架构。对于链式搜索,每个
    活动都应该只有一个实例。您应该通过调用
    startActivity()
    并在您使用的
    Intent
    中设置
    Intent.FLAG\u Activity\u REORDER\u TO\u FRONT
    在不同的
    Activity
    实例之间切换。还可以在
    Intent
    中添加要显示为“额外”的数据

    为了能够使用“后退”按钮返回整个链(无论它有多长),每个
    活动
    都应该管理一个堆栈,其中包含每当用户返回页面时重新创建页面所需的数据。在
    onCreate()
    onNewIntent()
    中,应将数据(来自“extras”)推送到堆栈上并显示。然后,通过调用
    startActivity()
    ,并在所使用的
    Intent
    中设置
    Intent.FLAG\u Activity\u REORDER\u to \u FRONT
    来覆盖
    onBackPressed()
    ,并返回到上一个
    活动。您还可以在
    意图中添加一个“额外”来表示用户想要“返回”。在
    onBackPressed()
    中,您还应该丢弃剩下的
    活动
    数据堆栈的顶部元素。这将确保当用户返回此
    活动时堆栈是正确的

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

    通过这种方式,每个
    活动只有一个实例,用户可以整天通过一组活动进行链接,后退按钮始终有效,您不必担心内存不足

    尝试使用
    taskAffinity
    Intent
    标志或类似标志来完成此操作将无效。不要浪费你的时间。这也是一种糟糕的编程风格


    我希望这是清楚的。

    听说过finish()方法吗。@orvenito您能在前台活动的后台活动上实现finish()方法吗?这也适用于特定的活动,请参见图片,只有最上面的活动才是活动的。Backback是概念性的。@KevinKrumwiede这样back活动不会影响ram或性能?@phpdroid您的意思是在进行其他活动时终止一个活动?您永远不应该这样做。保持对某个活动的静态引用可防止该实例被垃圾收集,这意味着内存泄漏。上面的注释是正确的,即我正在堆栈中保存
    上下文
    ,但无法调用
    stack.getLast().finish()
    @EdsonMenegati你建议怎么做?不幸的是,你需要使用意向标志来解决问题。它们并不总是完美的