广播的学习初学者

1android的广播分为:广播发送者和广播接收者。广播就是一个全局监听器,用于监听系统全局的广播消息。只有继承到Broadcast的类才能捕捉到系统发出的广播消息。让后你想干嘛就干嘛呗。O(_)O

 

2android中可以用到广播的地方:1.同一app内部的同一组件内的消息通信(单个或多个线程)

       2.同一app内部的不同组件之间的消息通信(单个进程)

       3. 同一app具有多个进程的不同组件之间的消息通信

       4. 不同app组件之间的消息通信

       5.android系统在特定情况下与app之间的消息通信

 

3、创建广播发送者  代码:

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.Toast;

/**

 * 广播发送者

 * @author rou

 * @date 2016330

 */

public classMainActivity extends Activity {

privateButton button;

privateOnClickListener Listener = new OnClickListener() {

@Override

publicvoid onClick(View arg0) {

Intentintent = new Intent();

intent.setAction("com.love");//指定广播的频率

intent.putExtra("name","xiaorou");//指定广播发送出去的消息

MainActivity.this.sendBroadcast(intent);//发送广播

Toast.makeText(getApplicationContext(), "发送广播成功",1).show();

}

};

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button= (Button) findViewById(R.id.button);

button.setOnClickListener(Listener);

}

}

 

4、创建广播接收者 代码:

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

/**

 * 自定义广播接收者

 * @author rou

 * @date 2016330

 */

public classMyBroadcastReciver extends BroadcastReceiver{

@Override

publicvoid onReceive(Context context, Intent intent) {

Stringname = intent.getExtras().getString("name");

System.out.println("接受到"+name);

}

}

 

AndroidManifest.xml:

  <!-- 注册广播接收(静态) -->

        <receiverandroid:name="com.myandroidexerciseone.MyBroadcastReciver">  name:的值为类的全路径

            <intent-filter>

                <actionandroid:name="com.love"/>  相当于是指定接收的广播的频率

            </intent-filter>

        </receiver>

 

5、注册广播接收者: 静态注册:如上,在安卓清单文件中注册。

动态注册: 在应用程序被启动时执行注册,相对应的在应用程序退出时,必

                        须要取消注册。注册:context.registerReceiver(receiver,filter);

                                              取消注册:context.unregisterReceiver(reciever);

动态注册:

代码:oncreate 方法里: 1.实列化一个过滤器

              IntentFilterintentFilter = new IntentFilter();

              2.添加过滤的Action

             intentFilter.addAction(Intent.Action_AIRPLANE_MODE_CHANGED);

             3.实例化广播监听

             NetChangReceivernetChangReceiver = new NetChangReceiver();

             4.将广播监听器和过滤器注册在一起

             registerReceiver(netChangReceiver,intentFilter);

           onDestory方法里:销毁activity时取消注册广播监听

                                              unregisterReceiver(netChangReceiver);

 

6、广播的分类: 有序广播:普通广播不能中断,所有监听这个广播的都能收到信息。而有序广播

             可以中断。 中断广播的传播:abortBroadcast();

              优点:按优先级的不同,优先Receiver可对数据进行处理,并传递给                 

                           下一个Receiver。设置优先级,在<intent-filter>节点中添加

                            android:priority属性 ,取值范围:-1000~~1000

              缺点:效率低。

             优先接收到BroadcastReceiver可通过setResultExtras(Bundle)方法将处           

             理结果存入Broadcast中。

  粘性广播:主要是为了解决,在发送完广播之后,动态注册的接收者,也能够收

                        到广播。

                         列如:先发送一个广播,我的接收者是通过程序中的某个按钮动态

                                        注册的,如果不是粘性广播,我注册完接收者肯定无法收到

                                        广播了,要是通过发送粘性广播就能够在我动态注册完接收

                                        者后也能收到广播。

                           添加权限<uses-permissionandroid:nnaem="android.permission.BROADCAST_STICKY"/>

生命周期:广播接收者的生命周期是非常短的,在接收到广播的 时候创建,onReceiver()方法

                      结束之后销毁。

注意:广播接收器的执行和activity以及service的执行一样都是由AndroidMain主线程负责的。

             所以为了避免对主线程的UI绘制工作产生严重的干扰,广播的onReceive方法中不能做

             非常复杂的操作。因为这个方法的执行时间被限定到了10秒之内。否则就会报ANR异常。

 

7、系统广播:

      开机启动android.intent.action.BOOT_COMPLETED

                权限:<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

                android4.0无效,如果需要监听开机广播需要把应用升级为系统应用。

    SD卡加载已完成Intent.ACTION_MEDIA_MOUNTED

    收到短信android.provider.Telephony.SMS_RECEIVED

            权限:<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>

            获取短信内容:Object[]objArray=(Object[])bundle.get("pdus");构建短信对象array

                          SmsMessage[] messages= new SmsMessage[objArray.length];根据收到的对象长度创建array长度

                         for(int i=0;i<objArray.length;i++){

                             messages[i]=SmsMessage.createFromPdu((byte[])objArray[i]);                          

   }把每一个单元的pdu格式的短信转换成SmsMessage对象

       for(SmsMessage s:sms){

      String msg =s.getDisplayMessageBody();

      String source =s.getDisplayOriginatingAddress();

   }获取短信的内容和对方的手机号码

    来电android.intent.action.PHOTO_STATE

权限:android.permission.READ_PHONE_STATE

获取电话管理服务,获得电话状态:TelephonyManager tm =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

获取来电号码:intent.getStringExtra("incoming_number");

int state =tm.getCallState();来电三种状态:响铃 TelephonyManager.CAll_STATE_RINGING

  接听 TelephonyManager.CALL_STATE_OFFHOOK

    挂断 TelephonyManager.CALL_STATE_IDLE

      去电android.intent.action.NEW_OUTGOING_CALL

  权限:android.permission.PROCESS_OUTGOING_CALLS

       android.permission.CALL_PHOTO

 得到去电话的号码:String phone = intent.getStringExtra(Intent.EXTRA_PHTOT_NUMBER);

 屏幕休眠:休眠:intent.ACTION_SCREEN_ON

              唤醒:Intent.ACTION_SCREEN_OFF

          注意屏幕唤醒和休眠广播只能在代码中注册,在清单文件中将不起作用

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值