Adroid 广播 分为有序和无序广播 sendOrderBroadcast 、sendBroadcast。
一、无序广播发送方:
实例化一个Intent,用intent.setAction(设置广播名字),并且携带要发送的
数据(intent.putExtra),然后用sendBroadcast(intent)发送广播。
intent = new Intent();
//设置名字
intent.setAction("com.example.phonebroad.955");
}
public void send(View view){
//获取发送的内容
String date=mian_01.getText().toString();
intent.putExtra("data",date);
sendBroadcast(intent);
//粘性广播 (也分为有序和无序 已过时,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。)api需要权限:<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission><application
//sendStickyBroadcast(intent);
}
接收方: 需要配置广播接受者:
1.在清单文件中配置(静态广播 )
<receiver android:name=".ReceviedActivity">
<intent-filter>
<action android:name="com.example.phonebroad.955"></action>
</intent-filter>
</receiver>
</application>
public class ReceviedActivity extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断你要接收的广播的名字
if("com.example.phonebroad.955".equals(intent.getAction())){ //接收内容
String data=intent.getStringExtra("data");
Log.i("hhhhhh",data);
}
}
2.使用java 代码(动态广播 优先于静态广播接收)
public class Recevied2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("com.example.phonebroad.955".equals(intent.getAction())){
String data=intent.getStringExtra("data");
Log.i("hhhh2",data);
}
}
}
public class MainActivity extends AppCompatActivity {
private Recevied2 recevied2;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recevied2 = new Recevied2();
//意图过滤器
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.phonebroad.955");
}
//恢复时注册
@Override
protected void onResume() {
super.onResume();
registerReceiver(recevied2,intentFilter);
}
//销毁时取消注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(recevied2);
}
}
二、有序广播:
设置发送者为有序:
sendOrderedBroadcast(intent,null);
在清单文件中制定顺序一般为 -1000~1000
android:priority=”1000”
例如:短信接收者的配置 (静态)
<receiver android:name=".MySMSReceived">
<intent-filter
android:priority="1000"
>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
Java配置(动态)
intentFilter = new IntentFilter();
intentFilter.addAction("com.zking.g150831_android20_sender.955");
intentFilter.setPriority(998);
有序广播前者接收还可以更改广播内容:
//广播原内容
String data=intent.getStringExtra("data");
//改变内容
Bundle bundle=new Bundle();
bundle.putString("content",data+",哈哈 这是真的吗?");
setResultExtras(bundle);
//下一个广播获取值的方式
Bundle bundle=getResultExtras(true);
String content=bundle.getString("content");
三、短信接收小例子:
首先还是获取短信接收的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
及配置短信接收者(上方的配置静态有序广播的代码段)
public class MySMSReceived extends BroadcastReceiver {
private String body;
@Override
public void onReceive(Context context, Intent intent) {
if("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())){
//获取短信的内容
Bundle bundle=intent.getExtras();
Object[] objects= (Object[]) bundle.get("pdus");
SmsMessage[] smsMessages=new SmsMessage[objects.length];
for (int i = 0; i < objects.length; i++) { smsMessages[i]=SmsMessage.createFromPdu((byte[])objects[i]);
}
for (SmsMessage message : smsMessages) {
//发送人的号码
String address = message.getDisplayOriginatingAddress();
//发送的内容
body = message.getDisplayMessageBody();
}
//根据短信内容拦截短信
if(body.contains("中奖了")){
//拦截
abortBroadcast();
}
}
}
}
四、系统广播之监听手机通话状态事件
public class PhoneActivity 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("phone","大胡子:"+number);
//电话管理者
TelephonyManager tm= (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//来电状态
int state=tm.getCallState();
//3个状态
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>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".PhoneActivity">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"></action>
</intent-filter>
</receiver>
</application>
“合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。“