我试图了解广播接收器如何在内部工作。
当我调用registerReceiver()
方法时,内部会发生什么?它是否在内部创建服务?
当我致电sendBroadcast
时,内部会发生什么?
如果我必须实现自己的BroadcastReceiver
类(不扩展Android BroadcastReceiver
类),我该如何实现它?
我做了很多研究,但我只发现了BroadcastReceiver
的工作原理。我也查看了Android源代码,了解它是如何工作的,但它也没有帮助。
答案 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
希望有所帮助