Java 在设备重启后启动Phonegap插件
我正在为Android开发一款混合Phonegap应用程序。这个应用程序只使用了我正在开发的一个插件。这个插件有三个功能Java 在设备重启后启动Phonegap插件,java,android,cordova,geolocation,reboot,Java,Android,Cordova,Geolocation,Reboot,我正在为Android开发一款混合Phonegap应用程序。这个应用程序只使用了我正在开发的一个插件。这个插件有三个功能 观察地理位置变化(前景和背景) 设置半小时警报以执行某些定期任务 侦听推送消息。我使用服务,我使用的代码如下 我已经实现了让应用程序在设备重新启动时感到有些不安的代码,但结果很简单(多亏了我在其他线程中找到的信息) 我这样注册重启接收器 <receiver android:enabled="true" android:name=".Rebooter" andro
- 观察地理位置变化(前景和背景)
- 设置半小时警报以执行某些定期任务
- 侦听推送消息。我使用服务,我使用的代码如下
<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>
当我在我的安卓4.4.2测试设备上手动启动应用程序时,一切都很好。i、 e
- 检测到地理位置变化:在前景和背景中
- 接收推送消息。再次在f/g和b/g中
- 半小时的警报工作正常
PushySocketService
和标记为正在使用的主进程com.example.app
组成。内存使用量相当大
当我重新启动手机时,我仍然发现相同的服务和“主进程”正在运行。但是,主进程报告的内存使用率要低得多
最重要的是,该应用程序不会接收推送消息,也不会响应地理位置的更改。这只有在我通过main activity
启动应用程序后才会发生
我一定是遗漏了什么-因此重新启动的应用程序不会自动启动其主要活动
?如果是这样的话,我的重新启动器.onReceive
代码一定有问题吗
为了完整起见,我应该提到
- plugin.xml文件中仅静态声明Pushy.me和Rebooter广播接收器。地理位置和警报广播接收器是从我的插件代码中动态注册的
- 我正在使用Phonegap CLI v 6.4.2和JDK 7构建应用程序
很明显,我在这里做错了什么。我非常感谢任何能够让我走上正轨的人。如果你不想使用任何第三方插件来实现这一功能,那么你可以借用我的逻辑 您可以在插件中查看类。每当设备成功重启时,它都会调用helper类来启动相应的应用程序。您也可以在插件中实现相同的逻辑 希望能有帮助。干杯。Cordova插件 让我们看看这段代码:
Intent i = new Intent(context, MyAppCordovaPlugin.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
不是一个活动,因此不能像启动活动那样启动它CordovaPlugin
- Cordova Android应用程序是一个带有WebView的单一活动应用程序,它仅在创建WebView后加载插件。您并不真的希望启动应用程序/启动应用程序UI来侦听GCM消息或地理围栏事件
initialize()
回调中的代码将仅在应用程序的活动启动时运行。但您希望在启动完成事件后在后台调用其中的一些代码
我建议将“开始监听后台事件”逻辑移动到一个,您可以从插件的
initialize()
和启动完成接收器启动该逻辑。您尝试过使用吗?它还声明“安装到SD卡将阻止应用程序在启动后自动启动”。@Droidosin不要在OnReceive中启动主活动,而是尝试使用getInstance(实现单例模式)并调用相应的mainactivity方法。@AkshayTilekar,您能详细说明一下吗?我认为BroadcastReceiver.OnReceive
事件是重新启动活动的合理位置。你似乎在暗示其他的东西。你到底想要什么?我只是想让你澄清你的评论,因为很难理解你的暗示——甚至尝试使用插件。它什么也不做,而且有一个不幸的副作用,就是在重启后阻止我的应用程序进入推送消息。除去所有的插件代码,它所做的只是创建一个带有'packageName.mainActivity.class'的意图。这可以工作,但在我将应用程序带到前台之前,似乎无法初始化应用程序使用的插件Droidos将进行检查并从中获得反馈。据我所知,问题是,在创建CordovaWebView之前,Cordova插件未初始化,并且当应用程序从后台重新启动时,似乎不会发生这种情况packageName.mainActivity.class
intent通过引导接收器。考虑到我在自己的插件初始化代码中收听推送、启动警报、观看地理位置等功能,启动的应用程序在我将其带到前台之前不会执行任何操作manually@DroidOS您好,看起来您的问题的解决方案可以在下面的链接中找到-查看jorantos在链接中的评论。。。它应该给你一些线索。希望有帮助。谢谢。我将在几天后在这里发布所有这些问题的完整解决方案,以方便其他遇到此线程的人。我对您的答案投赞成票,因为您强调了几个重要问题。显然,传递MyAppCordovaPlugin
类是错误的。第二,考虑到我想重新启动,不只是推消息收听,还有一些其他的事情——警报、地理位置等——我不应该使用PuSyMe启动接收器。我不认为在一个应用程序中有两个广播接收器用于同一事件有问题,所以如何集成PUHY.ME是供您考虑的。伊普
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
}
Intent i = new Intent(context, MyAppCordovaPlugin.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);