实施后OnBackPressed将我带回到之前的活动

时间:2015-09-02 20:08:37

标签: android android-activity

我在Android和学习方面都是全新的,我注意到OnBackPressed带您进入游戏中的先前布局,现在我添加了此代码,可以在OnBackPressed

关闭应用程序
@Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
        super.onBackPressed();
    }

我的问题是,当你再次开始游戏时,它会将你带回到之前的布局,而不是主布局。举个例子,你有4个活动,当我开始游戏时,我需要参加活动3我怎么能避免这个?

<application
    android:allowBackup="true"
    android:icon="@mipmap/icon1"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".StartGame"
        android:label="@string/app_name"
        android:screenOrientation="portrait"/>

    <activity
        android:name=".MathQuestions"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        />

        <activity android:name=".HighScores"
            android:label="@string/app_name"
            android:configChanges="keyboardHidden|orientation|screenSize"/>
    <activity android:name=".HowToPlay" >

    </activity>
</application>

2 个答案:

答案 0 :(得分:1)

你并没有真正关闭你的应用程序。使用该代码,您只需最小化您的应用程序(模仿HOME按钮行为)。我相信,如果您在finish()电话后致电startActivity(homeIntent),它会按照您的意愿运作。

答案 1 :(得分:0)

修改标志:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);  

并调用finish()而不是super.onBackPressed();

我做了一些阅读并发现了这个:

  

此启动模式也可以与FLAG_ACTIVITY_NEW_TASK结合使用:如果用于启动任务的根活动,它会将该任务的任何当前运行的实例带到前台,然后将其清除到其根目录州。这在从通知管理器启动活动时尤其有用。

来自CLEAR_TOP的文档

编辑:另一种解决方案。

这对你不起作用,让我们这样做:

创建一个扩展应用程序的自定义类,大部分时间不需要这个,但在这里会有所帮助。称之为MyApp.java

public class MyApp extends Application {
    private HashSet<Activity> mActivities;

@Override
public void onCreate(){
    super.onCreate();
    mActivities = new HashSet<Activity>();
}

public void addActivity(Activity activity){
    if(!mActivities.contains(activity))
        mActivities.add(activity);
}

public void removeActivity(Activity activity){
    if(mActivities.contains(activity))
        mActivities.remove(activity);
}
public void close(){
    for(Activity activity : mActivities){
        activity.finish();
    }
}

并将其添加到应用程序标记中的android清单中(保持不变):

<application
    android:name=".MyApp"
    ...
    ...

现在,在每个活动中都会调用以下内容:

@Override
public void onStart(){
    super.onStart();
    ((MyApp) getApplication()).addActivity(this);
}

所以现在每个活动都存储在你自己的HashSet中,可以在需要时优雅地完成。

现在只需执行以下操作,而不是调用意图:

@Override
public void onBackPressed(){
    ((MyApp) getApplication()).close();
}

所有活动都已完成,资源已经发布,当您返回应用程序时,它将在您的主页活动中。现在,对于销毁或停止活动的情况,您可能/可能不需要removeActivity调用,但此解决方案应该可行。就像我说的,这是一个更多的工作,但会解决你的问题。