2011-08-05 4 views
27

ブロードキャストレシーバを使用してアプリケーションがアップグレードされたことを検出して、アプリケーションクラスにブール値を設定しようとしています。このブール値は、EULAダイアログボックスをユーザーに表示するかどうかを決定するために、いくつかのブール値と組み合わせて使用​​されます。Androidアプリのアップグレードを検出し、EULAの表示/非表示のアプリケーションクラスのブール値を設定します

私はそれを正しく設定しましたが、EULAはそれがしてはいけないときにはまだ表示されています。特に、ユーザーが以前のバージョンでEULAを既に受け入れている場合、EULAはアップグレードするバージョンで(私によって手動で設定された)変更されず、アプリケーションはアップグレードされています。

私のアプリケーションが実行されていないため、isAppUpgrade()メソッドが呼び出されておらず、正しいブール値フラグが設定されていないためです。誰かがこれを認めることができますか、または私のコードに何か間違っていますか?

FYI - EULA.show(Activity、boolean、boolean)静的メソッドは、私のメインアクティビティで最初に呼び出されています。

ここではいくつかのコード

アプリケーションクラス

public class MFCApplication extends Application { 

    private boolean isUpgrade = false; 

    /** 
    * Returns a manually set value of whether the EULA has changed in this version of the App 
    * @return true/false 
    */ 
    public boolean hasEULAChanged() { 
     return false; 
    } 

    /** 
    * Returns whether or not the application has been upgraded. Set by the UpgradeBroadcastReceiver 
    * @return true/false 
    */ 
    public boolean isAppUpgrade() { 
     return isUpgrade; 
    } 

    /** 
    * Method called by UpgradeBroadcastReceiver if the App has been upgraded 
    */ 
    public void setAppIsUpgrade() { 
     this.isUpgrade = true; 
    } 
} 

BroadcastReceiver

public class UpgradeBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent == null) 
      return; 
     if (context == null) 
      return; 

     String action = intent.getAction(); 
     if (action == null) 
      return; 

     if (action.equals(Intent.ACTION_PACKAGE_REPLACED)) { 
      MFCApplication myApp = ((MFCApplication)((Activity)context).getApplication()); 

      myApp.setAppIsUpgrade(); 
     } 
    } 
} 

EULAクラス

です
public class EULA { 

    private static final String EULA_ASSET = "EULA"; 
    private static final String EULA_PREFERENCES = "eula"; 
    private static Activity mActivity; 

    private static PackageInfo getPackageInfo() { 
     PackageInfo pi = null; 
     try { 
      pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES); 
     } catch (PackageManager.NameNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     return pi; 
    } 

    public static boolean show(Activity activity, boolean hasEULAChanged, boolean isAppUpgrade) { 
     mActivity = activity; 
     final SharedPreferences preferences = activity.getSharedPreferences(EULA_PREFERENCES, Activity.MODE_PRIVATE); 
     final PackageInfo packageInfo = getPackageInfo(); 
     String eulaPref = preferences.getString(EULA_PREFERENCES, "0"); 
     boolean eulaVersionAccepted = packageInfo.versionName.equals(eulaPref); 
     if (!eulaVersionAccepted && (hasEULAChanged || !isAppUpgrade)) { 
      //The EULA should be shown here, but it isn't 
      return false; 
     } 
     return true; 
    } 
} 

アプリケーションマニフェスト

<receiver android:name=".helpers.UpgradeBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
     <data android:scheme="package" android:path="com.hookedroid.fishingcompanion" /> 
    </intent-filter> 
</receiver> 
+0

実際に私は、アプリケーションが置き換えられているときにインテントを取得しますが、多分それはEclipseだけでアプリをインストールするためですか? –

答えて

54

それはちょうどあなたの現在のアプリのバージョンを確認するためにはるかに簡単です。

