5

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

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

当我打电话时内部会发生什么sendBroadcast

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

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

4

3 回答 3

0

我不是 Android 方面的专家......但其他方面的专家:P 哈哈开玩笑,我认为 BroadcastReceiver 就像一种(linux)crontab,看起来 Android 已经有某种软件(或内部服务)为此运行,当你使用它时......你用选定的过滤器和东西“编程”(到那个“服务”),这就是即使你的应用程序没有运行也会被调用的原因。或者也许我完全错了:) 但这就是我的看法。

于 2016-10-31T02:58:38.430 回答
0

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

如果您不扩展 Android BroadcastReceiver,则无法将您的组件注册为侦听器,Android 将不会调用您的类onReceive()

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

于 2016-01-26T16:05:29.707 回答
-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
    }
};

最后使用您希望广播读取的意图创建一个意图过滤器:

    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

希望能帮助到你

于 2016-01-26T16:19:43.853 回答