【Android】の基础——BroadcastReceiver

    xiaoxiao2021-03-25  87

    BroadcastReceiver 注册方式 静态注册动态注册 发送广播分类 普通广播有序广播 onReceive广播发送过程

    BroadcastReceiver

    广播接收者(简称广播)在安卓开发中应用广泛,使用起来也很简单。

    注册方式

    首先创建一个BroadcastReceiver:

    package com.scott.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class MyReceiver extends BroadcastReceiver { private static final String TAG = "MyReceiver"; @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.i(TAG, msg); } }

    静态注册

    <receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.intent.action.MY_BROADCAST"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>

    在menifest里面注册,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。

    动态注册

    MyReceiver receiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.MY_BROADCAST"); registerReceiver(receiver, filter);

    通常在Activity或Service中注册,并且要在它们销毁的时候解除注册。

    @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }

    发送广播分类

    普通广播

    使用方法:sendBroadcast() Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED"); //通过intent传递少量数据 intent.putExtra("data", "finch"); // 发送普通广播 sendBroadcast(Intent); 普通广播

    对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

    有序广播

    //发送有序广播 sendOrderedBroadcast(intent, null);   在有序广播中,我们可以在前一个广播接收者将处理好的数据传送给后面的广播接收者,也可以调用abortBroadcast()来终结广播的传播。 public void onReceive(Context arg0, Intent intent) {   //获取上一个广播的bundle数据   Bundle bundle = getResultExtras(true);//true:前一个广播没有结果时创建新的Bundle;false:不创建Bundle   bundle.putString("key", "777");   //将bundle数据放入广播中传给下一个广播接收者   setResultExtras(bundle);       //终止广播传给下一个广播接收者   abortBroadcast(); }

    有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。

    onReceive()

    一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。 因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。一个Broadcast receiver只有一个回调方法: void onReceive(Context curContext, Intent broadcastMsg) 当Broadcast receiver接收到一条广播信息,android会调用它的onReceive()方法,并传递给它一个包含广播信息的intent对象。当Broadcast receiver在执行这个方法时可以认为它是活动的,onReceive()方法返回时,它便终止了。

    广播发送过程

    通过sendBroadcast()把一个广播通过Binder发送给ActivityManagerService,ActivityManagerService根据这个广播的Action找到相应的广播接收器,然后把广播放进自己的消息队列中。ActivityManagerService在消息循环中处理这个广播,并通过Binder机制把这个广播分发给注册的ReceiverDispatcher,ReceiverDispatcher把这个广播放进MainActivity所在现成的消息队列中。ReceiverDispatcher的内部类Args在MainActivity所在的线程消息循环中处理这个广播,最终是将这个广播分发给对应的BroadcastReceiver实例处理。
    转载请注明原文地址: https://ju.6miu.com/read-15991.html

    最新回复(0)