BroadcastReCeiver内部实现

时间:2016-01-12 22:03:40

标签: android broadcastreceiver android-service intentservice android-broadcastreceiver

我试图了解广播接收器如何在内部工作。

当我调用registerReceiver()方法时,内部会发生什么?它是否在内部创建服务?

当我致电sendBroadcast时,内部会发生什么?

如果我必须实现自己的BroadcastReceiver类(不扩展Android BroadcastReceiver类),我该如何实现它?

我做了很多研究,但我只发现了BroadcastReceiver的工作原理。我也查看了Android源代码,了解它是如何工作的,但它也没有帮助。

3 个答案:

答案 0 :(得分:0)

您写道,您需要在不扩展Android BroadcastReceiver的情况下实施BroadcastReceiver。这是不可能的。 Android框架处理所有广播Intent的调度和传递到所有已注册为Intent的侦听器的组件。当某些应用程序调用{​​{1}}时,Android会检查是否有sendBroadcast()已注册为BroadcastReceiver的侦听器,如果找到任何Intent,则会实例化该组件(如果尚未实例化)然后调用组件的onReceive()方法。

如果您不扩展Android的BroadcastReceiver,则无法将您的组件注册为听众,Android也不会将您的班级称为“onReceive()

注意:如果您需要更多帮助,请说明您真正想做的事情。

答案 1 :(得分:0)

我不是Android的专家...但是其他一切的专家:P哈哈只是在开玩笑,我认为BroadcastReceiver就像一种(linux)crontab,它看起来像Android已经有一些软件(或内部服务)为此运行,当你使用它时......你"编程它" (对于那个" service")使用选定的过滤器和内容,这就是为什么即使你的应用程序没有运行也要调用它。或者我可能完全错了:)但这就是我的看法。

答案 2 :(得分:-1)

首先:

import android.content.BroadcastReceiver;

声明您的广播接收器:

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
         // Stuff you want to do when it receives something
    }
};

最后使用您希望广播阅读的Intent创建一个intent过滤器:

    IntentFilter iF = new IntentFilter();   // Example with some music players

    iF.addAction("com.android.music.metachanged");
    iF.addAction("com.htc.music.metachanged");
    iF.addAction("fm.last.android.metachanged");
    iF.addAction("com.sec.android.app.music.metachanged");
    iF.addAction("com.nullsoft.winamp.metachanged");
    iF.addAction("com.amazon.mp3.metachanged");
    iF.addAction("com.miui.player.metachanged");
    iF.addAction("com.real.IMP.metachanged");
    iF.addAction("com.sonyericsson.music.metachanged");
    iF.addAction("com.rdio.android.metachanged");
    iF.addAction("com.samsung.sec.android.MusicPlayer.metachanged");
    iF.addAction("com.andrew.apollo.metachanged");
    iF.addAction("com.spotify.mobile.android.metadatachanged");
    iF.addAction("com.spotify.music.metadatachanged");

    registerReceiver(mReceiver, iF);       // At the end you call your receiver with your intent Filter

希望有所帮助