恢复活动的通知(数据完整)

时间:2014-07-30 17:20:43

标签: android android-intent android-activity android-notifications

我已经看到很多关于这个"问题的问题"但是没有任何实际的答案能够完美运作。

在我的应用程序(健身相关)中,当用户在锻炼期间离开时我发出通知,以便他可以快速返回。

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标记,如果活动正常运行,活动将恢复。

然而,我看到的问题是,只要应用程序在后台运行足够长时间,并且操作系统决定将其杀死;通过通知输入它将启动活动的新实例 - 丢失所有数据。以下是在应用程序处于后台后重新进入应用程序的两种方式,包括我正在寻找的行为。

  1. 按通知。此处出现问题,因为活动已被销毁,并且通知会启动一个新的干净实例,而不会保存任何数据。 这是我的问题......
  2. 按启动器图标。然后,您将被带到应用程序的主要活动,并在关闭此项后,您将被带到已销毁的活动版本并重新启动,并恢复所有状态。 这也是我希望它通过通知的方式。
  3. 此外,我正在保存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>
    

1 个答案:

答案 0 :(得分:1)

无法阻止活动被操作系统杀死,但是,您可以将该数据保存在其他内容上,如SharedPreferences,数据库或文件。以下是有关如何保留数据的指南:Storage Options

或者,您可以使用其他启动模式,例如 singleTask:

  

系统在新任务和路由的根目录下创建活动   意图。但是,如果活动的实例已经存在   存在,系统通过a将意图路由到现有实例   调用它的onNewIntent()方法,而不是创建一个新方法。

或singleInstance:

  

与&#34; singleTask&#34;相同,除了系统没有启动任何其他   活动进入持有实例的任务。活动总是如此   其任务的唯一成员。

然而,这可能会弄乱您的应用和活动流程的处理方式。

参考文献:
Storage Options
Activity Elements: Launch Modes