Java 在设备重启后启动Phonegap插件

Java 在设备重启后启动Phonegap插件,java,android,cordova,geolocation,reboot,Java,Android,Cordova,Geolocation,Reboot,我正在为Android开发一款混合Phonegap应用程序。这个应用程序只使用了我正在开发的一个插件。这个插件有三个功能 观察地理位置变化(前景和背景) 设置半小时警报以执行某些定期任务 侦听推送消息。我使用服务,我使用的代码如下 我已经实现了让应用程序在设备重新启动时感到有些不安的代码,但结果很简单(多亏了我在其他线程中找到的信息) 我这样注册重启接收器 <receiver android:enabled="true" android:name=".Rebooter" andro

我正在为Android开发一款混合Phonegap应用程序。这个应用程序只使用了我正在开发的一个插件。这个插件有三个功能

  • 观察地理位置变化(前景和背景)
  • 设置半小时警报以执行某些定期任务
  • 侦听推送消息。我使用服务,我使用的代码如下
我已经实现了让应用程序在设备重新启动时感到有些不安的代码,但结果很简单(多亏了我在其他线程中找到的信息)

我这样注册重启接收器

<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消息或地理围栏事件
咄咄逼人 Pushy.me建议在应用程序清单中声明BroadcastReceiver。看来Pushy也会为你处理开机事件。为什么不使用他们推荐的方法呢

启动后在后台运行东西 如上所述,
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);