如何在Android的Service类中实现BroadcastReceiver?

16

我需要在我创建的Service类中实现广播接收器(BroadcastReceiver):

public class MyService extends Service
在这个班级里,我需要通过使用Thread-Sleep模拟下载来实现当用户在MyActivity类中按下按钮时使用sendBroadcast()。我无法将Service类扩展到BroadcastReceiver,因为它已经扩展到Service。有谁能帮我想出如何实现这种机制吗?

1
当您按下按钮时,使用该按钮启动服务,并在您的服务中注册广播接收器并发送广播。当服务启动时,请将另一个扩展BroadcastReceiver的类与扩展Service的类一起放置。 - JRowan
1个回答

32

把BroadcastReceiver作为您的服务的顶级类或内部类。并在您的服务中获取接收器的引用。像这样:

public class MyService extends Service {
    BroadcastReceiver mReceiver;

    // use this as an inner class like here or as a top-level class
    public class MyReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // do something
        }

        // constructor
        public MyReceiver(){

        }
    }

    @Override
    public void onCreate() {
         // get an instance of the receiver in your service
         IntentFilter filter = new IntentFilter();
         filter.addAction("action");
         filter.addAction("anotherAction");
         mReceiver = new MyReceiver();
         registerReceiver(mReceiver, filter);
    }
}

这个广播接收器需要添加到清单文件中吗?需要使用意图过滤器吗? - catalyst294
@rmmcnulty9 不行,因为接收器会在Service的onCreate()中在运行时注册。 - Steve Benett
我也遇到了同样的情况,我想运行一个无限后台服务,每当我们收到短信时它都会显示一个toast。为此,我创建了一个扩展Service的类。哪个选项更好,我应该在服务类中创建LocalBroadcastManager还是Standalone Broadcastreceiver?对于独立的broadcastreceiver,它必须在manifestfile中注册,那么当我接收短信时,我的服务和broadcastreceiver如何通信? - user448250
2
救了我的一天!...并且永远不要忘记在onPause或onDestroy中取消注册unregisterReceiver(mReceiver); - kosemuckel
哇,这真是一个精彩的答案 :) 即使过了这么多年 - cantona_7
我的应用程序为什么onReceive没有被调用? - hugo der hungrige

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接