График запуска приложения

Я работаю над приложением, в котором после 5 раз приложение открывается пользователем, при 6-й попытке приложение должно запросить обратную связь от пользователя. Я попытался использовать Activity OnStart , OnResume , но он не работает, так как даже после выхода и повторного входа в действие эти методы называются. Также, как и в случае с функциями Android, я не могу отказаться от приложения, чтобы я мог найти его из первого вызванного действия. Как узнать, сколько раз приложение было запущено?

Надеюсь, это не смущает.

редактировать

Кроме того, есть способ, в котором я всегда могу возобновить свое приложение из первого действия (например, приветственной страницы), как только пользователь нажимает на кнопку, чтобы выйти из приложения.

Это на самом деле довольно просто. Использование SharedPreference или базы данных.

во время OnCreate добавьте 1 к счетчику numberofTimes и зафиксируйте.

 OnCreate (Bundle bundle){ mPref = getPreferences(); int c = mPref.getInt("numRun",0); c++; mPref.edit().putInt("numRun",c).commit(); //do other stuff... } 

OnCreate вызывается независимо от того, запускаете ли вы приложение или возобновляете приложение, но isFinishing () возвращает true тогда и только тогда, когда пользователь (или вы) назвал finish () в приложении (и он не был уничтожен менеджером)

Таким образом, вы только увеличиваетесь, когда начинаете новый старт.

метод isFinishing () внутри метода OnPause, чтобы проверить, завершена ли операция () или просто приостановлена.

 @Override protected void OnPause(){ if(!isFinishing()){ c = mPref.getInt("numRun",0); c--; mPref.edit().putInt("numRun",c).commit(); } //Other pause stuff. } 

Это охватывает все ваши сценарии:

 1. user starts app/activity (+1)-> finishes app, exit with finish() 2. user starts app (+1) -> pause (-1) -> returns (+1)-> finish 3. user starts app (+1) -> pause (-1) -> android kills process (0) -> user returns to app (+1) -> user finish. 

каждый сценарий вы только увеличиваете счетчик «раз подряд» один раз за «запуск» активности

Просто:

  1. заявляет:

     private SharedPreferences prefs; private SharedPreferences.Editor editor; private int totalCount; 
  2. Инициализировать в onCreate() :

     prefs = getPreferences(Context.MODE_PRIVATE); editor = prefs.edit(); 
  3. распечатывать или подсчитывать, где бы вы ни находились (в любом месте в onCreate() или любом конкретном клике, как вы указали):

      totalCount = prefs.getInt("counter", 0); totalCount++; editor.putInt("counter", totalCount); editor.commit(); 
  4. теперь напечатайте totalCount куда вы хотите посчитать, например:

      System.out.println("Total Application counter Reach to :"+totalCount); 

если у вас есть начальная активность для запуска приложения, вы можете реализовать его следующими способами. 1. База данных: – через базу данных вы можете сохранить счетчик запуска приложения и получить его при создании активности.

  1. Статическая переменная: статическая переменная также сохраняет значения во время начала и конца приложения

  2. Предпочтение приложения: -вы можете сохранить значение в предпочтении приложения и использовать его

проблема с подходами 2 и 3 заключается в том, что если вы выключите и снова включите свой телефон, вы потеряете данные. но если вы все еще хотите использовать подход 2 или 3, то подход 2 очень прост и

пример кода для 3-го подхода здесь

вам нужно расширить class Application и создать подclass из этого

 public class MyApp extends Application{ int visitCount; onCreate(){ visitCount=0; } 

и вы можете упомянуть об этом в вашем файле манифеста, например

  .....  

и в onCreate вашей деятельности вы можете получить ее

 MyApp myApp=(MyApp)getApplicationContext(); 

Edit1: подclass вашей деятельности и метод переопределения

 public class myActivity extends Activity{ @Override onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); counterFlag=true; } } 

он вызывается, когда пользователь нажимает кнопку «домой»

и снова переопределить onResume () и проверить, включен ли флажок вашего счетчика или нет, и создать всю вашу активность путем подclassа MyActivity

также, если любое другое действие имеет точку выхода по нажатию кнопки «Назад», тогда вы можете переопределить

  @Override public void back_pressed(){ } 

и выполняйте свою задачу соответственно

Я думаю, что это был бы лучший вариант, чтобы охватить все сценарии:

 private static boolean valueOfLaunchCountModified = false; @Override protected void onCreate(Bundle savedInstanceState) { if(!valueOfCountModified){ preferences = getPreferences(MODE_PRIVATE); launchCount= preferences.getInt("launchCount", 0); if(preferences.edit().putInt("launchCount", ++launchCount).commit()){ valueOfCountModified = true; if(launchCount == 5){ //Do whatever you want } } } } 

Если мы помним определение статической переменной («… они связаны с classом, а не с каким-либо объектом. Каждый экземпляр classа использует переменную classа …»), мы обнаружим, что это идеально для нас.

Когда выполняется метод onPause или изменение ориентации, значение «valueOfLaunchCountModified» не изменяется; однако, если процесс приложения разрушен, значение «valueOfLaunchCountModified» изменяется на false.

Если вы хотите только подсчитать «истинные» вызовы, то расширьте Application и поместите логику счетчика в Application#onCreate . Это может быть простое предпочтение

Я предпочитаю использовать onResume для отслеживания количества запусков, так как он получает вызов в каждом сценарии (см. « Жизненный цикл активности Android» ), когда отображается действие.

onResume можно было бы назвать довольно часто в зависимости от шаблона использования, поэтому вместо отслеживания количества запусков было бы лучше отслеживать сеанс запуска (так как только один счет запуска отслеживался в час).

 @Synchronized fun appSessionCount(sharedPref: SharedPreferences): Boolean { val now = LocalDateTime.now(ZoneOffset.UTC) val firstSeconds = sharedPref.getLong(KEY_FIRST_LAUNCH_DATE, 0) if (firstSeconds == 0L) { sharedPref.edit { putLong(KEY_FIRST_LAUNCH_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond()) } } val seconds = sharedPref.getLong(KEY_LAST_SESSION_DATE, 0) val lastDate = if (seconds > 0) LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneOffset.UTC) else null var count = sharedPref.getLong(KEY_SESSION_COUNT, 0) // first time or 1 hour ago if (lastDate == null || Duration.between(lastDate, now).toHours() >= 1) { sharedPref.edit { putLong(KEY_SESSION_COUNT, count + 1) putLong(KEY_LAST_SESSION_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond()) } return true } return false } 

Я запускаю код в onResume моего основного вида деятельности.

 class MainActivity : AppCompatActivity() { lateinit var sharedPref: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { sharedPref = getSharedPreferences("LuaApp", Context.MODE_PRIVATE) } override fun onResume() { super.onResume() appSessionCount(sharedPref) } } 

https://code.luasoftware.com/tutorials/android/android-track-app-launch-count/

  • java.lang.RuntimeException: сбой takePicture
  • Как я повторяю метод каждые 10 минут после нажатия кнопки и завершения ее на другой кнопке
  • Приложение для автоматического запуска после завершения загрузки в Android
  • НЕОПРЕДЕЛЕННОЕ ТОП-УРОВЕННОЕ ИСКЛЮЧЕНИЕ: com.android.dex.DexException: несколько файлов dex определяют
  • Android Circular Определяет ProgressBar
  • разница и когда использовать getApplication (), getApplicationContext (), getBaseContext () и someClass.this
  • Динамический список в приложении Android
  • Хотите загрузить настольную версию в мой веб-просмотр с помощью uastring
  • Конвертировать dip в px в Android
  • android youtube загружает видео со статическим именем пользователя и паролем
  • Значение по умолчанию для Android «debuggable»
  • Interesting Posts

    Генерировать случайные числа после нормального распределения в C / C ++

    Инициализация массива в одной строке

    Должен ли доступ к SharedPreferences делать из streamа пользовательского интерфейса?

    Как быстро изменить профиль пользователя в Google Chrome?

    Не удалось найти пространство имен SpringNamespaceHandler для пространства имен XML

    Swing vs JavaFx для настольных приложений

    Выключить отображение в Windows по команде

    Предпочитайте проводную связь по беспроводной сети в той же сети (специальный случай)

    Увеличение размера шрифта в системном меню для OS X Lion

    Как использовать DateTime.TryParse с Nullable ?

    Как я могу имитировать нижний лист из приложения «Карты»?

    Чтение двоичного входного streamа в один байтовый массив в Java

    Предотвращать автоматические переадресации в Firefox

    Как инициализировать массив байтов в Java?

    Нет определенного типа параметра функции по умолчанию для int? Я сошел с ума?

    Давайте будем гением компьютера.