从BroadcastReceiver启动服务


70

我的应用程序中有ServiceBroadcastReceiver,但是如何直接从中启动服务BroadcastReceiver?使用

startService(new Intent(this, MyService.class));

不起作用BroadcastReceiver,有什么想法吗?

编辑:

context.startService(..);

的作品,我忘了上下文部分

Answers:



60

应该是这样的:

Intent i = new Intent(context, YourServiceName.class);
context.startService(i);

确保将服务添加到manifest.xml


典型的清单项目(位于<application>下,与“ activity>”处于同一“级别”):<receiver android:name =“。YourServiceName”> </ receiver>
Art Swri

@ArtSwri,它应该是<service android:name =“。YourServiceName”> </ service>而不是接收者。
拉胡尔(Rahul)

11

使用BroadcastReceivercontextfromonReceive方法启动服务组件。

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

最后,有人在乎提到什么是“上下文”。谢谢。
Virus721

6

最佳实践 :

在创建意图时,尤其是从开始时BroadcastReceiver,请勿将此作为上下文。就拿context.getApplicationContext()像下面

 Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);

1
是。我们应该传递context.getApplicationContext(),否则应用程序将崩溃
Vijay

1
提提为什么请?
Virus721

1
原因的原因:上下文注册的接收者只要其注册上下文有效就可以接收广播。例如,如果您在Activity上下文中注册,则只要该活动未销毁,您就会收到广播。如果您在“应用程序”上下文中注册,则只要该应用程序正在运行,您就会收到广播。
ARUN

仍然对我崩溃。
zezba9000 '20

1
 try {
        Intent intentService = new Intent(context, MyNewIntentService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intentService );
        } else {
            context.startService(intentService );
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

0

因为接收者的onReceive(Context,Intent)方法在主线程上运行,所以它应该执行并快速返回。如果需要执行长时间运行的工作,请小心生成线程或启动后台服务,因为在onReceive()返回之后,系统可能会杀死整个进程。有关更多信息,请参见对流程状态的影响。要执行长期运行的工作,我们建议:

在接收者的onReceive()方法中调用goAsync()并将BroadcastReceiver.PendingResult传递给后台线程。从onReceive()返回后,这可使广播保持活动状态。但是,即使采用这种方法,系统也希望您能够非常快地完成广播(不到10秒)。它的确使您可以将工作移至另一个线程,以避免使主线程出现故障。使用JobScheduler developer.android.com安排工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.