前台服务在当前活动保存信息之前启动新活动



我的应用的主要活动是使用挂起的意向从前台服务通知启动的。这按预期工作。但是,如果用户已打开主活动,则会在保存信息之前启动新活动。

方案:主活动处于打开状态,前台服务正在运行。用户对主活动中的文本进行了一些更改,然后决定(无论出于何种原因)点击前台服务的通知。这将再次启动主活动。但是,在调用前一个实例的onSavedInstanceState()onStop()之前,会调用新实例的onStart()onResume()

结果:用户丢失了在点击通知之前对主要活动所做的工作。

如何防止此数据丢失?有没有办法确保在从通知中打开新实例之前保存它(我正在使用共享首选项)?

我很惊讶新实例的onResume()是在前一个实例的onSaveInstanceState()之前调用的。我已经研究过使用onPause(),但文档不鼓励在那里保存数据。

如何通过设置 launchMode="singleTask" 将 MainActivity 限制为清单中的单个实例

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

实时保存数据。

当用户输入时,使用TextWatcher()立即将其保存在sharedPreferences上(如果您使用的是EditText)。然后在活动onResume()上,预先填写sharedPreferences上存在的信息。

我没有提供代码,因为您也没有提供任何代码。

这些回复提供了两个很好的技巧,我能够以各种形式实施。Tenten Ponce的第一个是在创建信息时保存信息。就我而言,我没有从需要TextWatcher的用户输入文本数据,但我确实实现了一种方法来将数据保存在有意义的实时sharedPreferences

感谢David Wasser对原始问题的评论,我还添加了android:launchMode="singleTask",效果很好。根据此 API 指南,此属性在我的应用程序中似乎最有意义。

最新更新