SharedPreferences在更新/卸载时的行为

6

我正在使用共享首选项来存储我的应用程序启动次数。只有在第一次启动时,我才会显示欢迎消息,告诉用户有关该版本中的新功能和更改。

但是,当我重新安装应用程序或升级应用程序时,我无法删除先前的共享首选项。我希望在重新安装或升级软件时也能获取对话框。

AppLauncher

public class AppLauncher {
    static long launch_count = 0;
    private static boolean isLaunch = false;

    public static void app_launched(Context mContext) {
        System.out.println("I m in AppLauncher");
        SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
        if (prefs.getBoolean("dontshowagain", false)) {
            return;
        }

        SharedPreferences.Editor editor = prefs.edit();

        // Increment launch counter

        launch_count = prefs.getLong("launch_count", 0);
        editor.putLong("launch_count", launch_count);

        System.out.println("launch_count=" + launch_count);
        if (launch_count == 0 || launch_count == 1) {
            // showLaunchDialog(mContext);
            isLaunch = true;
        }
        if (isLaunch == true) {
            showLaunchDialog(mContext);
            isLaunch = false;
        }
        editor.commit();
    }

    public static void showLaunchDialog(Context mcontext) {
        final Dialog dialog = new Dialog(mcontext);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.whatsnew);

        Button dismisButton = (Button) dialog.findViewById(R.id.dismisButtom);
        System.out.println("inside dialog_started");
        dismisButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }
}

你是如何首次创建 sharedPreference 的? - ngesh
4个回答

17

在更新的情况下,没有可以用来清除共享首选项的钩子。

Nikolay是正确的,您可以保存应用程序的版本号,并将其与当前版本号进行比较。

要获取当前版本号,请调用:

this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionCode

如果想要了解包信息中有哪些信息可用,请阅读PackageInfoPackageManager上的文档。


谢谢您提供更多的信息 :) 我认为这就是我需要的 ;) - Harsha M V

13

不要保存一个boolean,而是保存应用程序的版本号。如果当前应用程序的版本号较高(已更新),则显示对话框并更新该数字。


虽然解决方案很简单,但我希望Android SDK能够添加一个简单的钩子,例如用于数据库升级,以避免大量的升级错误并提高鲁棒性(例如,有人可能会在某个时候忘记这个首选项并清除首选项...)。 - Maxim Rahlis

1
如果您没有设置dontShowagin,那么默认情况下会返回false。所以您想要显示对话框并在下一次不显示。只需将首选项中的值更改为true,以便下一次它可以正常工作。此外,您正在增加计数器,但实际上并没有增加它。请使用+1与前一个计数器相加。
SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
            if (prefs.getBoolean("dontshowagain", false)) {
                return;
            }

            SharedPreferences.Editor editor = prefs.edit();

            // Increment launch counter

            editor.putBoolean("dontShowagain",true);
            launch_count = prefs.getLong("launch_count", 0)+1;
            editor.putLong("launch_count", launch_count);

这并不能解决应用程序更新后再次显示对话框的问题。 - Janusz

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接