从BroadcastReceiver启动服务

时间:2011-01-09 20:53:09

标签: android broadcastreceiver

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

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

BroadcastReceiver中无效,有什么想法吗?

编辑:

  

context.startService(..);

有效,我忘了上下文部分

6 个答案:

答案 0 :(得分:99)

别忘了

  

context.startService(..);

答案 1 :(得分:55)

应该是这样的:

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

确保将服务添加到manifest.xml

答案 2 :(得分:8)

使用BroadcastReceiveronReceive方法中的@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();
    }