【发布时间】:2014-07-30 17:20:43
【问题描述】:
我已经看到很多关于这个“问题”的问题,但没有任何一个可以完美运行的实际答案。
在我的应用(与健身相关)中,当用户在锻炼期间离开时,我会发出通知,以便他可以快速返回。
Intent intent = new Intent(ctx, WorkoutActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.setClass(ctx, WorkoutActivity.class);
return new NotificationCompat.Builder(ctx)
.setOngoing(true)
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(ctx, 0, intent, 0))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setSmallIcon(icon);
现在这工作得很好。多亏了Intent 标志,如果活动已启动并正在运行,它就会恢复。
但是我看到的问题是,每当应用程序在后台运行的时间足够长并且操作系统决定终止它时;通过通知输入它将启动一个新的活动实例 - 丢失所有数据。以下是应用在后台后重新进入应用的两种方式,包括我正在寻找的行为。
- 按通知。这里出现了问题,因为活动已被销毁并且通知启动了它的一个新的干净实例,但没有保存任何数据。 这是我的问题...
- 按下启动器图标。然后您将被带到应用程序的主要活动,并在关闭此活动后,您将被带到活动的破坏版本并重新启动,并恢复所有状态。 这也是我希望它通过通知工作的方式。
此外,我将所有状态保存在 onSaveInstanceState 中,并根据 android 标准使用 onCreate 中的 savedInstanceState 变量恢复它。
这是清单的相关部分:
<activity
android:name="workout.progression.ui.workout.WorkoutActivity"
android:parentActivityName="workout.progression.ui.MainActivity"
android:theme="@style/AppTheme.WorkoutActivity"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden"/>
这是根活动:
<activity
android:name="workout.progression.ui.MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
【问题讨论】:
-
那么既然您使用的是通知,那么 savedInstanceState 变量是否为空?
-
onSaveInstanceState 保存配置更改,但不会将您从应用程序完全从内存中删除。您如何保存数据?
-
@ianhanniballake 我不会坚持直到锻炼真正完成。然而,作为问题中的#2,活动能够恢复数据,我只想知道它如何通过通知来完成。
-
那是因为活动还在内存中。一旦从内存中删除,您就可以保存数据。
-
@ianhanniballake 但是它不在内存中,它可以被杀死并仍然恢复它的状态(只要我通过启动器打开它)。
标签: android android-intent android-activity android-notifications