Определите, используется ли приложение Android в первый раз

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

Другая идея – использовать параметр в общих настройках. Такая же общая идея, как проверка пустого файла, но тогда у вас нет пустого файла, плавающего вокруг, не используемого для хранения чего-либо

Вы можете использовать SharedPreferences, чтобы определить, запущено ли приложение «Первый раз». Просто используйте логическую переменную («my_first_time») и измените ее значение на « ложь», когда ваша задача «в первый раз» закончена.

Это мой код, чтобы поймать первый раз, когда вы открываете приложение:

final String PREFS_NAME = "MyPrefsFile"; SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); if (settings.getBoolean("my_first_time", true)) { //the app is being launched for first time, do something Log.d("Comments", "First time"); // first time task // record the fact that the app has been started at least once settings.edit().putBoolean("my_first_time", false).commit(); } 

Я предлагаю не только хранить логический флаг, но и полный код версии. Таким образом, вы можете также запросить в начале, если это первый запуск в новой версии. Вы можете использовать эту информацию для отображения, например, диалогового окна «Что нового».

Следующий код должен работать из любого класса Android, который «является контекстом» (действия, службы, …). Если вы предпочитаете его в отдельном классе (POJO), вы можете использовать «статический контекст», как описано здесь, например.

 /** * Distinguishes different kinds of app starts: <li> * <ul> * First start ever ({@link #FIRST_TIME}) * </ul> * <ul> * First start in this version ({@link #FIRST_TIME_VERSION}) * </ul> * <ul> * Normal app start ({@link #NORMAL}) * </ul> * * @author schnatterer * */ public enum AppStart { FIRST_TIME, FIRST_TIME_VERSION, NORMAL; } /** * The app version code (not the version name!) that was used on the last * start of the app. */ private static final String LAST_APP_VERSION = "last_app_version"; /** * Finds out started for the first time (ever or in the current version).<br/> * <br/> * Note: This method is <b>not idempotent</b> only the first call will * determine the proper result. Any subsequent calls will only return * {@link AppStart#NORMAL} until the app is started again. So you might want * to consider caching the result! * * @return the type of app start */ public AppStart checkAppStart() { PackageInfo pInfo; SharedPreferences sharedPreferences = PreferenceManager .getDefaultSharedPreferences(this); AppStart appStart = AppStart.NORMAL; try { pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); int lastVersionCode = sharedPreferences .getInt(LAST_APP_VERSION, -1); int currentVersionCode = pInfo.versionCode; appStart = checkAppStart(currentVersionCode, lastVersionCode); // Update version in preferences sharedPreferences.edit() .putInt(LAST_APP_VERSION, currentVersionCode).commit(); } catch (NameNotFoundException e) { Log.w(Constants.LOG, "Unable to determine current app version from pacakge manager. Defenisvely assuming normal app start."); } return appStart; } public AppStart checkAppStart(int currentVersionCode, int lastVersionCode) { if (lastVersionCode == -1) { return AppStart.FIRST_TIME; } else if (lastVersionCode < currentVersionCode) { return AppStart.FIRST_TIME_VERSION; } else if (lastVersionCode > currentVersionCode) { Log.w(Constants.LOG, "Current version code (" + currentVersionCode + ") is less then the one recognized on last startup (" + lastVersionCode + "). Defenisvely assuming normal app start."); return AppStart.NORMAL; } else { return AppStart.NORMAL; } } 

Его можно использовать из такой активности:

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); switch (checkAppStart()) { case NORMAL: // We don't want to get on the user's nerves break; case FIRST_TIME_VERSION: // TODO show what's new break; case FIRST_TIME: // TODO show a tutorial break; default: break; } // ... } // ... } 

Базовая логика может быть проверена с использованием этого теста JUnit:

 public void testCheckAppStart() { // First start int oldVersion = -1; int newVersion = 1; assertEquals("Unexpected result", AppStart.FIRST_TIME, service.checkAppStart(newVersion, oldVersion)); // First start this version oldVersion = 1; newVersion = 2; assertEquals("Unexpected result", AppStart.FIRST_TIME_VERSION, service.checkAppStart(newVersion, oldVersion)); // Normal start oldVersion = 2; newVersion = 2; assertEquals("Unexpected result", AppStart.NORMAL, service.checkAppStart(newVersion, oldVersion)); } 

С чуть большим усилием вы, вероятно, могли бы проверить связанные с Android вещи (PackageManager и SharedPreferences). Кто-нибудь заинтересован в написании теста? 🙂

Обратите внимание, что приведенный выше код будет работать только в том случае, если вы не испортите свой android:versionCode в AndroidManifest.xml!

Вот какой код для этого –

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/myapp/files/myfile.txt"; boolean exists = (new File(path)).exists(); if (!exists) { doSomething(); } else { doSomethingElse(); } 

Вы можете просто проверить наличие пустого файла, если он не существует, а затем выполнить свой код и создать файл.

например

 if(File.Exists("emptyfile"){ //Your code here File.Create("emptyfile"); } 

Я сделал простой класс, чтобы проверить, работает ли ваш код в первый раз / n-раз!

пример

Создайте уникальные настройки

 FirstTimePreference prefFirstTime = new FirstTimePreference(getApplicationContext()); 

Используйте runTheFirstTime, выберите ключ, чтобы проверить ваше событие

 if (prefFirstTime.runTheFirstTime("myKey")) { Toast.makeText(this, "Test myKey & coutdown: " + prefFirstTime.getCountDown("myKey"), Toast.LENGTH_LONG).show(); } 

Используйте runTheFirstNTimes, выберите ключ и сколько раз выполните

 if(prefFirstTime.runTheFirstNTimes("anotherKey" , 5)) { Toast.makeText(this, "ciccia Test coutdown: "+ prefFirstTime.getCountDown("anotherKey"), Toast.LENGTH_LONG).show(); } 
  • Используйте getCountDown (), чтобы лучше обрабатывать код

FirstTimePreference.java

Я решил определить, является ли приложение вашим первым или нет, в зависимости от того, является ли это обновлением.

 private int appGetFirstTimeRun() { //Check if App Start First Time SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0); int appCurrentBuildVersion = BuildConfig.VERSION_CODE; int appLastBuildVersion = appPreferences.getInt("app_first_time", 0); //Log.d("appPreferences", "app_first_time = " + appLastBuildVersion); if (appLastBuildVersion == appCurrentBuildVersion ) { return 1; //ya has iniciado la appp alguna vez } else { appPreferences.edit().putInt("app_first_time", appCurrentBuildVersion).apply(); if (appLastBuildVersion == 0) { return 0; //es la primera vez } else { return 2; //es una versión nueva } } } 

Вычислить результаты:

  • 0: Если это первый раз.
  • 1: Он начался когда-либо.
  • 2: Он запускался один раз, но не в той версии, то есть это обновление.

В этой версии поддерживается поддержка версии 23.3.0 (в версии v4, что означает совместимость с Android 1.6).

В своей деятельности Launcher сначала вызовите:

 AppLaunchChecker.onActivityCreate(activity); 

Затем позвоните:

 AppLaunchChecker.hasStartedFromLauncher(activity); 

Что будет возвращено, если это был первый раз, когда приложение было запущено.

Вы можете использовать Android SharedPreferences .

Android SharedPreferences позволяет нам хранить данные частного примитивного приложения в виде пары ключ-значение.

КОД

Создание пользовательского класса SharedPreference

  public class SharedPreference { android.content.SharedPreferences pref; android.content.SharedPreferences.Editor editor; Context _context; private static final String PREF_NAME = "testing"; // All Shared Preferences Keys Declare as #public public static final String KEY_SET_APP_RUN_FIRST_TIME = "KEY_SET_APP_RUN_FIRST_TIME"; public SharedPreference(Context context) // Constructor { this._context = context; pref = _context.getSharedPreferences(PREF_NAME, 0); editor = pref.edit(); } /* * Set Method Generally Store Data; * Get Method Generally Retrieve Data ; * */ public void setApp_runFirst(String App_runFirst) { editor.remove(KEY_SET_APP_RUN_FIRST_TIME); editor.putString(KEY_SET_APP_RUN_FIRST_TIME, App_runFirst); editor.commit(); } public String getApp_runFirst() { String App_runFirst= pref.getString(KEY_SET_APP_RUN_FIRST_TIME, null); return App_runFirst; } } 

Теперь откройте свою активность и инициализируйте .

  private SharedPreference sharedPreferenceObj; // Declare Global 

Теперь позвоните в раздел OnCreate

  sharedPreferenceObj=new SharedPreference(YourActivity.this); 

Теперь проверка

 if(sharedPreferenceObj.getApp_runFirst()==null) { // That's mean First Time Launch // After your Work , SET Status NO sharedPreferenceObj.setApp_runFirst("NO"); } else { // App is not First Time Launch } 

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

Мне нравится иметь «количество обновлений» в моих общих предпочтениях. Если его нет (или нулевого значения по умолчанию), то это «первое использование» моего приложения.

 private static final int UPDATE_COUNT = 1; // Increment this on major change ... if (sp.getInt("updateCount", 0) == 0) { // first use } else if (sp.getInt("updateCount", 0) < UPDATE_COUNT) { // Pop up dialog telling user about new features } ... sp.edit().putInt("updateCount", UPDATE_COUNT); 

Итак, всякий раз, когда есть обновление для приложения, о котором должны знать пользователи, я увеличиваю UPDATE_COUNT

  /** * @author ALGO */ 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()) { writeInstallationFile(installation); } sID = readInstallationFile(installation); launchFlag = true; } 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); 

Привет, ребята, я делаю что-то вроде этого. И его работы для меня

Создайте логическое поле в shared preference.Default значение true {isFirstTime: true} после первого раза установите для него значение false. Ничто не может быть простым и релевантным, чем в системе Android.

Intereting Posts
ObjectAnimator с использованием наборов CharSequence Обработать событие: реализовать интерфейс или использовать внутренний класс для обработки интерфейса. Что лучше Как получить доступ к локальному порту 8080 URL из андроида http get Android 4.2: поведение обратного стека с вложенными фрагментами Ошибка синхронизации Gradle в студии Android при импорте проекта OnTouch, onLongClick вместе в android Почему метод onNewIntent (намерение намерения) вызывается дважды? Установите Android Theme.Light для диалога оповещений Как остановить звук других приложений? Открытый подход OpenCV к обнаружению go board Eclipse не создает файлы в новом проекте Android Попытка показать StreetView с помощью Google Maps Android API v2 в Android, но не сможет заставить его работать Android разные фоны EditText для разных состояний, используя фигуры, селектор или список Android-сервис для показа тостов Как читать / писать логическое значение при реализации интерфейса Parcelable?