当前位置: 首页 > 面试题库 >

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

束作人
2023-03-14
问题内容

我试图检测何时使用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>

问题答案:

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

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

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

versionCode 将与您在清单中存储的版本号匹配。



 类似资料:
  • 我有一个用LabVIEW创建的应用程序,我需要在运行时在Windows任务栏上显示/隐藏应用程序图标。我认为WINAPI可以用于此目的,我尝试使用ShowWindow函数(user32.dll) 显示窗口(hWnd,SW_HIDE)- 显示窗口(hWnd,SW_SHOWMINIMIZED)-

  • 我开始尝试boost graph类。为此,我创建了一个简单的示例,如下所示。当通过深度优先搜索算法遍历图形时,我没有添加一个节点。代码如下: 这个的输出是 但是0从何而来,我从未添加过它?这是某种虚拟节点吗?但如果是这样,为什么在遍历时访问它,如何实现所需的行为? 编辑1:经过尝试,PlasmaHH建议,并通过我发现的提升代码进行调试,提升::add_edge调用图的顶点结构的调整大小。因此,搜索

  • 我通常使用以下代码隐藏键盘: 该代码总是为我工作,但现在我试图使用它来隐藏它当用户失去焦点从AlertDialog,我有一个警报对话框,包含一个视图与编辑文本和按钮 不幸的是,我得到的结果是,键盘隐藏并立即打开,我有什么选择隐藏键盘时,失去了我的AlertDialog的焦点?

  • 我有一个桌子,它的膨胀和折叠,但它变得太乱,无法使用它,IE和Firefox不能正常工作。 下面是JavaScript代码: 和示例HTML: 问题是,我对每一个都使用一个ID,这是非常烦人的,因为我想为每个父级和很多父级都有很多隐藏行,所以要处理的ID太多了。IE和FireFox只显示第一个隐藏行,而不显示其他行。我怀疑发生这种情况是因为我将所有ID触发在一起使其工作。我认为如果我使用类而不是I

  • 主要内容:实例,jQuery hide() 和 show(),实例,实例,实例,jQuery toggle(),实例隐藏、显示、切换,滑动,淡入淡出,以及动画,哇哦! 因为时间是宝贵的,我们提供快捷方便的学习方法。 在小牛知识库,你可以学习需要的知识。 实例 jQuery hide() 简单的jQuery hide()方法演示。 jQuery hide() 另一个hide()实例。演示如何隐藏文本。 jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和

  • 我正在试着在Proguard打开的情况下测试Android应用程序的发布版本。我已经为测试依赖项创建了其他Proguard规则文件,该文件包含在发布规则文件中。 一切编译都很好,但在运行时失败。 我正在使用Espresso进行测试,仪表运行器在中定义 是否有机会为预发布版本运行测试?我从五月份就找到了这个话题,看起来这是不可能的。对我来说,这看起来只是错误的Proguard配置(缺少方法),但这行