我正在编写一个应用程序来处理4个活动,比方说A,B,C& D.活动A调用B,B调用C,C调用D.在每个活动上,我有一个名为“home”按钮的按钮。当用户点击任何B,C,D活动中的主页按钮时,应用程序应该返回活动屏幕吗?
在这种情况下如何模拟“主页”按钮?
答案 0 :(得分:69)
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(D.this, A.class));
}
});
使用android:launchMode="singleTask"
在您的清单中声明A.这样,当您从其他活动中调用startActivity()
并且A已经在运行时,它将把它带到前面。否则它将启动一个新实例。
答案 1 :(得分:24)
我看到使用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 );
答案 2 :(得分:1)
首先,我无法相信Android没有简单的iOS poptorootviewcontroller。
使用intent和startactivity的问题在于,据我所知,如果使用异步网络请求加载数据和布局接口,它将重新创建根本活动,这是一个问题。这可能会产生令人不快的视觉效果。
以下是我在我的朋友文件夹项目中使用的创意解决方案:
创建一个全局布尔值:public boolean myBool = true;
在MyApplication类中执行此操作并在清单中注册该类:
<application
android:name=".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.
答案 3 :(得分:1)
Kotlin
fun Context.popToRoot()
{
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
}
将MainActivity更改为您的主要活动。
在任何活动中,只需致电:
this.popToRoot()
答案 4 :(得分:0)
这对我有用
Intent intent = new Intent(D.this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
在清单中:
android:name=".A"
android:launchMode="singleTask"
答案 5 :(得分:0)
我正在使用https://github.com/greenrobot/EventBus这个。在root活动中,您必须订阅事件
。EventBus.getDefault()寄存器(本);
然后你必须定义事件回调
public void onEvent(LogoutEvent event) {
// your implementation
logout();
}
并且注销按钮侦听器必须具有以下代码:
finish(); // you must finish previous activity
EventBus.getDefault().post(new LogoutEvent());
这就是全部