检测Android应用程序升级并设置应用程序类布尔值来显示/隐藏EULA

我试图检测我的应用程序已经升级使用BroadcastReceiver,并在我的应用程序类中设置布尔值。 此布尔值将与其他一些布尔值一起使用,以确定是否向用户显示EULA对话框。

我相信我已经正确设置了所有设置,但EULA在不应该显示时仍然显示。 具体来说,当用户已经接受以前版本的EULA时,EULA在升级到(由我手动设置)的版本中没有改变,并且应用正在升级。

我相信这是不工作的原因是因为我的应用程序没有运行,因此isAppUpgrade()方法没有被调用,并设置正确的布尔标志。 有人可以证实这是事实,或者我的代码有什么问题吗?

仅供参考 – EULA.show(Activity,boolean,boolean)静态方法在我的Main活动中被称为第一件事。

这是一些代码

应用程序类

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; } } 

广播接收器

 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> 

Solutions Collecting From Web of "检测Android应用程序升级并设置应用程序类布尔值来显示/隐藏EULA"

检查您当前的应用程序版本要容易得多。

 PackageInfo packageInfo = activity.getPackageManager() .getPackageInfo(activity.getPackageName(), 0); int versionCode = packageInfo.versionCode; 

当您的应用程序启动时,您检查您的SharedPreferences与版本代码的整数值。 如果没有,或者不匹配,则显示EULA。 在用户接受EULA之后,将versionCode值写入SharedPreferences。

versionCode将与您在Manifest中存储的版本号相匹配。

根据原来的方法,我已经pipe理它检测应用程序是否升级使用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> 

检测应用程序是否已更新

 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(); 

这是一个简单的方法,可以解决你的问题。 在您的代码中,您可以轻松获取应用程序versionCode和versionName。 在注册GCM之后的第一次安装中,将versionName保存在sharedPreferences中。 在您的家庭活动中,您检查isAppUpdated()。 如果当前APP VERSION_NAME与存储的VERSION_NAME不匹配,则重新注册GCM ID。

这里是示例代码:

在首选项中保存VersionName:

 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){ } } 

检查应用程序升级:

 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()返回true意味着你必须重新注册GCM ID。