Android广播接收者详解

广播

系统在运行中会产生很多事件,某些特定的事件产生时(如 低电量、开机、应用安装卸载、收发短信、屏幕解锁等等),系统会发送广播通知。当应用收到广播时根据情况作出相应反应。


创建广播接受者(BroadcastReceiver)

  • 创建Java类继承自 BroadcastReceiver
  • 在清单文件中配置 IntentFilter 属性中配置 action 属性
  • 添加权限
<receiver android:name=".MyReceiver">
            <intent-filter>
                
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            intent-filter>
        receiver>

收到广播后可以自onReceive 方法里做自己的操作:

 public void onReceive(Context context, Intent intent) {
        System.out.println("收到打电话广播");
        System.out.println("拦截电话号码:" + getResultData());
        setResultData("110");
    }

通过 getResultData 获取电话号码,setResultData 重新设置电话号码。


  • 即使广播接收者所在的应用进程被杀死,当相应的广播发出后,只要匹配成功,就会自动启动该进程。
 <receiver android:name=".MyReceiver">
            <intent-filter  android:priority="1000">
                
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            intent-filter>
        receiver>

设置优先级 android:priority=”1000” 理论上是 -1000~+1000 实际上可以更大 比如 int的最大值 优先级越高越先收到。

abortBroadcast();拦截广播   只对有序广播有效  无序广播不能拦截
4.0之后,如果应用没有启动过,广播接收者不会生效。
用户手动关闭应用之后不会再次启动(强制关闭)

发送自定义广播

使用 Intent 发送广播。
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendBroadcast(intent);

如果需要接收此广播,只需要创建一个广播接收者,使其 action 匹配。


发送有序广播

Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendOrderedBroadcast(intent, null, null, null, 0, "这是广播内容", null);

发送有序广播

----------

参数解析: 

public void sendOrderedBroadcast(
        Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
        Handler scheduler, int initialCode, String initialData,
        Bundle initialExtras) {
        mBase.sendOrderedBroadcast(intent, receiverPermission,
                resultReceiver, scheduler, initialCode,
                initialData, initialExtras);
    }
-----------------
    receiverPermission  是指接收权限
    initialCode  类似于请求码
    initialData  广播内容  如果内容简单  直接在这里设置
    initialExtras  广播内容    复杂数据传递
    resultReceiver  最终接收者   一定会收到  最后收到  不论是否拦截  并且不需要再清单文件中配置  
  • 在每一层都可以做修改,甚至拦截
class ResultReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("最终接收者");
        }
    }

广播的动态注册和静态注册

 public void register(View view) {
        // 注册广播接收
        myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.gechao.test");    //只有持有相同的action的接受者才能接收此广播
        registerReceiver(myReceiver, filter);
    }


    public void send(View view) {
        Intent intent = new Intent();
        intent.setAction("com.gechao.test");
        sendBroadcast(intent);
    }

    public void unregister(View view) {
        if (myReceiver != null) {
            unregisterReceiver(myReceiver);
        }

    }

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("收到广播");
    }
}

你可能感兴趣的:(Android开发笔记)