Инициирование плагина 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. i.e. 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, i.e 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

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

Ответ 1

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

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

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

Ответ 2

Плагин Cordova

Посмотрите на этот фрагмент кода:

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

Pushy.me

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

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

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

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