Java 当Android应用程序不再处于活动状态时,位置更新保持活动状态
我有以下问题:我定期从手机向服务器发送GPS数据。事实上,我只希望只要用户愿意提交数据,这个后台服务就可以运行。应该有某种确认对话框,从现在开始提交数据,然后这些提交应该处于活动状态-如果应用程序同时关闭,则为事件-直到用户再次确认不再发送数据: 以下是我在AndroidManifest.xml中的当前条目:Java 当Android应用程序不再处于活动状态时,位置更新保持活动状态,java,android,service,gps,Java,Android,Service,Gps,我有以下问题:我定期从手机向服务器发送GPS数据。事实上,我只希望只要用户愿意提交数据,这个后台服务就可以运行。应该有某种确认对话框,从现在开始提交数据,然后这些提交应该处于活动状态-如果应用程序同时关闭,则为事件-直到用户再次确认不再发送数据: 以下是我在AndroidManifest.xml中的当前条目: .... <receiver android:name="ch.bbcag.jumpin.app.receiver.gps.ConnectivityRec
....
<receiver
android:name="ch.bbcag.jumpin.app.receiver.gps.ConnectivityReceiver"
android:process=":gps_process" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="ch.bbcag.jumpin.app.service.LocationUpdaterService"
android:process=":gps_process" />
<service
android:name="ch.bbcag.jumpin.app.service.LocationUpdaterService"
android:process=":gps_process" />
....
这种方法的问题是,用户未使用应用程序的事件会被发送到服务器。一个简单的解决方案是在LocationUpdaterService类中检查应用程序是否真的应该发送事件。但事实是,即使我不使用LocationsUpdaterService,也会定期调用它(Android会浪费时间调用此服务)
我怎么能弄明白?文章?欢迎使用代码示例
我怎么能弄明白
只在需要时安排闹钟。如果您不再需要它们,请取消警报
此外,如果要使用RTC_WAKEUP
,请使用WakefulBroadcastReceiver
或myWakefulIntentService
,否则您的警报将不可靠
此外,您的清单格式不正确。ch.bbcag.jumpin.app.service.LocationUpdaterService
是一个
,或者是一个
,但不能两者都是
另外,如果你不清楚为什么要使用android:process=“:gps_process”,以及它给你和用户带来的成本,请不要使用它。我只需要阅读谷歌的文档就可以了解它的实际运作情况: 1) 我不想在设备启动时启动警报: 解决方案: (AndroidManifest.xml) 从这一点开始,GPS位置将定期发送到服务器。完成此操作后,下次接收器将在启动时启动。这就是我想要阻止的 2) 防止从引导自动启动BootReceiver: 为此,我正在寻找获得Android系统关机事件的可能性:
<uses-permission android:name="android.permission.DEVICE_POWER" />
<receiver android:name=".ShutdownReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
</receiver>
public class ShutdownReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
}
3) 结论:
a) 一旦你的应用程序启动,接收器就会被激活:GPS坐标会定期发送到服务器
b) 在应用程序中,您可以设置接收器或启用接收器
c) 最后,如果handy关闭,则是移除接收器的时候了
d) 下次您可以使用)重新启动时,您可能不会停止服务!如果您周期性地调用服务只是为了检查一些布尔首选项或其他事情(以及是否执行主任务),那么就没有问题。顺便说一下,这里的代码很难理解。什么是LocationUpdaterService?是服务还是广播接收者(清单告诉我们两者都不可能是真的)?什么是GCMinentService(您发布了清单中根本没有提到的ConnectionyReceiver代码)?可能是您可以使用SharedReference变量检查用户是否在线,如果您发现用户根据共享首选项处于离线状态,则停止服务。好的,我已将接收器更改为WakefulBroadcastReceiver。作为接收者的LocationUpdaterService的清单条目已被删除(实际上是一个服务)。取消是指例如检查首选项中的布尔属性吗?但事实仍然是,只要手机上安装了应用程序,我的接收器就会定期被呼叫?我能不能将接收器附加到活动接收器的类中?现在我错了,接收器将被停止。但是,如果我想再次使用它,如何恢复它?@user1408341:“取消是指例如检查首选项中的布尔属性吗?”--不,我的意思是在
AlarmManager
上调用cancel()
。是的,我的意思是,但是对于要取消的触发器,我必须检查是否要取消(什么like@user1408341:当“用户再次确认不应再发送数据”时,在AlarmManager
上调用cancel()
。您可能还希望保留此信息,以便在重新启动时知道是否应设置报警。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".SampleBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
<uses-permission android:name="android.permission.DEVICE_POWER" />
<receiver android:name=".ShutdownReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
</receiver>
public class ShutdownReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
}
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);