START_NOT_STICKY服务中的工作线程

时间:2013-02-28 02:59:40

标签: android service

我对android中的START_NOT_STICKY感到困惑。这是两个问题:

  1. 我不需要为stopself服务明确调用START_NOT_STICKY,因为它会在onStartCommand之后停止,对吗?

  2. 如果在服务中启动workerThread,它会在我返回START_NOT_STICKY后继续运行吗?为什么我不知道服务应该在返回后自行停止START_NOT_STICKY

  3. 如果我的服务实现onStartCommand和onBound,我应该在哪里调用stopSelf?

  4. 编辑(来自android doc)

    对于已启动的服务,他们可以决定运行两种主要的操作模式,具体取决于它们从onStartCommand()返回的值:START_STICKY用于根据需要显式启动和停止的服务,而{{{ 1}}

2 个答案:

答案 0 :(得分:3)

不,服务从onStartCommand()返回后不会停止。请参阅this

START_ *值仅指示系统在由于某种原因系统决定终止服务时应该执行的操作。 您仍然应该调用stopSelf()stopService()来停止正在运行的服务,否则服务将无限期运行或直到系统决定终止其进程。

当android系统杀死正在运行Service的进程时,它会根据onStartCommand()返回的值尝试在可能的情况下重新创建它。

  • 如果返回的值为START_STICKY,它将重新创建服务进程,并将使用任何挂起的Intents调用onStartCommand()或null(如果没有挂起的Intents)。
  • 如果返回START_NOT_STICKY,系统将再次创建服务进程,并且只有在有任何待处理的意图时才会调用onStartCommand()。

因此,START_NOT_STICKY将保证只有在系统决定终止您的服务时以及没有待处理的意图时您的服务才会启动。 请参阅this了解START_NOT_STICKY

答案 1 :(得分:0)

维杰, 您应该在一个单独的主题中提出您的问题,但这是解决方案

您可以通过实现BroadcastReceiver来实现此目的。 在AndroidManifest.xml中创建一个接收器: -

<receiver android:name="com.demo.bootup.BootupBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

确保您设置了适当的权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

现在,您可以使用onReceive()方法启动服务。

@Override
public void onReceive(Context context, Intent intent) {
   Intent bootupIntent = new Intent(context, BootupService.class);
   context.startService(bootupIntent);
}

确保调用Service类而不是BootupService.class