【问题标题】:Foreground service starting new activity before current activity saves information前台服务在当前活动保存信息之前启动新活动
【发布时间】:2018-01-03 01:28:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么又启动了MainActivity?如果用户单击通知,为什么不直接返回现有的 MainActivity?这会解决你的问题。

标签: android android-intent android-activity service sharedpreferences


【解决方案1】:

如何通过设置 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>

【讨论】:

    【解决方案2】:

    实时保存数据。

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

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

    【讨论】:

    • 为什么要再次启动MainActivity?如果用户单击Notification,为什么不直接返回现有的MainActivity?这会解决你的问题。
    • 好吧,我认为如果他可以检查activity 是否在foreground 中,然后简单地关闭通知,那就太好了。先生,您的想法更好。
    • 对不起,我的意思是评论原始问题,而不是你的答案
    【解决方案3】:

    回复提供了两个很棒的技巧,我能够以各种形式实施。 first from Tenten Ponce 用于在创建信息时保存信息。在我的情况下,我没有从需要TextWatcher 的用户输入的文本数据,但我确实实现了一种在有意义时将数据实时保存到sharedPreferences 的方法。

    感谢David Wasser's comment 在原始问题上,我还添加了android:launchMode="singleTask",效果很好。这个属性似乎在我基于this API guide 的应用程序中最有意义。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多