Android按钮点击后移至第一个活动

我正在写一个应用程序,我正在处理4个活动,比如说A,B,C和D.活动A调用B,B调用C,C调用D.在每个活动中,我有一个名为“home”按钮。 当用户点击任何B,C,D活动中的主页按钮时,应用程序应该返回到A活动屏幕?

在这种情况下如何模拟“home”按钮?

button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { startActivity(new Intent(D.this, A.class)); } }); 

使用android:launchMode="singleTask"声明A的清单。 这样,当您从其他活动中调用startActivity() ,并且A已经在运行时,它就会把它带到前面。 否则,它会启动一个新的实例。

唯一的问题,我看到使用android:launchMode="singleTask"是每当你最小化应用程序,并再次按应用程序图标启动应用程序,然后应用程序从头开始,并没有获得其状态。 所以我选择使用

 intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ); 

这将只保留一个实例,并清除所有的活动。

 Intent intent = new Intent( context, MyActivity.class ); intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ); current_activity.startActivity( intent ); 

这对我有用

 Intent intent = new Intent(D.this, A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

在清单中:

 android:name=".A" android:launchMode="singleTask" 

我正在使用https://github.com/greenrobot/EventBus这个。 在根活动中,您必须订阅活动

。EventBus.getDefault()寄存器(本);

然后你必须定义事件回调

  public void onEvent(LogoutEvent event) { // your implementation logout(); } 

和注销按钮监听器必须有这样的代码:

 finish(); // you must finish previous activity EventBus.getDefault().post(new LogoutEvent()); 

就这样

首先,我不能相信Android没有一个简单的相当于iOS poptorootviewcontroller。

使用intent和startactivity的问题是,据我所知,如果使用异步网络请求加载数据和布局接口,它将重新创建问题的根活动。 这可能会有不愉快的视觉效果。

以下是我在我的friendfolder项目中使用的创造性解决方案:

创建一个全局布尔值: public boolean myBool = true; 在MyApplication类中执行此操作,并在清单中注册该类:

  

活动A是根,在onResume中做这个:

 if(((MyApplication) this.getApplication()).myBool == false) { if(isTaskRoot()) { ((MyApplication) this.getApplication()).myBool = true; } else { finish(); } } 

在活动A的顶部,每一个活动都把这个代码放在:

 @Override public void onResume() { super.onResume(); if(((MyApplication) this.getApplication()).myBool == false) { finish(); } } @Override public boolean onSupportNavigateUp(){ ((MyApplication) this.getApplication()).myBool = false; finish(); return true; } 

你甚至可以把它放在活动A中,如果你将A的其他实例放在根A的顶部。onSupportNavigateUp就是向上按钮。 如果使用您自己的按钮,请将此方法替换为其他方法。

现在,当您将一些活动堆叠在A之上时,按下向上按钮,顶部活动将结束,系统将在堆栈中的下面的活动中调用onresume,并完成。 这将在一个链中一路返回到根A.

科特林

 fun Context.popToRoot() { val intent = Intent(this, MainActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP startActivity(intent) } 

将MainActivity更改为主要活动。

在任何活动只是打电话:

  this.popToRoot()