Check if application is on its first run
我是Android开发新手,我想在安装后首先根据应用程序设置一些应用程序的属性。 有没有办法找到应用程序第一次运行,然后设置其第一个运行属性?
以下是使用
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(); } } } |
如果代码运行
接受的答案不区分第一次运行和后续升级。只需在共享首选项中设置布尔值,只会告诉您它是否是首次安装应用程序后的第一次运行。稍后如果您想升级您的应用并在第一次升级时进行一些更改,您将无法再使用该布尔值,因为共享首选项会在升级过程中保存。
此方法使用共享首选项来保存版本代码而不是布尔值。
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(); } |
您可能会在主活动中从
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知道这一点。您必须自己存储一些标志,并使其在
如果你想在这个标志上建立一些许可证相关的东西,我建议你使用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(); } } } |