当应用程序进入后台时,避免活动恢复

时间:2014-12-29 12:45:30

标签: android android-intent android-activity

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

    <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>

第一个是LAUNCHERSplashScreenActivity,它是一个快速消失的启动画面,并且在最近的活动中没有显示,它启动MainActivity。在MainActivity用户可以选择一个类别,ListActivity显示属于给定类别的项目。这是通过以下代码完成的:

Intent i = new Intent(getActivity(),ListActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
i.putExtra("category",mCategory);
startActivity(i);

ListActivity onResume方法检查“category”extra并相应地显示数据。由于Activity launchMode是singleTop,因此我还重写了onNewIntent方法以设置Intent的新Activity

如果应用没有进入后台,这种情况正常:在这种情况下,当我重新启动MainActivity并选择一个类别时,ListActivity会恢复显示属于的Activity旧数据以前选择的类别。

我应该如何修复flags / launchMode,使我的应用无法在加载旧数据的情况下恢复ListActivity

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

假设您放弃了所有的launchModes和Flags,那么活动生命周期会为您提供实现应用程序所需的所有信息,如您所描述的那样 - 也许有些东西没有添加?

一旦应用程序进入后台,ListActivity将被允许保存其状态,即使系统将终止你的进程(内存不足等),然后仍然 - 启动你的应用程序将首先带回ListActivity与先前保存的实例州。所以你不会有你描述的行为:when I restart MainActivity and select a category, ListActivity resumes the old Activity showing data belonging to the previously chosen category.

但是,如果您需要保持当前的设计,那么您应该以某种方式告知ListActivity新的数据更改,问题是在您描述的情况下是否正在调用ListActivity.onNewIntent?您是否尝试添加Intent.FLAG_ACTIVITY_SINGLE_TOP:根据此博客条目:http://www.acnenomor.com/1094151p2/bug-onnewintent-not-called-for-singletop-activity-with-intentflagactivitynewtask