我已经看到很多关于这个"问题的问题"但是没有任何实际的答案能够完美运作。
在我的应用程序(健身相关)中,当用户在锻炼期间离开时我发出通知,以便他可以快速返回。
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
中的所有状态,并按照savedInstanceState
中的onCreate
变量按照android标准进行恢复。
这是清单的相关部分:
<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>
答案 0 :(得分:1)
无法阻止活动被操作系统杀死,但是,您可以将该数据保存在其他内容上,如SharedPreferences,数据库或文件。以下是有关如何保留数据的指南:Storage Options。
或者,您可以使用其他启动模式,例如 singleTask:
系统在新任务和路由的根目录下创建活动 意图。但是,如果活动的实例已经存在 存在,系统通过a将意图路由到现有实例 调用它的onNewIntent()方法,而不是创建一个新方法。
或singleInstance:
与&#34; singleTask&#34;相同,除了系统没有启动任何其他 活动进入持有实例的任务。活动总是如此 其任务的唯一成员。
然而,这可能会弄乱您的应用和活动流程的处理方式。
参考文献:
Storage Options
Activity Elements: Launch Modes