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时,我要销毁:-
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你建议怎么做?不幸的是,你需要使用意向标志来解决问题。它们并不总是完美的