今天玩了下android中的广播,当然了,只是很浅的东西,毕竟还是菜鸟中,嘿嘿!
首先,我们来认识下静态广播与动态广播的区别:
- 静态广播是在清单文件中配置属性,而动态广播是用java代码实现;
- 动态广播在无序广播中的优先级大于静态广播;
- 动态广播在退出后,不会接收到广播。
下面,我模拟了一个发送广播的代码:
xml代码:
<EditText
android:id="@+id/et_main_sender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入广播内容:" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="send"
/>
java代码:
`private EditText et_main_sender;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_sender = (EditText) findViewById(R.id.et_main_sender);
intent = new Intent();
//给广播设置名称
intent.setAction("com.android_sender.893");
}
public void send(View view){
//获取编辑框的内容
String context=et_main_sender.getText().toString();
//将内容放入intent中
intent.putExtra("context",context);
//发送广播(无序广播)
sendBroadcast(intent);
}`
以上就是一个简易的发送广播的功能,当在编辑框输入广播内容,点击发送,广播就发送到intent中去了。
下面我们来接收,这是新建的一个module,并新建一个类,使它继承BroadcastReceiver:
java代码:
public class MyReceived01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断intent中是否有名称为com.android_sender.893的广播
if("com.android_sender.893".equals(intent.getAction())){
String data=intent.getStringExtra("context");
Log.i("test","广播1号接收到:"+data);
}
}
}
不过,这是静态的广播,还需要在清单文件中配置一下:
<receiver android:name=".MyReceived01">
<intent-filter>
<action android:name="com.android_bcsender.893"></action>
</intent-filter>
</receiver>
那么,下面我们再来看看动态广播:
动态广播,就是指在Activity中用java代码实现接收广播:
public class MainActivity extends AppCompatActivity {
private MyRecevier01 myRecevier01;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化MyRecevier01
myRecevier01 = new MyRecevier01();
//实例化interFilter
intentFilter = new IntentFilter();
//给intentFilter添加一个行为
intentFilter.addAction("com.android_bcsender.893");
}
@Override
protected void onResume() {
super.onResume();
//动态注册广播 (静态注册是在清单文件中配置)
registerReceiver(myRecevier01,intentFilter);
}
//必须要写的
@Override
protected void onDestroy() {
super.onDestroy();
//注销动态广播
unregisterReceiver(myRecevier01);
}
}
当退出当前程序时,动态广播需要注销掉!!!
最后,我们再来看看黏性广播:
在写黏性广播时,一定要注意,需要在发送广播的清单文件中给予
权限:<!--给黏性广播设置权限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
然后在发送广播的Activity的send方法中将//发送广播
替换成
sendBroadcast(intent);//发送黏性广播
sendStickyBroadcast(intent);
下面我还模拟了一个系统广播,如果同行们想自己再去捣鼓其他的系统广播,可以看看android系统广播大全
首先,在清单文件中配置一个receiver:<receiver android:name=".MyPhoneState">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
然后新建一个类继承BroadcastReceiver:
`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”,”来电话了!”);
//获取电话状态
//需要用到电话管理者
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;
}
}
}
}`
那么,以上就是我今天所学的,如果有哪些不妥的地方,一定要在下方评论区,或者私信给我,谢谢亲们!让我们一起进步吧!