Инициирование плагина Phonegap после перезапуска устройства

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

  • Часы для изменения геолокации (как на переднем плане, так и на заднем плане)
  • Устанавливает получасовую тревогу для выполнения определенных периодических задач
  • Прослушивает push-сообщения. Я использую службу pushy.me, а код, который я использую, следует их документации .

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

package com.example.plugin; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaWebView; import android.content.Context; import android.content.BroadcastReceiver; import android.content.pm.PackageManager; import android.app.Activity; import android.content.Intent; public class Rebooter extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, MyAppCordovaPlugin.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

Я регистрирую получатель перезагрузки таким образом

 <receiver android:enabled="true" android:name=".Rebooter" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> 

MyAppCordovaPlugin – это точка входа в мое приложение / плагин – тот, который расширяет класс CordovaPlugin . Вот что я там делаю

 public class MyAppCordovaPlugin extends CordovaPlugin { private Context context; public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize(cordova, webView); this.context = cordova.getActivity().getApplicationContext(); //setup pushy.me broadcast receiver //setup geolocation changes receiver //setup broadcast receiver for a half-hourly alarm } @Override public void onResume(boolean multitasking) { super.onResume(multitasking); //unregister background location change receiver, if present //switch geolocation to foreground mode. ie using //FusedLocationApi.requestLocationUpdates } @Override public void onPause(boolean multitasking) { super.onPause(multitasking); //stop request for foreground location updates, if present //switch geolocation to background mode, ie by //registering a broadcast receiver that listens for location change //broadcasts } 

Когда я запускаю приложение вручную на своем тестовом устройстве Android 4.4.2, все работает отлично. т.е.

  • Обнаружены изменения геоданных: как на переднем плане, так и в фоновом режиме
  • Точные сообщения принимаются. Еще раз и в f / g, и в b / g
  • Полумесячная сигнализация работает

Когда я просматриваю запущенное приложение, я обнаружил, что он состоит из одного сервиса PushySocketService и основного процесса com.example.app который помечен как используемый. Использование памяти значительно.

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

Самое главное – приложение не получает push-сообщения и не реагирует на изменения геоданных. Это происходит только после того, как я запустил приложение по main activity .

Мне, должно быть, что-то не хватает – так перезагруженное приложение автоматически не запускает свою main activity ? Если так, должно быть что-то не так с моим кодом Rebooter.onReceive ?

Для полноты я должен упомянуть

  • Только приемники Pushy.me и Rebooter объявляются статически в файле plugin.xml. Приемники Geo и приемники сигналов тревоги регистрируются динамически из моего кода плагина.
  • Я создаю приложение с помощью Phonegap CLI v 6.4.2 и JDK 7

Я явно делаю что-то не так. Я был бы очень благодарен всем, кто мог бы поставить меня на правильный путь.

Solutions Collecting From Web of "Инициирование плагина Phonegap после перезапуска устройства"

Если вы не хотите использовать какой-либо сторонний плагин для этой функции, тогда вы можете охарактеризовать логику с помощью плагина auto start .

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

Надеюсь, поможет. Приветствия.

Плагин Кордовы

Давайте посмотрим на этот фрагмент кода:

 Intent i = new Intent(context, MyAppCordovaPlugin.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); 
  • CordovaPlugin не является активным, поэтому вы не можете его запускать, как если бы это было так.
  • Приложение «Кордова Android» представляет собой одно приложение Activity с WebView, которое загружает плагины только после создания WebView. Вы действительно не хотите запускать пользовательский интерфейс приложения / запуска приложения, чтобы прослушивать сообщения GCM или события геообработки.

Pushy.me

Документация Pushy.me рекомендует объявить BroadcastReceiver в манифесте приложения. Похоже, что Pushy также заботится о загрузочном событии для вас. Почему бы не использовать их рекомендуемый подход?

Запуск материала в фоновом режиме после загрузки

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

Я рекомендую перенести логику «начать прослушивание фоновых событий» на IntentService , которую вы можете запустить как из вашего initialize() плагина initialize() plugin initialize() , так и из вашего загрузочного полного приемника.