今天来记录一下学的广播,写了一个自定义广播的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>
我是按照我的理解写的,可能在对一些专有名词的定义不是那么官方,如有不足,请多多指教。