Проверьте, включено ли приложение в первый раз

Я новичок в разработке 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 не сохранен boolean с ключом "firstrun", то это означает, что приложение никогда не запускалось (поскольку ничто никогда не сохраняло логическое значение с этим ключом или пользователь очистил данные приложения, чтобы заставить сценарий "первого запуска" ). Если это не первый запуск, то строка prefs.edit().putBoolean("firstrun", false).commit(); будет выполнена и, следовательно, prefs.getBoolean("firstrun", true) будет фактически возвращать значение false, поскольку оно переопределяет значение по умолчанию, указанное в качестве второго параметра.

Ответ 2

В принятом ответе не проводится различие между первым запуском и последующими обновлениями. Просто установка логических в общих настройках будет только указывать, является ли это первым запуском после того, как приложение было впервые установлено. Позже, если вы хотите обновить свое приложение и внести некоторые изменения в первый запуск этого обновления, вы больше не сможете использовать это логическое значение, потому что общие настройки сохраняются в обновлениях.

Этот метод использует общие настройки для сохранения кода версии, а не логического.

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

Если вам нужно, вы можете настроить код для выполнения определенных действий в зависимости от того, какую версию ранее установил пользователь.

Идея пришла из этого ответа. Они также полезны:

Ответ 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

Просто проверьте для некоторых предпочтений значение по умолчанию, указывающее, что это первый запуск. Поэтому, если вы получаете значение по умолчанию, выполните инициализацию и установите это предпочтение в другое значение, чтобы указать, что приложение уже инициализировано.

Ответ 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

Это может помочь вам

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

        }
    }
}

Ответ 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

Я не уверен, что это хороший способ проверить это. Как насчет случая, когда пользователь использует кнопку "очистить данные" из настроек? SharedPreferences будут очищены, и вы снова поймаете "первый запуск". И это проблема. Я предполагаю, что лучше использовать InstallReferrerReceiver.