安卓 广播

今天来记录一下学的广播,写了一个自定义广播的demo(无序)

对于广播,简单的理解可以认为是我们平时听的电台,它负责发送,但不能保证每个人都会接收。一般情况下,我们只负责接收,系统负责发送。我写的是自定义的,所以既有发送者,也有接收者。同时也是无序的。接下来我就说一下我是怎么写的吧!

作为发送者,首先需要得到你发送的内容,通过intent携带数据过去,当然别忘了设置action (也就是个给你的广播设置一个名字)不然别人怎么能接收到你呢?具体代码如下 :

public class MainActivity extends AppCompatActivity {

    private EditText et_send;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_send = (EditText) findViewById(R.id.et_send);

        //通过intent跳
        intent = new Intent();


        //设置广播的名字(设置action)
    intent.setAction("com.example.an_send.911");

    }



   //发送
    public  void bt_send(View view){
        //得到内容
       String content= et_send.getText().toString();

       //携带数据
        intent .putExtra("data",content);

        //发送广播(无序)
       // sendBroadcast(intent);
    }

作为接收者呢,你先需要判断你收到的名字与发过来的是否匹配,如果匹配,再得到其传过来的数据,具体代码如下:

//接收
    @Override
    public void onReceive(Context context, Intent intent) {
        if("com.example.an_send.911".equals(intent.getAction())){
            String data= intent.getStringExtra("data");
            Log.i("test","01号接受者收到广播了:"+data);

      }

但别忘了配置清单文件哦 ,配置广播接收者呢,有两种方法,一种是直接在清单文件当中配置,这种叫静态广播,另一种是用Java代码,这种叫动态广播。

清单配置代码如下:

<receiver android:name=".Myrecevied01">
            <intent-filter
                android:priority="999"
                >
                <action android:name="com.example.an_send.911"></action>

            </intent-filter>
        </receiver>

Java代码:

public class MainActivity extends AppCompatActivity {

    private Myrecevied02 myrecevied02;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//实例化二号接收者activity
        myrecevied02 = new Myrecevied02();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.an_send.911");


@Override
    protected void onResume() {
        super.onResume();
        //动态注册广播
        registerReceiver( myrecevied02,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销动态广播
        unregisterReceiver(myrecevied02);
    }

注意:1、动态的优先级要高于静态,所以不论是谁先安装,动态广播都会被先调用。

2、动态广播的不足,如果其退出了,就不能接收到发送过来的消息,为了解决这个不足,所以发送时就通过黏性广播发送,但需要添加黏性广播的权限。

说了无序 ,就来说一下有序吧!顾名思义,有序就是与无序相反嘛!就像一句古话:坏事传千里。就相当于有序传播。有序广播跟无序传播的区别是:它的的发送方式是有序的,其代码如下:

 sendOrderedBroadcast(intent,null);

其接收呢也是一样的,只是有序广播可以设置优先级,优先级高的便先接收到,当然如果在没设优先级的情况下,动态大于静态。其设置优先级的范围为-1000~1000。如果是动态的只能在Java代码中设置,静态只能在配置文件中设,其代码如下:

 <receiver android:name=".Myrecevied01">
            <intent-filter
    <!--设置优先级-->            android:priority="999"
                >
                <action android:name="com.example.an_send.911"></action>

            </intent-filter>
        </receiver>

有序广播由于存在优先级,所以先收到消息的有权阻止消息的传播以及修改消息的内容;
阻止传播,代码如下:


 if("中奖了".equals(data)){
              //阻止
               abortBroadcast();
            }

修改消息,代码如下:

   //传播下一个 改变内容 Bundle
            Bundle bundle=new Bundle();
            bundle.putString("content",data+"呀!中了5毛");
            setResultExtras(bundle);

如果其改变了内容,接收者便通过Bundle接收新的内容 其代码如下:

public class Myrecevied02 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
//先判断
        if ("com.example.an_send.911".equals(intent.getAction())){
//            String data= intent.getStringExtra("data");
//            Log.i("test","02号接受者收到广播了:"+data);

            Bundle bundle=getResultExtras(true);
            String content=bundle.getString("content");

            Log.i("test","02号接受者收到广播了:"+content);
        }
    }

说了有序,无序广播,再来讲一下系统广播吧!系统广播有很多,比如开机启动,来电…… 简单说就是系统给我们发广播,我们负责接收。我写了一个来电的demo。首先也是需要判断你接收的名字要与系统发过来的保持一致,然后获取电话号码,再获取电话状态,但在获取状态前,你先获取电话的管理者,通过管理者获取状态,在根据状态判断。具体代码如下:

public class Myphonestate extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.PHONE_STATE".equals(intent.getAction())) {
            //获取电话号码
            String number = intent.getStringExtra("incoming_number");
            Log.i("test", "有电话进来了," + number);


            //获取电话的状态
            //电话管理者
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

            int state = tm.getCallState();
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i("test", "来电了");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i("test", "通话中");
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i("test", "挂了");
                    break;

            }

        }}

有一点就是你需读取电话状态权限(配置文件)
其代码如下:

  <!--读取电话状态权限-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

我是按照我的理解写的,可能在对一些专有名词的定义不是那么官方,如有不足,请多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值