我有我的应用设置,其中(非意图)服务将使用gps /网络侦听器轮询该位置。它工作正常,因为我负责服务何时结束(即在找到新位置或达到超时时调用stopSelf())。但是,我最近读到,intentService可能更适合长时间运行的任务,因为它不是在ui线程上运行,而是在自己的工作线程上运行。问题是,现在它不允许服务随时运行(我假设这是因为服务中没有任何事情发生,而侦听器等待接收位置,因此服务自行结束)。
我的onStartCommand()方法,当它是非意图服务时看起来像:
@Override
protected void onStartCommand(Intent intent) {
grabLocation();
}
由于我已将服务切换为intent服务,因此我删除了此方法(根据文档,不应覆盖intentSerivce),现在我的onHandleIntent服务看起来像这样:
@Override
protected void onHandleIntent(Intent intent) {
grabLocation();
}
服务几乎立即结束。在服务结束时我该怎么做才能推迟?
我使用startService(Intent)
调用该服务locationPollingIntent = new Intent(MainActivity.this, LocationService.class);
updateLocationButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(locationPollingIntent);
}
});
清单摘录:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service
android:name="com.rperryng.intellilocation.backgroundServices.LocationService"
android:label="Location Service" />
<receiver android:name="com.rperryng.intellilocation.backgroundServices.AutoStart" />
<activity
android:name="com.rperryng.intellilocation.activities.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 0 :(得分:1)
但是,我最近读到一个intentService可能更适合长时间运行的任务,因为它不是在ui线程上运行,而是它自己的工作线程
仅适用于本质上属于“事务性”的事物:数据库I / O,Web服务调用,下载小文件等。它不适合像您这样的情况。
我假设这是因为服务中没有发生任何事情,而听众则等待接收位置,因此服务自行结束
更具体地说,一旦onHandleIntent()
返回,如果没有其他命令等待处理,则服务会调用stopSelf()
。
如果服务结束,我该怎么做才能推迟?
回到原来的方法,但使用HandlerThread
以及requestLocationUpdates()
的{{1}}风格,在背景线程上为您提供位置。这样,当您的位置到达时,您处于后台线程并可以执行您需要处理的任何位置,然后您可以Looper
离开。
然而,如果您还需要超时,这将变得棘手,以防您从未获得位置修复。并且,您必须担心保持设备处于唤醒状态,因此在您等待修复时它不会入睡。我写了a LocationPoller
library处理这些东西,虽然我多年没用过它,所以它上面有一层厚厚的灰尘。
您可以考虑在stopSelf()
API上使用PendingIntent
种requestLocationUpdates()
或其等价物作为替代方案。然后,您可以使用LocationClient
仅处理位置修复的结果。