Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当Android应用程序不再处于活动状态时,位置更新保持活动状态_Java_Android_Service_Gps - Fatal编程技术网

Java 当Android应用程序不再处于活动状态时,位置更新保持活动状态

Java 当Android应用程序不再处于活动状态时,位置更新保持活动状态,java,android,service,gps,Java,Android,Service,Gps,我有以下问题:我定期从手机向服务器发送GPS数据。事实上,我只希望只要用户愿意提交数据,这个后台服务就可以运行。应该有某种确认对话框,从现在开始提交数据,然后这些提交应该处于活动状态-如果应用程序同时关闭,则为事件-直到用户再次确认不再发送数据: 以下是我在AndroidManifest.xml中的当前条目: .... <receiver android:name="ch.bbcag.jumpin.app.receiver.gps.ConnectivityRec

我有以下问题:我定期从手机向服务器发送GPS数据。事实上,我只希望只要用户愿意提交数据,这个后台服务就可以运行。应该有某种确认对话框,从现在开始提交数据,然后这些提交应该处于活动状态-如果应用程序同时关闭,则为事件-直到用户再次确认不再发送数据:

以下是我在AndroidManifest.xml中的当前条目:

   ....
   <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
或my
WakefulIntentService
,否则您的警报将不可靠

此外,您的清单格式不正确。
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);