检查应用程序是不是首次运行[重复]

Posted

技术标签:

【中文标题】检查应用程序是不是首次运行[重复]【英文标题】:Check if application is on its first run [duplicate]检查应用程序是否首次运行[重复] 【发布时间】:2011-11-05 06:20:56 【问题描述】:

我是 android 开发的新手,我想根据安装后首次运行的应用程序设置一些应用程序的属性。有什么方法可以发现应用程序是第一次运行,然后设置它的首次运行属性?

【问题讨论】:

【参考方案1】:

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

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。

【讨论】:

@Squonk 你能告诉我将代码分别放在 onCreate() 和 onResume() 中的好处吗? 出于好奇,为什么我们在onResume()中使用putBoolean的部分?为什么这不能在onCreate() 函数中? 尽管我更喜欢Suragch's answer,但这很好用。无论如何,要注意的是firstrun 的值在存在时将始终为false。尽管这个值并不重要,但将false 视为布尔值的默认值更为常见和传统。如果我使用这种方法,我将通过以下方式使用appHasRunBefore 首选项if (prefs.getBoolean("appHasRunBefore", false)) /* This is not the first run */ else /* Do first run stuff */ prefs.edit().putBoolean("appHasRunBefore", true).commit(); 您好,如果用户清除应用数据怎么办?共享偏好数据会被清除吧? 如果应用设置了 android:allowBackup="true"(默认设置为 true),并且在设备上启用备份时卸载后安装时恢复 sharedpreference,这将不起作用。所以还要确保在 AndroidManifest.xml 中设置 android:allowBackup="false"。【参考方案2】:

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

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

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() 
        // ...
    

如果需要,您可以根据用户之前安装的版本调整代码以执行特定操作。

想法来自this answer。这些也很有帮助:

How can you get the Manifest Version number from the App's (Layout) XML variables? User versionName value of AndroidManifest.xml in code

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

How to get the build/version number of your Android application?

【讨论】:

+1 用于考虑升级,但也用于提供比具有价值并不重要的偏好更优雅的解决方案(因为firstrun,如果存在,将始终为false) .此外,我个人认为,将 true 作为首选项的默认值(当不存在时)并不那么直观,应尽可能避免。 如果您将 share Preference Boolean 的默认值检查为 FALSE,并且您检查它的值是否为 False,使其为 TRUE,如果您升级应用程序直到您卸载应用程序或清除缓存,它将保持为真 【参考方案3】:
    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);

【讨论】:

【参考方案4】:

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

如果您想在此标志上创建一些与许可证相关的内容,我建议您使用 LVL 库提供的混淆首选项编辑器。简单干净。

问候, 斯蒂芬

【讨论】:

【参考方案5】:

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

【讨论】:

您正确地指出了由没有人解决的“清晰数据”引起的问题。当应用程序被侧载时,您的解决方案如何工作?【参考方案6】:

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

【讨论】:

嗯好的....我是 android 新手,所以我想我首先必须研究偏好...无论如何谢谢【参考方案7】:

以下是使用 SharedPreferences 实现“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;
    

【讨论】:

【参考方案8】:

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

【讨论】:

如果用户卸载重装怎么办?用户升级的时候呢?【参考方案9】:
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

    

【讨论】:

【参考方案10】:

这可能对你有帮助

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

        
    

【讨论】:

Google 说“你的应用可以监听系统广播 Intent.ACTION_PACKAGE_FIRST_LAUNCH 来识别应用的第一次执行。”这里developer.android.com/google/play/installreferrer/library。但我很难做到这一点,因为似乎没有广播意图 - 除非从 Google Play 安装 -

以上是关于检查应用程序是不是首次运行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查应用程序的另一个实例是不是正在运行[重复]

检查服务是不是正在运行[重复]

我如何检查运行我的应用程序的 Android 设备是不是在 4.2.2 及更低版本上运行 [重复]

检查用户是不是在 Android 的 Firebase Google 身份验证中首次通过身份验证

如何检查 WPF 应用程序是不是已在运行? [复制]

检查用户输入是不是为 NaN [重复]