当前位置: 首页 > 知识库问答 >
问题:

立即停止服务

卢普松
2023-03-14

我的应用程序设置为(非故意)服务将使用gps/网络侦听器轮询位置。它工作得很好,因为我负责服务何时结束(即在找到新位置或达到超时时调用stopSelf())。然而,我最近读到,intentService可能更适合长时间运行的任务,因为它不是在ui线程上运行的,而是在自己的工作线程上运行的。问题是,现在它不允许服务在任何时间运行(我假设这是因为服务中没有任何活动发生,而侦听器等待接收位置,因此服务本身结束)。

当我的onStartCommand()方法是非意图服务时,它看起来像:

@Override
protected void onStartCommand(Intent intent) {
    grabLocation();
}

因为我已经将服务切换到了intent服务,所以我去掉了这个方法(根据文档,它不应该被IntentService覆盖),现在我的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个答案

唐海阳
2023-03-14

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

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

我假设这是因为服务中没有任何活动发生,而侦听器等待接收位置,因此服务会自行结束

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

服务结束时,我能做些什么来推迟?

回到你最初的方法,但是通过使用HandlerThread和使用LooperrequestLocationUpdates()的风格,在后台线程上交付位置。这样,当您的位置到达时,您处于后台线程中,可以对该位置执行任何需要执行的操作,然后您可以stopSelf()离开。

然而,这变得棘手,因为你还需要一个超时,以防你永远得不到一个位置修复。而且,你必须担心让设备保持清醒,这样当你等待修复时它就不会睡着。我写了一个处理这些东西的LocationPoller库,尽管我已经很多年没有使用它了,所以上面有一层相当厚的灰尘。

您可以考虑使用<代码> PungItgultI/<代码> <代码> > RestestLoopUpDebug()/<代码>,或其等价于 LoopCudio API,作为其中任何一个的替代。然后,您可以仅使用 IntentService来处理定位结果。

 类似资料:
  • 我在LibGDX做一个项目。这是一款2d平台游戏。你可以说这就像超级马里奥。 这就是我如何把我的球员移到右边: 当我离开钥匙时,玩家仍然在移动一点。(我想他的身体上仍然有“线性冲动”的力量)。 我怎样才能让它停下来? 我的问题可能很简单:拿着钥匙,在LibGDX上向一个方向移动身体的最佳方式是什么。当我离开钥匙时,玩家立即停止。 BDW——我尝试过“setTransform”,当身体触摸其他物体时

  • 问题内容: 我正在使用SQL Server 2008及其管理工作室。我执行了一个查询,该查询产生许多行。我试图通过红色的“取消”按钮将其取消,但在过去的10分钟内仍未停止。通常会在3分钟内停止。 原因可能是什么?如何立即停止? 问题答案: 可能是什么原因 只要您的注意力可以到达服务器并得到处理,查询就会立即取消。查询必须处于可取消状态,几乎总是如此,除非您执行某些操作,例如从SQLCLR调用Web

  • 问题内容: 我需要在树莓派的启动程序上启动Java应用程序,但我不知道如何? 我检索了PbxMan的脚本以将其作为服务运行:http://codingdict.com/questions/42510 我制作了一个简单的脚本,可以在后台启动该应用程序 我在重新启动时将其推送到了crontab中… 我在main的第一行和addShutdownHook()中播放声音。所以我可以听到,每次应用程序启动后立

  • 问题内容: 我尝试了一切。这也是一个如何停止Java.util.Timer类中计划的任务 我有一个实现java.util.TimerTask的任务 我用两种方式称呼该任务: 我这样安排计时器: timer.schedule(timerTask,60 * 1000); 有时我需要立即开始工作,并且如果有正在工作的工作,必须取消timerTask cancelCurrentWork(); timer.

  • 我在我的工作区中使用STS IDE运行了几个Spring Boot应用程序,在我对其中一个项目进行maven更新后,每个项目都在应用程序启动过程后立即停止。我甚至创建了一个最小的例子,只是为了开始一些事情,同样的事情发生了。 这是我的pom.xml 即使是那些入门示例也会在启动后立即停止。我会非常感谢这里的一些帮助。 编辑:正如Alexandru Marina在评论中所说,我使用的是快照而不是稳定