Android 避免在应用程序进入后台时恢复活动

Android 避免在应用程序进入后台时恢复活动,android,android-intent,android-activity,Android,Android Intent,Android Activity,在我的申请中,我有三项活动: <activity android:name="com.example.myapp.SplashScreenActivity" android:exported="true" android:launchMode="singleInstance" android:noHistory="true" android:screenOrientation="sensorLandsc

在我的申请中,我有三项活动:

    <activity
        android:name="com.example.myapp.SplashScreenActivity"
        android:exported="true"
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:screenOrientation="sensorLandscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.myapp.MainActivity"
        android:exported="false"
        android:launchMode="singleInstance"
        android:screenOrientation="sensorLandscape" >
    </activity>
    <activity
        android:name="com.example.myapp.ListActivity"
        android:exported="false"
        android:launchMode="singleTop"
        android:screenOrientation="sensorLandscape" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
ListActivity
中,
onResume
方法检查额外的“类别”并相应地显示数据。由于
Activity
launchMode是singleTop,我还重写了
onNewIntent
方法来设置
Activity
的新
Intent

如果应用程序未进入后台,则此功能正常工作:在这种情况下,当我重新启动
MainActivity
并选择一个类别时,
ListActivity
将恢复旧的
活动
,显示属于先前选择的类别的数据


我应该如何修复标志/启动模式,使我的应用程序不会在加载旧数据的情况下恢复
ListActivity

您不应该使用特殊的启动模式。这些很少需要,而且只有在非常具体的情况下才需要。从清单中删除所有
launchMode
说明符。从
MainActivity
启动
ListActivity
时,也不需要使用这些标志:

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

您使用的
singleInstance
启动模式导致了所有这些问题。

假设您放弃所有启动模式和标志,那么活动生命周期将为您提供实现应用程序所需的所有信息,如您所述-可能有一些您没有添加的内容

一旦应用程序进入后台,那么ListActivity将被允许保存其状态,即使系统将终止您的进程(内存不足等),然后仍然-启动回您的应用程序将首先将ListActivity恢复到以前保存的实例状态。因此,您将不会有您描述的行为:
当我重新启动MainActivity并选择一个类别时,ListActivity将恢复旧活动,显示属于先前选择的类别的数据。


不过,如果您需要保持当前的设计,那么您应该以某种方式通知ListActivity新的数据更改,问题是在您描述的情况下是否调用了ListActivity.onNewIntent?您是否尝试过添加
Intent.FLAG\u ACTIVITY\u SINGLE\u TOP
:根据此博客条目:?

在默认启动模式下,如果用户继续按,他将看到旧的
ListActivity
MainActivity
堆栈。那么您做得不对。您何时启动
列表活动
?请详细解释您的体系结构。您应该只有1个
MainActivity
和1个
ListActivity
,但您不需要特殊的启动模式来实现这一点。假设我的应用程序像启动器一样工作,即使它不是
MainActivity
包含类别,
ListActivity
包含应用程序列表并能够执行它们。如果我在
ListActivity
中运行应用程序,并且我的应用程序进入后台。重新启动时,在
MainActivity
中选择一个类别将恢复
ListActivity
,而不是加载新的应用程序列表。重要的是,如果用户一直按“后退”按钮,看不到堆叠的活动。当您“重新启动它”时,它应该将后台任务放在前面,如果您将
ListActivity
放在顶部,则它仍将位于顶部。因此,您无法转到
MainActivity
并启动另一个
ListActivity
。首先不要堆叠活动,您就不会遇到此问题。当您按“上一步”按钮退出应用程序,然后从最近的应用程序列表中恢复应用程序时,是否会发生这种情况?还是总是这样?
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);