アプリが起動すると、SharedPreferencesのバージョンコードで整数値がチェックされます。一致しない場合、または一致しない場合は、EULAを表示します。ユーザーがEULAを承認した後、versionCode値をSharedPreferencesに書き込みます。

versionCodeは、マニフェストに保存されているバージョン番号と一致します。

+0

ありがとうEboMike!私がこれを投稿するとすぐに、私は簡単な方法があることを認識しました(これは後でここにあります)。これはあなたが提案しているものです。また、EULAを受け入れたが、このバージョンでEULAが変更された場合は、EULAを表示することを確認します。ありがとう! – hooked82

19

は、独創的なアプローチによると、I'veはアプリがBroadcastReceiver

public YourUpgradeReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Uri packageName = intent.getData(); 
     if(packageName.toString().equals("package:" + context.getPackageName()){ 
      //Application was upgraded 
     } 
    } 
} 

を使用してアップグレードし、アプリケーションが更新されている場合は、あなたのマニフェスト

<receiver android:name=".YourUpgradeReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.PACKAGE_REPLACED"/> 
       <data android:scheme="package"/> 
      </intent-filter> 
</receiver> 
+0

どちらが一番良いですか?あなたのものか「EboMike」の提案? – AndiGeeky

+2

あなたは自分で簡単な質問をする必要があります:イベントベースのアプローチが必要なのか、アプリの特定の時点でそれを確認するだけで十分ですか?あなたのアプリが更新された瞬間にその情報が必要な場合は、私のソリューション(例:バックグラウンドサービス)に進んでください。次のアプリケーションの開始時にそれを知るだけで十分な場合は、もう一方のソリューションを取ってください。しかし、あなたは私の解決策を取って、EboMikesのような同じ振る舞いを理論的に近づけるために、後でチェックすることができるものを書くこともできます。 –

+0

どうすればテストできますか? –

4

で検出されたかどうかを検出するために、それを管理します

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
int versionCode = sharedPreferences.getInt("VERSION_CODE", BuildConfig.VERSION_CODE); 

if(versionCode != BuildConfig.VERSION_CODE) { 
    onAppUpdated(); 
} 

sharedPreferences.edit().putInt("VERSION_CODE", BuildConfig.VERSION_CODE).apply(); 
0

ここには簡単な方法がありますあなたの問題を解決することができます。 あなたのコードでは、簡単にアプリケーションのversionCodeとversionNameを取得できます。最初にGCMを登録してから、versionNameをsharedPreferencesに保存します。あなたのホームアクティビティでは、isAppUpdated()をチェックします。現在のAPP VERSION_NAMEが保存されているVERSION_NAMEと一致しない場合は、GCM IDを再登録してください。ここで

はサンプルコードです:嗜好の

保存VersionName:ここ

public static boolean isAppUpdated(Context context){ 
     boolean result=false; 
     try{ 
      PackageInfo packageInfo = context.getPackageManager() 
        .getPackageInfo(context.getPackageName(), 0); 
      int versionCode = packageInfo.versionCode; 
      String versionName=packageInfo.versionName; 

      String prevVersionName= GET STORED VERSION_NAME; 
      if(prevVersionName!=null && !prevVersionName.equals("") && 
        !prevVersionName.equals(versionName)){ 
       showLog("App Updated"); 
       result=true; 
      }else{ 
       showLog("App Not updated"); 
      } 

     }catch(Exception e){ 
     } 
     return result; 
    } 

、isAppUpdated()が真の意味を返す場合:アプリケーションがアップグレードされる

public static void saveVersionNameAndCode(Context context){ 
     try{ 
      PackageInfo packageInfo = context.getPackageManager() 
        .getPackageInfo(context.getPackageName(), 0); 
      int versionCode = packageInfo.versionCode; 
      String versionName=packageInfo.versionName; 

      CommonTasks.showLog("Saving APP VersionCode and Version Name"); 

      // SAVE YOUR DATA 

     }catch(Exception e){ 
     } 
    } 

チェックGCM IDを再登録する必要があります。

関連する問題