说明
广播分为系统广播、自定义广播
系统广播包含网络开启广播、开机广播等系统自带的
自定义广播:顾名思义就是自己定义的广播
接收广播
接收广播:分为静态接收广播、动态接收广播;
静态接收广播
1、新建广播接收类
java/com/pha/three/receiver/StaticBroadcastReceiver.java
package com.pha.three.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import com.pha.three.face.ReceiverFlag;
public class StaticBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = StaticBroadcastReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
if(ReceiverFlag.Static_Receiver_Name.equals(intent.getAction()))
Toast.makeText(context, "我已经接收信息", Toast.LENGTH_SHORT).show();
}
}
其中 ReceiverFlag.Static_Receiver_Name 是一个广播标识,我单独放到一个文件中,当然也可以放一起
java/com/pha/three/face/ReceiverFlag.java
package com.pha.three.face;
import android.nfc.Tag;
public interface ReceiverFlag {
// 静态广播接收者标识
String Static_Receiver_Name ="com.pha.three.face.ReceiverFlag";
// 动态广播接收者标识
String Trends_Receiver_Name ="com.pha.three.face.ReceiverFlag.Trends";
}
2、静态注册接收广播
在AndroidManifest.xml中注册,其代码:
<receiver android:name=".receiver.StaticBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.pha.three.face.ReceiverFlag"></action>
</intent-filter>
</receiver>
其中注意点 :
- 注册用receiver 。
- android:exported的值尽量为true 。如果为false,本app可能获取,但是其他app会获取不到
- android:name 这是区分广播的标识。就是 1中的 Static_Receiver_Name 值
3、发送广播
当前app发送广播 。目前这个是按钮点击触发,如果是系统广播,对应的操作就会触发。比如,连接网络,就可以处方网络广播。不需要按钮点击等操作
// 广播发送
private void StartStaticBroadcast() {
Intent intent=new Intent();
intent.setAction(ReceiverFlag.Static_Receiver_Name);
sendBroadcast(intent);
}
动态接收广播
1、新建广播接收类
这完全可以用静态的广播。练习中为了区分,特意新建一个广播。
对比可以看出来是一样:继承 BroadcastReceiver ,并重写onReceive
java/com/pha/three/receiver/TrendsBroadcastReceiver.java
package com.pha.three.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class TrendsBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = TrendsBroadcastReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "我已经接收信息TrendsBroadcastReceiver" );
}
}
2、动态注册接收广播
// 动态接收广播
private void RegisterBroadcast() {
TrendsBroadcastReceiver trendsBroadcastReceiver = new TrendsBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ReceiverFlag.Trends_Receiver_Name);
registerReceiver(trendsBroadcastReceiver,filter);
}
3、发送广播
当前app发送广播 。目前这个是按钮点击触发,如果是系统广播,对应的操作就会触发。比如,连接网络,就可以处方网络广播。不需要按钮点击等操作
// 广播发送
private void StartStaticBroadcast() {
Intent intent=new Intent();
intent.setAction(ReceiverFlag.Trends_Receiver_Name);
sendBroadcast(intent);
}
最终代码:java/com/pha/three/MainActivity2.java
package com.pha.three;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import com.pha.three.face.ReceiverFlag;
import com.pha.three.receiver.TrendsBroadcastReceiver;
public class MainActivity2 extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
findViewById(R.id.btn_main2_one).setOnClickListener(this);
findViewById(R.id.btn_main2_two).setOnClickListener(this);
RegisterBroadcast();
}
// 动态接收广播
private void RegisterBroadcast() {
TrendsBroadcastReceiver trendsBroadcastReceiver = new TrendsBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ReceiverFlag.Trends_Receiver_Name);
registerReceiver(trendsBroadcastReceiver,filter);
}
// 广播发送-对应 动态接收广播
private void StartTrendsBroadcast() {
Intent intent=new Intent();
intent.setAction(ReceiverFlag.Trends_Receiver_Name);
sendBroadcast(intent);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_main2_one:
StartStaticBroadcast();
break;
case R.id.btn_main2_two:
StartTrendsBroadcast();
break;
default:
break;
}
}
// 广播发送
private void StartStaticBroadcast() {
Intent intent=new Intent();
intent.setAction(ReceiverFlag.Static_Receiver_Name);
sendBroadcast(intent);
}
}
广播发送
其实上面的广播接收中包含了广播发送,不过是在同一个app中
下面说下跨app的发送
以静态接收为例
在广播接收的基础上,再新建一个项目SendBroadcast。
layout布局就不列举了,就是一个按钮
java/com/pha/sendbroadcast/MainActivity.java
package com.pha.sendbroadcast;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void SendBroadcast(View view) {
Intent intent = new Intent();
intent.setAction("com.pha.three.face.ReceiverFlag");
//intent.setClassName("com.pha.three","com.pha.three.receiver.StaticBroadcastReceiver");
sendBroadcast(intent);
}
}
注意事项:
广播接收的app中,AndroidManifest.xml注册组件的时候,android:exported一定要为true
如果还接收不到的话,发送广播是可以添加intent.setClassName(包名,类名)