Запускается ли onCreate в приложении при обновлении?

Я хочу внести несколько разовых модификаций в свое приложение во время обновления приложения. Просматривая документы android.app.Application, я заметил, что есть onCreate, но нет onUpgrade (как в android.database.sqlite.SQLiteOpenHelper ).

Я поместил свой код обновления в метод onCreate, но неясно, выполняется ли этот код во время обновления.

Вызывается ли onCreated во время обновления? Или есть другой способ запустить специальный код обновления?


person robasta    schedule 15.01.2013    source источник
comment
Когда приложение будет обновлено, менеджер пакетов убьет действия, службы и все остальное. Так что нет никакого способа сделать это.   -  person vovkab    schedule 15.01.2013


Ответы (5)


Вызывается ли onCreated во время обновления?

нет. Application.onCreate() вызывается, когда ваше приложение переходит из состояния, которое оно считает «не работающим», в «работающее».

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

есть ли другой способ запустить специальный код обновления?

как писал @Class Stacker: если вы изменяете имя или номер версии при реализации новой версии - вы можете проверить свою основную деятельность, когда она создает с помощью метода Activity.onCreate() имя версии, и сравнить его с именем последней версии, которую вы сохранили. sharedPreference или таблица базы данных. затем вы можете реализовать любую логику, которую хотите, когда узнаете, что ваша версия изменена.

вы можете проверить имя и номер версии с помощью этого кода:

     PackageInfo pinfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
     Integer versionCode = pinfo.versionCode; 
     String versionName = pinfo.versionName; 

надеюсь, что это помогло вам, и удачи.

person Tal Kanel    schedule 15.01.2013

Существуют трансляции, которые Android отправляет при пакетных операциях. Однако рассматриваемая посылка либо исключена из получения тех, либо доставка не надежна (на данный момент я не помню точных обстоятельств). Так что полагаться не на что.

Если вам нужна модификация обновления, вы можете использовать общий файл настроек, где вы определяете установку и получаете к ней доступ в Application#onCreate(). Если последняя версия вашего приложения также использовала файл, то он все еще будет там, если пользователь не удалит все данные приложения.

Следовательно, все это немного зависит от случая использования, потому что не всегда очевидно, что такое обновление на самом деле.

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

Не позволяйте имени обмануть вас; файл является частным для вашего приложения, если вы хотите, чтобы он был (если только кто-то не рутировал устройство, и в этом случае все ставки отключены).

person class stacker    schedule 15.01.2013

Не уверен, что именно вы пытаетесь обновить, но вы можете сравнить свой текущий номер сборки с тем, который вы сохранили, для примера SharedPreferences.

Подробнее об этом можно прочитать здесь; Как проверить системную версию Android?

person Stefan de Bruijn    schedule 15.01.2013
comment
у меня были некоторые общие настройки в старой версии, которые теперь должны измениться с новым обновлением. Это URL-адрес, который был abc.com, теперь по умолчанию должен быть xyz.com. Я также хочу показать экран «Что нового» в первый раз после обновления. - person robasta; 15.01.2013

Существует трансляция «ACTION_MY_PACKAGE_REPLACED»: https://developer.android.com/reference/android/content/Intent#ACTION_MY_PACKAGE_REPLACED Вы можете использовать его для отслеживания события обновления приложения. Это полезно, если вы хотите сделать что-то сразу после обновления, например. перезапустить службу.

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

person Cluster    schedule 07.10.2018
comment
Это пограничный ответ только по ссылке. Вы должны расширить свой ответ, чтобы включить здесь как можно больше информации, и использовать ссылку только для справки. - person Filnor; 12.10.2018

Нет обратных вызовов, которые запускаются во время или сразу после обновлений.

person Evos    schedule 15.01.2013