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