Я новичок в разработке 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.