BroadcastReceiver 广播接收者

广播:
他是android里面的一种机制,模式,系统底层可以发出广播,其他的应用程序可以发出广播,自己的应用程序发出广播。
类别:
1 普通广播
    发出广播之后,所有的接受者同时接收到广播,没有优先级别
2 有序广播
    有序的广播,是有接收的优先级别。这种广播是可以被中断的。
     有序广播的优先级 别   -1000~ 1000.(Integer.MAX_VALUE)


广播接收者:
他是android的四大组件之一。是用来接收广播的。
但是在接收广播之前,订阅广播。(调频)

 

有两种方式可以订阅广播

1、在清单文件中

 <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="com.ccc.zhangsan.action"/>
            </intent-filter>
        </receiver>


 

2、在代码中

 //订阅广播  这是在代码中订阅
        MyReceiver receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.ccc.zhangsan.action");
        registerReceiver(receiver, filter);

示例,在自己的应用里发送广播


首先写一个类继承BroadcastReceiver,首先得有广播,这里在布局里定义一个button,点击后发送广播,可以上面两种方式订阅广播,如果是代码订阅,可以在activity中写订阅代码

public class MainActivity extends Activity {
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //订阅广播  这是在代码中订阅
        MyReceiver receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.ccc.huahua.action");
        registerReceiver(receiver, filter);
        
    }
    
    public void send(View v){
    	//发广播(普通)
    	Intent intent = new Intent();
    	intent.setAction("com.ccc.zhangsan.action");
    	intent.putExtra("name", "张三");
    	sendBroadcast(intent);
    	
    	//发送有序广播
//    	sendOrderedBroadcast(intent, receiverPermission);
    }
}


 

public class MyReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String name = intent.getStringExtra("name");
		Log.i("i", name);
	}

}

两种订阅方式有什么区别?
在清单文件中订阅的优先级别要低一点,他是由操作系统进行订阅的。
在代码中订阅的优先级别会高一定,因为他的订阅是在内容中完成。

 

 

系统会发出一些广播:
1 时间改变
2 短信到来
3 锁屏
4 外拨
5 时区改变。。。。


第二个示例是订阅系统发出的广播,这里演示短信到来

首先在清单文件里订阅广播

  <receiver android:name=".SmsReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

注意添加权限

 <!-- 接收短信的权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>


这里没界面,直接定义一个类继承BroadcastReceiver演示

public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
        Log.i("i", "拦截到短信...");
        
        Object[] objects = (Object[]) intent.getExtras().get("pdus");//底层封装好的
        for(Object obj:objects){
        	//短信对象
        	SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);//把数据类转成短信对象
        	
        	//地址
        	String address = smsMessage.getDisplayOriginatingAddress();
        	
        	//内容
        	String body = smsMessage.getDisplayMessageBody();
        	
        	//时间
        	long date = smsMessage.getTimestampMillis();
        	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//对时间进行格式化
        	String dateStr = format.format(date);
        	
        	Log.i("i", address);
        	Log.i("i", body);
        	Log.i("i", dateStr);
        	
        	if("5558".equals(address)){
        		//黑名单
        		//中断短信(中断广播)
        		abortBroadcast();
        	}
        			
        }
        
	}

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值