什么是广播
1.广播是安卓四大组件之一,全称BroadcastReceiver;
2.广播分为发送和接收方,就算没有接收方,发送方也会发送数据;
3.广播可以实现跨多个页面的数据通信;
4.广播可以实现跨进程(APP)间的数据通信。
注意:广播分为三个部分:
无序广播:所有监听此广播的接受者都能收到;
有序广播按照接受者的优先级,逐一传递,优先级最高的接收者先接收,如果不终止此广播,再往下传递;
粘滞广播;当广播发出后,如果系统没有接收者,会一直等待,直到有接收者为止。
准备工作:
创建两个Project(发送方SendBroadCastDemo和接收方ReceiverBroadCastDemo)
无序注册
1.静态
SendBroadCastDemo里设置Button按钮和点击事件自然不必多说,然后在MainActivity.java按钮点击事件中发送广播,代码如下:
package com.lenovo.sendbroadcastdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button sendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发送广播
Intent intent = new Intent("com.test.receiver.action");
sendBroadcast(intent,null);
}
});
}
private void bindID() {
sendBtn = findViewById(R.id.send_btn);
}
}
然后在ReceiverBroadCastDemo中新建类(MyReceiver1)继承BroadcastReceiver
package com.lenovo.receiverbroadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.e("TAG", "Receiver1 = 11111111111111111111");
}
}
重点在于AndroidManifest.xml中添加receiver标签
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.test.receiver.action"/>//name的值必须与发送广播时Intent的值相同
</intent-filter>
</receiver>//receiver标签位于application标签内
2.动态
动态注册相比较于静态注册,发送方SendBroadCastDemo的代码不变,不需要在AndroidManifest中设置receiver标签,转变为在接收方ReceiverBroadCastDemo的MainActivity中设置receiver标签对应的Java代码,示例如下:
package com.lenovo.receiverbroadcastdemo;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
private MyReceiver2 receiver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.receiver.action");
//动态注册广播接收器
registerReceiver(receiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
动态注册的步骤一一对应receiver标签内的三层关系
receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.receiver.action");
有序注册
1.静态
相对于静态无序注册,首先需要将发送广播处的sendBroadcast改为sendOrderedBroadcast
//发送广播
Intent intent = new Intent("com.test.receiver.action");
sendOrderedBroadcast(intent,null);
在接收方ReceiverBroadCastDemo内新建类MyReceiver2继承BroadcastReceiver,然后在AndroidManifest中添加receiver标签,这里加上了优先级priority
<receiver android:name=".MyReceiver">
<intent-filter android:priority="-1000">
<action android:name="com.test.receiver.action"/>
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="1000">
<action android:name="com.test.receiver.action"/>
</intent-filter>
</receiver>
2.动态
同样的,动态注册取消在AndroidManifest内的receiver标签,改为在MainActivity中写receiver标签对应的Java代码
package com.lenovo.receiverbroadcastdemo;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
private MyReceiver2 receiver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.receiver.action");
intentFilter.setPriority(-1000);
//动态注册广播接收器
registerReceiver(receiver,intentFilter);
receiver2 = new MyReceiver2();
IntentFilter intentFilter2 = new IntentFilter();
intentFilter2.addAction("com.test.receiver.action");
intentFilter2.setPriority(1000);
registerReceiver(receiver2,intentFilter2);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
unregisterReceiver(receiver2);
}
}