繁体   English   中英

START_NOT_STICKY服务中的工作线程

[英]Worker thread in START_NOT_STICKY service

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

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

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

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

编辑(来自android doc)

对于已启动的服务,可以决定运行其他两种主要操作模式,具体取决于它们从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.

不,服务从onStartCommand()返回后不会停止。 请看这个

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

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

  • 如果返回的值是START_STICKY ,它将重新创建服务进程,并将使用任何挂起的Intents调用onStartCommand()或null(如果没有挂起的Intents)。
  • 如果返回START_NOT_STICKY ,系统将再次创建服务进程,并且仅当有任何挂起的Intent时才会调用onStartCommand()。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM