Android 检查应用程序是否第一次运行

Android 检查应用程序是否第一次运行,android,Android,我是android开发新手,我想根据安装后首次运行的应用程序设置一些应用程序的属性。有没有办法找到应用程序是第一次运行,然后设置它的第一次运行属性?只需检查一些默认值以指示它是第一次运行。因此,如果您获得默认值,请进行初始化并将此首选项设置为不同的值,以指示应用程序已初始化。通过Android API无法知道这一点。您必须自己存储一些标志,并将其保存在SharedReferenceEditor或使用数据库中 如果您想基于此标志创建一些与许可证相关的内容,我建议您使用LVL库提供的模糊首选项编辑器

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

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

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

如果您想基于此标志创建一些与许可证相关的内容,我建议您使用LVL库提供的模糊首选项编辑器。它既简单又干净

问候,,
Stephane

以下是使用
SharedReferences
实现“首次运行”检查的示例

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(…)
如果
SharedReferences
中没有使用键“firstrun”保存
boolean
,则表示应用程序从未运行过(因为没有使用该键保存布尔值,或者用户已清除应用程序数据以强制执行“首次运行”场景)。如果这不是第一次运行,则行
prefs.edit().putBoolean(“firstrun”,false.commit()将被执行,因此
prefs.getBoolean(“firstrun”,true)
将实际返回false,因为它覆盖了作为第二个参数提供的默认true。

没有可靠的方法检测第一次运行,因为共享首选项方式并不总是安全的,用户可以从设置中删除共享首选项数据!
    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);

更好的方法是使用此处的答案获取设备的唯一ID,并将其存储在服务器中的某个位置,因此,每当用户启动应用程序时,您都会请求服务器并检查它是否存在于您的数据库中或是新的应用程序。

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

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

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
中调用此方法,以便在每次启动应用程序时检查它

public class MainActivity extends AppCompatActivity {

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

        checkFirstRun();
    }

    private void checkFirstRun() {
        // ...
    }
}
如果需要,可以根据用户以前安装的版本调整代码以执行特定的操作

这个想法来自于。这些措施也很有帮助:

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

    • 这可能会对您有所帮助

      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();
      
              }
          }
      }
      

      下面是使用SharedReferences实现“forWhat”检查的示例

          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;
          }
      }
      

      我不确定这是检查它的好方法。当用户从设置中使用“清除数据”按钮时,情况如何?SharedReferences将被清除,您将再次捕获“首次运行”。这是个问题。我想最好使用InstallReferrerReceiver。

      嗯,好吧……我是android新手,所以我想我必须先研究一下偏好……无论如何,谢谢。如果用户卸载并重新安装怎么办?用户升级时如何?@Squonk您能告诉我将代码分别放在onCreate()和onResume()中的好处吗?出于好奇,为什么我们在
      onResume()中使用
      putBoolean
      ?为什么这不能在
      onCreate()
      函数中?尽管我更喜欢,但效果不错。无论如何,有一点需要注意的是,
      firstrun
      的值在存在时总是
      false
      。尽管此值实际上并不重要,但更常见和常规的做法是将
      false
      作为布尔值的默认值。如果我使用这种方法,我将使用
      appHasRunBefore
      首选项,如下所示
      If(prefs.getBoolean(“appHasRunBefore”,false)){/*这不是第一次运行*/}否则{/*执行第一次运行*/prefs.edit().putBoolean(“appHasRunBefore”,true.commit();}
      Hi如果用户清除了应用数据怎么办?共享首选项数据将被清除,对吗?如果应用程序设置了android:allowBackup=“true”(默认设置为true),并且在卸载后安装时恢复SharedReference,同时在设备上启用备份,则此操作将不起作用。因此,还要确保在AndroidManifest.xml.+1中设置android:allowBackup=“false”,以便考虑升级,同时也为了提供一个比首选项更优雅的解决方案,而首选项的值实际上并不重要(因为
      firstrun
      ,如果存在,将始终是
      false
      )。另外,我个人认为期望
      true
      作为首选项的默认值(不存在时)不是那么直观,如果您将共享优先权布尔值的默认值检查为FALSE,并检查其值是否为FALSE,则在卸载应用程序或清除缓存之前,如果您升级应用程序,则该值将保持为TRUE。您已经正确地指出了由“清除数据”引起的问题,但没有人解决该问题。当应用程序被侧向加载时,你的解决方案如何工作?谷歌说“你的应用程序可以监听系统广播意图。动作\程序包\第一次启动,以确定应用程序的第一次执行。”。但我很难做到这一点,因为似乎没有广播的意图——除非是从谷歌Play安装的-
          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;
          }
      }