基础三:BroadcastReceiver

来源:互联网 发布:linux netstat 状态 编辑:程序博客网 时间:2024/05/29 17:39

broadcast receiver–广播接收器,接受全局的广播。


根据广播的种类分为系统广播和自定义广播。

  • 系统广播:电池消耗情况,开关机。一般系统广播为有序广播
  • 自定义广播:自己定义一个广播。
    根据广播的传播方式分为:普通广播和有序广播(orderedBroadcast)
  • 普通广播:异步执行,当一个broadcast发出后,所有与之匹配的broadcast都会同时接收到广播。
  • 有序广播:同步执行,会根据之前设置的优先级有序的执行,优先级高的接收器可以截断广播,从而停止广播的传送,传说中的短信电话拦截就是用的这个原理。
    根据广播的注册方式分为静态注册和动态注册。
  • 静态注册:在AndroidManifest中进行注册,广播会一直存在除非退出app。一般多用于系统广播注册。
  • 动态注册:在类中通过context.registerBroadcast()进行注册,可以通过onResume()注册,onPause()注销。
    广播的发送方式:

  • sendBroadcast(intent);

  • sendOrderedBroadcast(intent);–发送有序广播

onReceiver方法–当接收器接收到传递的广播时会调用onreiver方法,但是BroadcastReceiver的周期在onReceiver结束后结束,而且onReceiver是运行在主线程中的,如果需要执行耗时程序,需要开启service,创建新线程。


以下就通过代码来运用广播的注册与发送。

  • 静态注册广播
    <receiver android:name=".broadcast.MyReceiver" >            <intent-filter>                <action android:name="android.action.test" />            </intent-filter>            <intent-filter>                <action android:name="android.action.dynamic.test"/>            </intent-filter>        </receiver>
    @OnClick(R.id.send_broadcast)    void sendBroad() {        Intent intent = new Intent().setAction("android.action.test");        intent.putExtra("broad","register broadcast");        sendBroadcast(intent);    }
  • 动态注册广播
    @Override    protected void onResume() {        Log.i(TAG, "onResume");        super.onResume();        IntentFilter intentFilter=new IntentFilter();        intentFilter.addAction("android.action.dynamic.test");        registerReceiver(new MyReceiver(), intentFilter);    }    @Override    protected void onPause() {        Log.i(TAG, "onPause");        super.onPause();        unregisterReceiver(new MyReceiver());    }
    @OnClick(R.id.send_dynemic_broadcast)    void sendDynemicBroad(){        Intent intent =new Intent().setAction("android.action.dynamic.test");        intent.putExtra("broad","dynamic reggister broadcast");        sendBroadcast(intent);    }

继承BroadcaReceiver的类,调用onReceiver方法。

public class MyReceiver extends BroadcastReceiver {    public MyReceiver() {    }    //    不能执行超过5秒的任务,可以用service,关于context,若是静态注册,则context为系统context,若动态注册,则context为注册的那个类    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        if (**intent.getAction().equals("android.action.dynamic.test")**){            DebugLog.i("broad"+intent.getStringExtra("broad"));            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();        }else if (intent.getAction().equals("android.action.test")){            DebugLog.i("dynamicBroad"+intent.getStringExtra("broad"));            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();        }        Log.i("MyReceive", "onReceive" + intent.getAction());    }}

receiver


上图图片就是静态注册和动态注册后执行的方法

0 0
原创粉丝点击