共享偏好值关闭应用时丢失了值

时间:2013-02-23 04:09:58

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

我的活动有很少的TextView。

我已经在异步函数中创建了一个服务,它在后台作为警报继续运行,并将数据加载到共享首选项对象中。 我将这些值加载到异步中的那些TextView中。

我在onStart()中也有相同的功能,它在TextView中复制保存的pref值。

当我关闭应用程序(通过在ICS中滑出它们)然后尝试再次打开它们时,pref值未在TextView中加载。

为什么更新方法在onStart中不起作用?这是onStart中的代码:

if(AsyncTaskTestActivity.session != null)
    {
    Log.e("SessionManagement", "onStart");
    updatePref();
    }
else{Log.e("SessionManagement", "falseonStart");}

session是一个静态变量。

由于

3 个答案:

答案 0 :(得分:1)

将偏好设置值加载到onCreate()onResume()中。

答案 1 :(得分:0)

您可以通过设置标志来更改通知中的PendingIntent,以重用上一个活动实例。

类似的东西:

Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_CLEAR_TOP);
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT

您还可以更改活动,以便在onResume()中加载SharedPreferences,此方法在活动创建和恢复期间运行。

编辑:根据您对丢失数据的评论,我为您提供了以下附加代码。我在AsyncTask中使用此代码,并且我没有任何持久性问题。

public final class PreferenceUtils
{
    private static final String TAG                       = PreferenceUtils.class.getSimpleName();

    public static final String  SESSION_ID                = "sessionId";                          //$NON-NLS-1$
    public static final String  NAME                      = "name";                               //$NON-NLS-1$

    private PreferenceUtils()
    {
        // enforcing singleton
        super();
    }

    /**
     * Set sessionId in app preferences to the supplied value.
     * 
     * @param context
     * @param sessionId
     */
    public static void setSessionId(final Context context, final String sessionId)
    {
        final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
        final Editor editor = settings.edit();
        editor.putString(PreferenceUtils.SESSION_ID, sessionId);
        editor.commit();

        if (BuildConfig.DEBUG)
        {
            Log.d(PreferenceUtils.TAG, "Setting sessionId: " + sessionId); //$NON-NLS-1$
        }
    }

    /**
     * Get the current session id
     * 
     * @param context
     * @return session id or null on not activated
     */
    public static String getSessionId(final Context context)
    {
        final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
        return settings.getString(PreferenceUtils.SESSION_ID, null);
    }

    /**
     * Get current name stored in the app preferences
     * 
     * @param context
     * @return
     */
    public static String getName(final Context context)
    {
        final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
        return settings.getString(PreferenceUtils.NAME, null);
    }

    /**
     * Set name in app preferences to the supplied value.
     * 
     * @param context
     * @param name
     */
    public static void setName(final Context context, final String name)
    {
        final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
        final Editor editor = settings.edit();
        editor.putString(PreferenceUtils.NAME, name);
        editor.commit();

        if (BuildConfig.DEBUG)
        {
            Log.d(PreferenceUtils.TAG, "Setting name: " + name); //$NON-NLS-1$
        }
    }

}

答案 2 :(得分:0)

错误在于我在主要活动中创建了pref对象。 当我关闭对象被破坏的主要活动时。 异步任务在后台继续运行并尝试访问该对象但由于它已被破坏而失败。

诀窍是分别在Async中启动另一个对象。