广播:
他是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();
}
}
}
}