从另一个活动返回到MainActivity

39

MainActivity包含一些按钮,每个按钮通过意图打开一个新的活动。这些活动然后有一个按钮通过意图返回到MainActivity

但是当我按下一个按钮返回到MainActivity时,屏幕上出现了某种菜单!有人知道可能出了什么问题吗?感谢您的帮助!谢谢!

编辑:另一个活动中的返回按钮:

Button btnReturn1 = (Button) findViewById(R.id.btnReturn1);
btnReturn1.setOnClickListener(new View.OnClickListener() {      
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent returnBtn = new Intent("android.intent.action.MAIN");
        startActivity(returnBtn);
    }
});

清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kullaberg.test02"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Activity1"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.ACTIVITY001" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Activity2"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.ACTIVITY002" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Activity3"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.ACTIVITY003" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>


请发布您的按钮代码。 - Paresh Mayani
你是否在清单文件中使用了“android:noHistory=true”? - Shadow
请提供截图、日志和一些代码,因为仅凭您的解释很难理解。 - Pragnani
我认为截图并不能帮助太多,因为它是用瑞典语编写的 :) - 3D-kreativ
你是否在调用一个未设置setContentView(Blabla.xml)的Activity? - Auto-Droid ツ
意图 returnBtn = new Intent(this,MainScreen.class); startActivity(returnBtn); finish(); - Auto-Droid ツ
9个回答

58

为什么不调用finish();

当你想返回到MainActivity时

   btnReturn1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        finish();
    }
});

非常好,谢谢 :) - CandleCoder
26
finish() 实际上并不能帮助返回到 MainActivity,它只是关闭当前活动。 - Bibaswann Bandyopadhyay
1
finish() 只是销毁当前的活动。 - yubaraj poudel
1
它将我返回到“登录”活动而不是“MainActivity”活动。 - Francisco Romero

56

你之所以在onClick方法中使用了你列出的代码看到菜单,原因如下:

你使用了带有字符串参数的构造函数创建了一个Intent对象,并将其作为IntentFilter的动作参数。你向该构造函数传递了"android.intent.action.MAIN"作为参数,这指定了可以通过包含<action="android.intent.action.MAIN">IntentFilter满足Intent

当你调用startActivity方法并传入该Intent时,你实际上告诉Android系统去找到一个指定了android.intent.action.MAIN动作的Activity(在系统上安装的任何应用程序中都有),当有多个符合条件的Activity(在这种情况下,因为每个应用程序都会有一个带有包括"android.intent.action.MAIN"动作的IntentFilter的主Activity),操作系统会显示一个菜单让用户选择要使用的应用程序。

至于如何返回到你的主活动,则像大多数事情一样,它取决于你的应用程序的具体情况。虽然接受的答案可能适用于你的情况,但我认为这不是最好的解决方案,它可能鼓励你在Android应用程序中使用非惯用的UI。如果你的ButtononClick()方法只包含调用finish(),那么你应该将Button从UI中移除,让用户按下硬件/软件返回按钮,这具有相同的功能,并且是Android的惯用方式(在Android应用程序中不鼓励使用后退按钮来模拟iOS UINavigationController导航栏的行为)。

如果你的主活动启动了一堆活动,并想提供一种简单的方法来返回到主活动而不需要反复按返回按钮,则可以在设置Intent.FLAG_ACTIVITY_CLEAR_TOP标志后调用startActivity方法,这将关闭在主活动之上的所有活动并将主活动带到活动堆栈的顶部。参见下面的代码(假设你的主活动子类名为MainActivity:

btnReturn1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Intent i=new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
    }
)};

2
非常好的解释!对于我的“返回MainActivity”需求,startActivity(new Intent(this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 完美地解决了问题。 - Jonik
如果您能解释何时需要使用 finish(),那将非常好。 - PhoneixS
你可以随时使用 finish() 关闭一个 Activity。虽然我建议不要在 Android 上包含返回按钮,因为它并不是必需的,而且可能会使你的用户界面变得混乱,但是如果你想要这样做,也是可以的。有许多情况下,你可能希望通过触摸小部件来执行某些操作,然后调用 finish() 来关闭一个 Activity。 - Brian Cooley
2
这实际上并不返回到MainActivity,而是启动MainActivity。我正在寻找一些能够以其当前状态返回到MainActivity的东西,而不是启动一个新的活动。 - Lance

19
使用
Intent returnBtn = new Intent(getApplicationContext(),
                    MainActivity.class);

startActivity(returnBtn);

如果你不想每次都创建新的活动,请在Android清单文件中将主要活动的launchmode设置为singleTask

android:launchMode="singleTask" 

1
这应该是正确的答案。它的工作方式就像点击后退按钮一样。它不会丢失主活动的状态,而另一个答案会丢失活动的状态。 - live-love
1
是的,这应该是被接受的答案。 - harveyhans
我不得不在许多不同的SO帖子中搜索,最后滚动到这个答案才找到我想要的内容。这应该是被接受的答案。据我所知,明确的顶部标志和this.finish()都是不必要的。 - Zeek Aran

13

我用过它,而且完美地工作了...

startActivity(new Intent(getApplicationContext(),MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 

因为Finish()仅用于2个活动,而不是多个活动。


11

这通常也很有效 :)

navigateUpTo(new Intent(getBaseContext(), MainActivity.class));

非常好用。请注意,您需要从“Activity”或“Context”中调用navigateUpTo - Joshua Pinter

2

在其他活动中,不要通过startActivity再次启动MainActivity,而是调用finish()返回到MainActivity...因为MainActivity已经在堆栈中了。


1

我强烈建议阅读有关Intent.FLAG_ACTIVITY_CLEAR_TOP标志的文档。使用它并不一定会回到第一个(main)活动。该标志只会移除所有现有的活动,直到在Intent中给出的活动类。这在文档中解释得很清楚:

For example, consider a task consisting of the activities: A, B, C, D.
If D calls startActivity() with an Intent that resolves to the component of
activity B, then C and D will be finished and B receive the given Intent, 
resulting in the stack now being: A, B.

请注意,活动可以设置为移动到前台(即清除其上方的所有其他活动),然后重新启动,或者仅调用onNewIntent()方法。

来源


1
在活动中点击按钮时,请使用此代码。当返回到另一个活动时,通过在意图中设置标志来结束先前的活动,然后只将一个活动放入堆栈中并销毁先前的活动。
  Intent i=new Intent("this","YourClassName.Class");
  i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  startActivity(i);

你能否在你的代码中添加一些注释吗?这有助于原帖作者和其他访问者理解它。请查看此metaSO问题Jon Skeet:编码博客,了解如何给出正确的答案。 - Yaroslav

0

我只是这样做

public void retorna(View view)
    {
        Intent muda = new Intent(getApplicationContext(),MainActivity.class);

        muda.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
       
        startActivity(muda);
   }

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Abhishek Dutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接