Android如何检查应用程序是否是第一次安装或非第一次安装。

35 浏览
0 Comments

Android如何检查应用程序是否是第一次安装或非第一次安装。

我正在开发一款Android应用程序。当应用程序首次启动时,我需要执行某些操作,也就是说,该代码仅在程序首次启动时运行。

0
0 Comments

使用SharedPreferences可以确定应用程序是否是“第一次”启动。

只需使用一个布尔变量("my_first_time"),并在“第一次”任务完成时将其值更改为false。

以下是我用来捕捉第一次打开应用程序的代码:

final String PREFS_NAME = "MyPrefsFile";
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
if (settings.getBoolean("my_first_time", true)) {
    //the app is being launched for first time, do something        
    Log.d("Comments", "First time");
    // first time task
    // record the fact that the app has been started at least once
    settings.edit().putBoolean("my_first_time", false).commit(); 
}

当应用程序在Google Play商店上更新到下一个版本时,它能否处理?

SharedPreferences在升级期间会保留。因此,我假设当应用程序从PlayStore升级时,旧值是可用的。实际上,这也适用于其他方法,例如检查文件的存在。在这种情况下,使用不同的首选项/文件名称或值的快捷方法可能会有所帮助。

类似以下代码可能对你有所帮助:

public void CheckAndInitAppFirstTime() {
    final String PREFS_NAME = "TheAppVer";
    final String CHECK_VERSION = "1"; //Required ver...
    final String KEY_NAME = "CheckVersion";
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    if (!settings.getString(KEY_NAME, "0").equals(CHECK_VERSION)) {
        //the app is being launched for first time, do something or CHECK_VERSION is different
        //...
        settings.edit().putString(KEY_NAME, CHECK_VERSION).commit();
    }
}

根据getBoolean的描述,如果getBoolean的第一个参数不存在,第二个参数是默认值。因此,如果“my_first_time”尚未设置,表达式的默认值为true。

使用SharedPreferences存在一个问题。如果您有一个备份规则来恢复SharedPreferences,并且用户在某个时间点重新安装您的应用程序。

0
0 Comments

这段代码的目的是检查Android应用程序是否第一次安装或者当前版本是否第一次安装。该问题的出现原因是需要在应用程序每次启动时判断是否为第一次启动或者当前版本的第一次启动,以便进行相应的操作,比如显示“新功能”对话框或者展示新手教程。

解决方法是通过存储应用程序的版本号来判断是否为第一次启动或者当前版本的第一次启动。代码中使用了一个枚举类型AppStart来表示不同的启动情况,包括第一次启动(FIRST_TIME)、当前版本的第一次启动(FIRST_TIME_VERSION)和正常启动(NORMAL)。通过比较应用程序的版本号和上一次启动时保存的版本号,可以确定启动的情况。

具体实现的代码如下:

public enum AppStart {
    FIRST_TIME, FIRST_TIME_VERSION, NORMAL;
}
public AppStart checkAppStart() {
    PackageInfo pInfo;
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    AppStart appStart = AppStart.NORMAL;
    try {
        pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        int lastVersionCode = sharedPreferences
                .getInt(LAST_APP_VERSION, -1);
        int currentVersionCode = pInfo.versionCode;
        appStart = checkAppStart(currentVersionCode, lastVersionCode);
        // Update version in preferences
        sharedPreferences.edit()
                .putInt(LAST_APP_VERSION, currentVersionCode).commit();
    } catch (NameNotFoundException e) {
        Log.w(Constants.LOG,
                "Unable to determine current app version from pacakge manager. Defenisvely assuming normal app start.");
    }
    return appStart;
}
public AppStart checkAppStart(int currentVersionCode, int lastVersionCode) {
    if (lastVersionCode == -1) {
        return AppStart.FIRST_TIME;
    } else if (lastVersionCode < currentVersionCode) {
        return AppStart.FIRST_TIME_VERSION;
    } else if (lastVersionCode > currentVersionCode) {
        Log.w(Constants.LOG, "Current version code (" + currentVersionCode
                + ") is less then the one recognized on last startup ("
                + lastVersionCode
                + "). Defenisvely assuming normal app start.");
        return AppStart.NORMAL;
    } else {
        return AppStart.NORMAL;
    }
}

该代码可以在任何继承了Context的类中使用,比如Activity和Service。在Activity中使用的示例代码如下:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        switch (checkAppStart()) {
            case NORMAL:
                // We don't want to get on the user's nerves
                break;
            case FIRST_TIME_VERSION:
                // TODO show what's new
                break;
            case FIRST_TIME:
                // TODO show a tutorial
                break;
            default:
                break;
        }
        // ...
    }
    // ...
}

通过调用checkAppStart()方法来检查应用程序的启动情况。需要注意的是,在第一次调用该方法后,后续的调用将只会返回NORMAL,直到应用程序再次启动。因此,可以考虑缓存结果来提高性能。

此外,还提供了一个JUnit测试来验证基本逻辑的正确性。

通过上述方法,可以轻松地判断应用程序是否第一次安装或者当前版本是否第一次安装,并根据不同的启动情况进行相应的操作。

0
0 Comments

Android如何检查应用程序是第一次安装还是重新安装

在Android应用程序中,有时需要知道用户是第一次安装应用程序还是重新安装。以下是一些关于此的问题和解决方案。

一种方法是使用Shared Preferences中的设置。与检查空文件的一般思路相同,但是这样就不会有一个空文件在那里,不被用来存储任何内容。

但是要注意,这种方法在带有Android Froyo的三星Galaxy S上可能无法正常工作。这是因为SharedPreferences保存时存在一个错误。以下是关于这个问题的一个SO问题的链接:stackoverflow.com/questions/7296163/…以及这是关于Google代码的问题的链接:code.google.com/p/android/issues/detail?id=14359

另外,需要注意的是,在Android 6.0(API 23 - Marshmallow)或更高版本中,自动备份(developer.android.com/guide/topics/data/autobackup.html)默认情况下是启用的。如果用户卸载然后重新安装应用程序,共享偏好设置将被恢复。因此,在重新安装后,如果这是一个问题,您无法检查应用程序是否第一次运行。

从Android Marshmallow开始,上述答案已经不再有效。

但是自动备份也保存了大多数其他数据。因此,重新安装的应用程序可能预期处于非首次运行状态。而且用户已经使用过该应用程序,所以没有必要提供指导。因此,我认为对大多数情况来说,这是件好事。

你知道任何解决这个问题的技巧吗?我的特定用例就是你描述的;我想知道应用程序何时被重新安装。

尝试排除共享偏好设置或禁用备份: developer.android.com/guide/topics/data/…。但是遗憾的是,这会破坏我应用程序的另一部分功能,所以对我来说不是一个可行的解决方案。

0