我的应用程序中有Service
和BroadcastReceiver
,但是如何直接从中启动服务BroadcastReceiver
?使用
startService(new Intent(this, MyService.class));
不起作用BroadcastReceiver
,有什么想法吗?
编辑:
context.startService(..);
的作品,我忘了上下文部分
Answers:
别忘了
context.startService(..);
应该是这样的:
Intent i = new Intent(context, YourServiceName.class);
context.startService(i);
确保将服务添加到manifest.xml
使用BroadcastReceiver的context
fromonReceive
方法启动服务组件。
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, YourService.class);
context.startService(serviceIntent);
}
最佳实践 :
在创建意图时,尤其是从开始时BroadcastReceiver
,请勿将此作为上下文。就拿context.getApplicationContext()
像下面
Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);
因为接收者的onReceive(Context,Intent)方法在主线程上运行,所以它应该执行并快速返回。如果需要执行长时间运行的工作,请小心生成线程或启动后台服务,因为在onReceive()返回之后,系统可能会杀死整个进程。有关更多信息,请参见对流程状态的影响。要执行长期运行的工作,我们建议:
在接收者的onReceive()方法中调用goAsync()并将BroadcastReceiver.PendingResult传递给后台线程。从onReceive()返回后,这可使广播保持活动状态。但是,即使采用这种方法,系统也希望您能够非常快地完成广播(不到10秒)。它的确使您可以将工作移至另一个线程,以避免使主线程出现故障。使用JobScheduler developer.android.com安排工作