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