Я занимаюсь разработкой гибридного приложения 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
Я явно делаю что-то не так. Я был бы очень благодарен всем, кто мог бы поставить меня на правильный путь.