1

我对START_NOT_STICKYandroid感到困惑。这里有两个问题:

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

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

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

编辑(来自安卓文档)

对于已启动的服务,它们可以决定运行另外两种主要的操作模式,具体取决于它们从 onStartCommand() 返回的值: START_STICKY 用于根据需要显式启动和停止的服务,而START_NOT_STICKY or START_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them.

4

2 回答 2

3

不,服务在从onStartCommand(). 请看这个

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

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

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

因此,START_NOT_STICKY 将保证只有在系统决定终止您的服务并且没有待处理的意图时,您的服务才会启动。请看这个了解START_NOT_STICKY

于 2013-02-28T03:52:06.180 回答
0

Vijay,您应该在单独的线程中提出您的问题,但这是解决方案

您可以通过实现 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

于 2013-02-28T18:39:40.393 回答