我的应用程序的主要活动是使用待处理的意图从前台服务通知启动的。这按预期工作。但是,如果用户已经打开了主活动,则在保存信息之前启动新活动。
场景:主要活动已打开且前台服务正在运行。用户对主活动中的文本进行了一些更改,然后决定(无论出于何种原因)点击前台服务的通知。这将再次启动主要活动。但是,在上一个实例onStart()
或onResume()
被调用之前,新实例onSavedInstanceState()
和onStop()
被称为。
结果:用户在点击通知之前丢失了他们对主要活动所做的工作。
如何防止此数据丢失?有没有办法确保在通知打开新实例之前保存它(我使用共享首选项)?
我很惊讶新实例onResume()
在之前的实例onSaveInstanceState()
之前被调用了。我已经研究过使用onPause()
,但文档不鼓励在那里保存数据。
答案 0 :(得分:0)
实时保存数据。
当用户输入时,使用sharedPreferences
(如果您使用TextWatcher()
)立即将其保存在EditText
上。然后在活动onResume()
上预先填写sharedPreferences
上存在的信息。
我没有提供代码,因为您也没有提供任何代码。
答案 1 :(得分:0)
回复提供了两个很好的提示,我能够以各种形式实现。 first from Tenten Ponce用于保存创建时的信息。在我的情况下,我没有从需要TextWatcher
的用户输入文本数据,但我确实实现了一种方法,可以在有意义的情况下实时将数据保存到sharedPreferences
感谢David Wasser's comment原始问题,我还添加了android:launchMode="singleTask"
,效果很好。这个属性似乎在我的应用程序中基于this API guide最有意义。
答案 2 :(得分:0)
如何通过设置launchMode =" singleTask"
将MainActivity限制为Manifest中的单个实例 <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>