Проверьте, запущено ли приложение при первом запуске
Я новичок в разработке для Android и хочу настроить некоторые атрибуты приложения, основываясь на том, что приложение запускается после установки. Есть ли способ узнать, что приложение запускается в первый раз, а затем настроить его атрибуты первого запуска?
10 ответов
Ниже приведен пример использования 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(...)
если нет boolean
сохранено в SharedPreferences
затем с ключом "firstrun", который указывает, что приложение никогда не запускалось (потому что ничего не сохранило логическое значение с этим ключом, или пользователь очистил данные приложения, чтобы вызвать сценарий "первого запуска"). Если это не первый запуск, то строка prefs.edit().putBoolean("firstrun", false).commit();
будет казнен и, следовательно, prefs.getBoolean("firstrun", true)
фактически вернет false, так как переопределяет значение по умолчанию, указанное в качестве второго параметра.
Принятый ответ не различает первый запуск и последующие обновления. Просто установив логическое значение в общих настройках, вы узнаете, будет ли это первый запуск после первой установки приложения. Позже, если вы захотите обновить свое приложение и внести некоторые изменения при первом запуске этого обновления, вы больше не сможете использовать это логическое значение, поскольку общие настройки сохраняются при всех обновлениях.
Этот метод использует общие настройки для сохранения кода версии, а не логическое значение.
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() {
// ...
}
}
Если вам нужно, вы можете настроить код так, чтобы он выполнял определенные функции в зависимости от того, какую версию ранее установил пользователь.
Идея пришла из этого ответа. Это также полезно:
- Как получить номер версии манифеста из XML-переменных приложения (макета)?
- Значение versionName пользователя AndroidManifest.xml в коде
Если у вас возникли проблемы с получением кода версии, см. Следующие вопросы и ответы:
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. Вы должны хранить какой-то флаг самостоятельно и сохранять его либо в SharedPreferenceEditor
или используя базу данных.
Если вы хотите использовать для этого флага какие-то связанные с лицензией вещи, я предлагаю вам использовать скрытый редактор предпочтений, предоставляемый библиотекой LVL. Это просто и чисто.
С уважением, Стефан
Я не уверен, что это хороший способ проверить это. А как насчет случая, когда пользователь использует кнопку "очистить данные" из настроек? SharedPreferences будет очищен, и вы поймете "первый запуск" снова. И это проблема. Я думаю, что лучше использовать InstallReferrerReceiver.
Просто проверьте некоторые предпочтения со значением по умолчанию, указывающим, что это первый запуск. Поэтому, если вы получаете значение по умолчанию, выполните инициализацию и установите для этого предпочтения другое значение, чтобы указать, что приложение уже инициализировано.
Ниже приведен пример использования 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;
}
}
Не существует надежного способа обнаружения первого запуска, так как способ общих настроек не всегда безопасен, пользователь может удалить данные общих настроек из настроек! лучше использовать ответы здесь. Существует ли уникальный идентификатор устройства Android? чтобы получить уникальный идентификатор устройства и сохранить его где-нибудь на вашем сервере, поэтому каждый раз, когда пользователь запускает приложение, вы запрашиваете сервер и проверяете, есть ли оно в вашей базе данных или оно новое.
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
}
}
Это может помочь вам
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();
}
}
}