关于android:检查应用程序是否首次运行

Check if application is on its first run

本问题已经有最佳答案,请猛点这里访问。

我是Android开发新手,我想在安装后首先根据应用程序设置一些应用程序的属性。 有没有办法找到应用程序第一次运行,然后设置其第一个运行属性?


以下是使用SharedPreferences实现"首次运行"检查的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MyActivity extends Activity {

    SharedPreferences prefs = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Perhaps set content view here

        prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE);
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (prefs.getBoolean("firstrun", true)) {
            // Do first run stuff here then set 'firstrun' as false
            // using the following line to edit/commit prefs
            prefs.edit().putBoolean("firstrun", false).commit();
        }
    }
}

如果代码运行prefs.getBoolean(...),如果SharedPreferences中没有使用键"firstrun"保存boolean,则表示应用程序从未运行过(因为没有任何东西保存过该键或用户的布尔值已清除应用数据以强制执行"首次运行"方案。如果这不是第一次运行,则行prefs.edit().putBoolean("firstrun", false).commit();将被执行,因此prefs.getBoolean("firstrun", true)实际上将返回false,因为它将覆盖作为第二个参数提供的默认值true。


接受的答案不区分第一次运行和后续升级。只需在共享首选项中设置布尔值,只会告诉您它是否是首次安装应用程序后的第一次运行。稍后如果您想升级您的应用并在第一次升级时进行一些更改,您将无法再使用该布尔值,因为共享首选项会在升级过程中保存。

此方法使用共享首选项来保存版本代码而不是布尔值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import com.yourpackage.BuildConfig;
...

private void checkFirstRun() {

    final String PREFS_NAME ="MyPrefsFile";
    final String PREF_VERSION_CODE_KEY ="version_code";
    final int DOESNT_EXIST = -1;

    // Get current version code
    int currentVersionCode = BuildConfig.VERSION_CODE;

    // Get saved version code
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);

    // Check for first run or upgrade
    if (currentVersionCode == savedVersionCode) {

        // This is just a normal run
        return;

    } else if (savedVersionCode == DOESNT_EXIST) {

        // TODO This is a new install (or the user cleared the shared preferences)

    } else if (currentVersionCode > savedVersionCode) {

        // TODO This is an upgrade
    }

    // Update the shared preferences with the current version code
    prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply();
}

您可能会在主活动中从onCreate调用此方法,以便每次应用启动时都会检查此方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkFirstRun();
    }

    private void checkFirstRun() {
        // ...
    }
}

如果需要,您可以调整代码以执行特定操作,具体取决于用户以前安装的版本。

想法来自这个答案。这些也有帮助:

  • 如何从App的(布局)XML变量中获取Manifest版本号?
  • 代码中AndroidManifest.xml的用户versionName值

如果您在获取版本代码时遇到问题,请参阅以下Q& A:

  • 如何获取Android应用程序的构建版本号?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.UUID;

    import android.content.Context;

    public class Util {
        // ===========================================================
        //
        // ===========================================================

        private static final String INSTALLATION ="INSTALLATION";

        public synchronized static boolean isFirstLaunch(Context context) {
            String sID = null;
            boolean launchFlag = false;
            if (sID == null) {
                File installation = new File(context.getFilesDir(), INSTALLATION);
                try {
                    if (!installation.exists()) {
                    launchFlag = true;                          
                        writeInstallationFile(installation);
                    }
                    sID = readInstallationFile(installation);

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            return launchFlag;
        }

        private static String readInstallationFile(File installation) throws IOException {
            RandomAccessFile f = new RandomAccessFile(installation,"r");// read only mode
            byte[] bytes = new byte[(int) f.length()];
            f.readFully(bytes);
            f.close();

            return new String(bytes);
        }

        private static void writeInstallationFile(File installation) throws IOException {
            FileOutputStream out = new FileOutputStream(installation);
            String id = UUID.randomUUID().toString();
            out.write(id.getBytes());
            out.close();
        }
    }

> Usage (in class extending android.app.Activity)

Util.isFirstLaunch(this);

没有办法通过Android API知道这一点。您必须自己存储一些标志,并使其在SharedPreferenceEditor或使用数据库中保留。

如果你想在这个标志上建立一些许可证相关的东西,我建议你使用LVL库提供的模糊的首选项编辑器。它简单而干净。

问候,
斯特凡


以下是使用SharedPreferences实现'forWhat'检查的示例。

1
2
3
4
5
6
7
8
9
10
    preferences = PreferenceManager.getDefaultSharedPreferences(context);
    preferencesEditor = preferences.edit();
public static boolean isFirstRun(String forWhat) {
    if (preferences.getBoolean(forWhat, true)) {
        preferencesEditor.putBoolean(forWhat, false).commit();
        return true;
    } else {
        return false;
    }
}

只需检查一些偏好,默认值表示它是第一次运行。因此,如果您获得默认值,请进行初始化并将此首选项设置为不同的值,以指示应用程序已初始化。


我不确定这是检查它的好方法。当用户使用设置中的"清除数据"按钮时,情况怎么样? SharedPreferences将被清除,您再次捕获"第一次运行"。这是一个问题。我想最好使用InstallReferrerReceiver。


没有可靠的方法来检测首次运行,因为共享首选项方式并不总是安全的,用户可以从设置中删除共享首选项数据!
更好的方法是使用这里的答案是否有一个独特的Android设备ID?获取设备的唯一ID并将其存储在服务器中的某个位置,因此每当用户启动应用程序时,您都会请求服务器并检查它是否在您的数据库中,或者是新的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SharedPreferences mPrefs;
final String welcomeScreenShownPref ="welcomeScreenShown";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mPrefs = PreferenceManager.getDefaultSharedPreferences(this);

    // second argument is the default to use if the preference can't be found
    Boolean welcomeScreenShown = mPrefs.getBoolean(welcomeScreenShownPref, false);

    if (!welcomeScreenShown) {
        // here you can launch another activity if you like

        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(welcomeScreenShownPref, true);
        editor.commit(); // Very important to save the preference

    }
}

这可能对你有帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class FirstActivity extends Activity {

    SharedPreferences sharedPreferences = null;
    Editor editor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);

        sharedPreferences = getSharedPreferences("com.myAppName", MODE_PRIVATE);
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (sharedPreferences.getBoolean("firstRun", true)) {
         //You can perform anything over here. This will call only first time
                 editor = sharedPreferences.edit();
                 editor.putBoolean("firstRun", false)
                 editor.commit();

        }
    }
}