2011-01-18 11 views
11

私のアプリは最初の実行時にres/rawからsdcardにファイルをコピーします。それ以降のすべてのアプリのアップデートでこれらのファイルを更新したいと思う。どうすれば、すべてのアプリのアップデートでfirstrunの設定をtrueにリセットすることができますか?Android:アプリのアップデート時にFirstRun SharedPreferencesをリセットするにはどうすればいいですか?

/** 
    * get if this is the first run 
    * 
    * @return returns true, if this is the first run 
    */ 
     public boolean getFirstRun() { 
     return mPrefs.getBoolean("firstRun", true); 
    } 

    /** 
    * store the first run 
    */ 
    public void setRunned() { 
     SharedPreferences.Editor edit = mPrefs.edit(); 
     edit.putBoolean("firstRun", false); 
     edit.commit(); 
    } 

    SharedPreferences mPrefs; 

    /** 
    * setting up preferences storage 
    */ 
    public void firstRunPreferences() { 
     Context mContext = this.getApplicationContext(); 
     mPrefs = mContext.getSharedPreferences("myAppPrefs", 0); //0 = mode private. only this app can read these preferences 
    } 

    public void setStatus(String statustext) { 
     SharedPreferences.Editor edit = mPrefs.edit(); 
     edit.putString("status", statustext); 
     edit.commit(); 
     } 

} 

答えて

3

あなたはバージョン番号で、データベース側で行われているものを模倣できます。

は、ここで関連するコードです。 firstRun変数を持つ代わりに、firstRunversionNumberとの組み合わせを1つ持ち、静的バージョン番号フィールドをアプリに追加します。これにより、アプリが更新されたかどうかを確認し、更新ごとに操作を行うことができます。

+0

感謝あなたは答えます!あまりにも多くのことを尋ねるのは嫌ですが、コードスニペットを提供できますか?私はあなたが言っていることを理解していますが、それを実装する方法を考え出すのに苦労しています... –

+1

@ RivieraKidの回答には、私が考えていた実装の種類が含まれています。 –

20

私のアプリでは、共有プリファレンスでアプリのバージョンコードを保存します。起動時に、保存されたバージョンコードが現在のバージョンコードよりも低いかどうかを確認します。そうであれば、私は「何が新しいか」ダイアログを表示します。

は、このコードに旋回を与える - 私は私の主な活動ののonCreateでそれを使用します。

PackageInfo pInfo; 
    try { 
     pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA); 
     if (prefs.getLong("lastRunVersionCode", 0) < pInfo.versionCode) { 
      // TODO: Handle your first-run situation here 

      Editor editor = prefs.edit(); 
      editor.putLong("lastRunVersionCode", pInfo.versionCode); 
      editor.commit(); 
     } 
    } catch (NameNotFoundException e) { 
     // TODO Something pretty serious went wrong if you got here... 
     e.printStackTrace(); 
    } 

のprefsをプライベートSharedPreferencesオブジェクトです。これが本当に最初の実行であり、アップグレードの場合はこれが機能します。最初の実行コードの最後に、editor.putLongは共有環境設定をアプリケーションの現在のバージョンコードで更新し、次回の実行では最初に実行されるコードを起動しません。

これはまた、市場でのアップグレードとみなされるためにはバージョンコードが増加する必要があるため、最初の実行を検出するために別の値を変更する必要はありません。

1

私はこのためのクラスを作成しています。 https://gist.github.com/2509913

使用例でダウンロード:

long versionInstalled = App.getVersionInstalled(this); 
long current_v = App.getVersion(this); 
if(versionInstalled != current_v){ 
    Log.w("TAG", "Veresion not valid"); 
} 
1

実行これをMainActivityのOnCreateイベントで

public void onUpdateFirstRun() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    PackageInfo pInfo; 

    try { 
     pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA); 

     Log.d("VersionCode", pInfo.versionCode + " "); 
     if (prefs.getLong(LAST_RUN_VERSION_CODE_KEY, 0) < pInfo.versionCode) { 

      if (!isInitializedInSP(KEY)) { 

       editor.putString(KEY, ""); 
      } 

      //Finalize and Save 
      editor.putLong(LAST_RUN_VERSION_CODE_KEY, pInfo.versionCode); 
      editor.apply(); 

     } 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

使用方法をあなたはすでに以前のバージョンでそれを初期化していたかどうかを確認するために

public static boolean isInitializedInSP (String key) { 
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContex()); 
    Object o = mPrefs.getAll().get(key); 

    if (o != null) { 
     return true; 
    } 
    else { 
     return false; 
    } 

} 
関連する問題