1

TextView がほとんどないアクティビティがあります。

バックグラウンドでアラームとして実行され、共有設定オブジェクトにデータをロードするサービスを非同期関数で作成しました。これらの値を非同期の TextViews にロードします。

onStart() にも同じ関数があり、TextView に保存された設定値をコピーします。

アプリを (ICS でスライドして) 閉じてから再度開こうとすると、優先値が TextView に読み込まれません。

update メソッドが onStart で機能しないのはなぜですか? onStart のコードは次のとおりです。

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

セッションは静的変数です。

ありがとう

4

3 に答える 3

1

onCreate()代わりにandに設定値をロードしますonResume()

于 2013-02-23T04:28:37.643 に答える
0

間違いは、メイン アクティビティで pref オブジェクトを作成していたことです。オブジェクトが破棄されたメインアクティビティを閉じたとき。非同期タスクはバックグラウンドで実行され続け、そのオブジェクトにアクセスしようとしましたが、破棄されたため失敗しました。

秘訣は、非同期で別のオブジェクトを個別に開始することでした。

于 2013-03-14T07:18:25.067 に答える
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

SharedPreferences が onResume() にロードされるようにアクティビティを変更することもできます。このメソッドは、アクティビティの作成および再開中に実行されます。

編集: データを失うことについてのコメントに従って、次の追加コードを提供します。このコードを 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$
        }
    }

}
于 2013-02-23T04:23:01.713 に答える