IntentService立即停止

时间:2014-01-28 18:02:43

标签: android intentservice

我有我的应用设置,其中(非意图)服务将使用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>

1 个答案:

答案 0 :(得分:1)

  

但是,我最近读到一个intentService可能更适合长时间运行的任务,因为它不是在ui线程上运行,而是它自己的工作线程

仅适用于本质上属于“事务性”的事物:数据库I / O,Web服务调用,下载小文件等。它不适合像您这样的情况。

  

我假设这是因为服务中没有发生任何事情,而听众则等待接收位置,因此服务自行结束

更具体地说,一旦onHandleIntent()返回,如果没有其他命令等待处理,则服务会调用stopSelf()

  

如果服务结束,我该怎么做才能推迟?

回到原来的方法,但使用HandlerThread以及requestLocationUpdates()的{​​{1}}风格,在背景线程上为您提供位置。这样,当您的位置到达时,您处于后台线程并可以执行您需要处理的任何位置,然后您可以Looper离开。

然而,如果您还需要超时,这将变得棘手,以防您从未获得位置修复。并且,您必须担心保持设备处于唤醒状态,因此在您等待修复时它不会入睡。我写了a LocationPoller library处理这些东西,虽然我多年没用过它,所以它上面有一层厚厚的灰尘。

您可以考虑在stopSelf() API上使用PendingIntentrequestLocationUpdates()或其等价物作为替代方案。然后,您可以使用LocationClient仅处理位置修复的结果