【发布时间】:2017-06-01 01:18:39
【问题描述】:
我正在开发适用于 Android 的混合 Phonegap 应用程序。该应用程序仅使用我正在开发的一个插件。该插件做了三件事
- 监视地理位置变化(前景和背景)
- 设置半小时警报以执行某些周期性任务
- 监听推送消息。我使用pushy.me 服务,我使用的代码遵循their documentation。
我已经实现了让应用程序调整到设备重启的代码,但结果很容易(感谢我在 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,它被标记为正在使用。内存使用量很大。
当我重新启动手机时,我仍然发现相同的服务和“主进程”正在运行。但是,报告的主进程的内存使用情况要低得多。
最重要的是 - 应用程序不会收到推送消息,也不会响应地理位置更改。这只有在我通过main activity 启动应用程序后才开始发生。
我必须在这里遗漏一些东西 - 所以重新启动的应用程序不会自动启动它的main activity?如果是这样,我的Rebooter.onReceive 代码一定有问题?
为了完整性,我应该提一下
- 只有 Pushy.me 和 Rebooter 广播接收器在 plugin.xml 文件中静态声明。地理位置和警报广播接收器是在我的插件代码中动态注册的。
- 我正在使用 Phonegap CLI v 6.4.2 和 JDK 7 构建应用程序
我显然在这里做错了什么。我将非常感谢任何能够让我走上正轨的人。
【问题讨论】:
-
你试过使用github.com/ToniKorin/cordova-plugin-autostart吗?它还指出“安装到 SD 卡将阻止您的应用在启动后自动启动。” @DroidOS
-
尝试使用 getInstance(实现单例模式)并调用 mainactivity 的相应方法,而不是在 OnReceive 中启动主要活动。
-
@AkshayTilekar,你能详细说明一下吗?我认为
BroadcastReceiver.OnReceive事件是重新启动活动的合乎逻辑的地方。你似乎在暗示别的东西。 -
你到底想要什么?
-
我只是想让你澄清你的评论,因为很难理解你的建议
标签: java android cordova geolocation reboot