Android在按钮点击时返回第一个活动

时间:2010-05-05 21:14:17

标签: android

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

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

6 个答案:

答案 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());

这就是全部