在不创建新实例的情况下启动Android活动

9
假设我有一个作为应用程序根活动的活动A。从这个活动,我进入了活动B。
我想能够从B返回A,而不创建Activity A的新实例。
以下是在Activity B中的代码。
public void onBackPressed() {
        super.onBackPressed();
//      Intent intent= new Intent(getBaseContext(), MainActivity.class);
//      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(myIntent);
        Log.d("Back", "TEST");
    }

但是它仍然会调用Activity A的onCreate方法。我想要做的是,在启动Activity B时将A放在后台,并在B完成后切换回Activity A。
这是清单文件:
<activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            android:screenOrientation="unspecified" 
            android:launchMode="singleTask"
            android:stateNotNeeded="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:label="@string/app_name"
            android:name=".SubmenuActivty" >
        </activity>

谢谢给这个评分的人。你真的看了吗? - Ibrahem Ahmed
6个回答

12
根据安卓Activity生命周期,当您启动一个名为A的activity时:
生命周期方法列表:
Activity A.onResume();
Activity A.onStart();
Activity A.onCreate();

活动状态:

Activity A : Resumed

当您现在启动活动B时:

生命周期方法列表:

Activity A.onStop();  
Activity B.onResume();
Activity B.onStart();
Activity B.onCreate();
Activity A.onPause();
    ...
    ...
    ...

活动状态:

   Activity A : Stopped
   Activity B : Resumed

当你现在重新开始 A 时:

生命周期方法列表:

Activity B.onDestroy();  
Activity B.onStop(); 
Activity A.onResume();
  ....
  ....
  ....      

活动状态:

   Activity B : Destroyed
   Activity A : Resumed

这是一个活动的生命周期:enter image description here

您可以在此处找到详细信息。

根据默认行为,活动A转到onStop()状态并且不再存活,需要在返回活动A时创建新实例。我所知的是 - 没有办法保持A实例的存活。


3
当A启动B时,A会停止(但仍然处于活动状态)。一旦B完成,它将自动重新启动并恢复A。直到A调用 finish() 方法结束自身,A都将保持活动状态。 - David Wasser

5
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

试一下...它可以将旧的活动置于前台,而不需要新实例...


2
你不需要做任何事情,只需从Activity B中删除你的onBackPressed()方法即可。
默认情况下,当你从Activity A转移到Activity B时,Android会将Activity A添加到后台堆栈。当你按下Activity B的返回按钮或结束它时,它会自动从后台堆栈中恢复Activity A。
如果你想以编程方式完成Activity B,请在你想要完成它的时候调用activity的finish()方法。

它将通过创建新实例从后台堆栈中恢复Activity A。我希望Activity A始终保持活动状态。 - Ibrahem Ahmed
你在启动活动B时是否已经完成了活动A?如果没有,那么活动A肯定会从返回堆栈中恢复到其上一个状态。 - Sankar V
我不使用 Intent myIntent = new Intent(getBaseContext(), SubmenuActivty.class);startActivity(myIntent); 来启动活动 A。 - Ibrahem Ahmed
你尝试过从B Activity中移除onBackPressed() 方法吗? - Sankar V
1
“想要让Activity A一直处于活动状态”这句话是什么意思?它已经在运行了,只是被Activity B隐藏了。请定义“活动状态”。当Activity B完全覆盖并获取所有用户输入时,您希望Activity A做什么? - David Wasser

0
为什么你在 onBackPressed 中启动一个活动呢?你应该使用 super.onBackPressed(); 而不是启动新的活动。或者在你的 onBackPressed() 方法中调用 finish() 方法:
public void onBackPressed() {
        finish();
        Log.d("Back", "TEST");
    }

0

试试这个

public void onBackPressed() {
    super.onBackPressed();
    Log.d("Back", "TEST");
}

这就是你所需要的全部。


0

使用 moveTaskToBack(true);

public void onBackPressed() {
// TODO Auto-generated method stub
moveTaskToBack(true); 
super.onBackPressed();
}

或者你也可以使用finish()


这并不会保持活动的存活状态,它只会创建一个新的活动实例。它将再次调用onCreate方法。 - Ibrahem Ahmed

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