一、注册广播一般两种形式:
- 在代码中注册(动态注册)
- 在AndroidManifest中注册(静态注册)
优缺点:
- 动态注册阔以自由控制注册和注销,灵活性强,但必须在程序启动之后才能接收到广播,静态广播可以在程序未启动的情况下收到广播
- 静态注册的广播接收器没办法在onReceive方法里面弹出对话框这样的UI控件
注册:
静态广播都是在<application>中的<receive>中注册的
例如:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
二、标准广播发出后,接收不到的问题解决:
《第一行代码》上用的方法是
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
当发送后,接收不到,查了一下,有两个方法:
- 将静态注册改为动态注册
- 以下方法:
//包名:com.example.broadcasttest
//接收的类名:com.example.broadcasttest.MyBroadcastReceiver
//注册名:com.example.broadcasttest.MY_BROADCAST
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName("com.example.broadcasttest",
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
}
});
三、有序广播:
不同:1、发送方式
//标准广播
sendBroadcast(intent);
//有序广播
//第二个参数是一个与权限相关的字符串
sendOrderedBroadcast(intent,null);
2、可在AndroidManifest中设置优先级
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
3、在接受处,可阻断通知的继续传递
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();
//阻断
abortBroadcast();
}
四、1.最终代码:
MainActivity
package com.example.broadcasttest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
/**
* 权限:
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
*/
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName("com.example.broadcasttest",
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
//广播接收器想要监听什么广播,就在addAction中添加相应的action
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
//动态注册
//这样NetworkChangeReceiver就能接受到所有android.net.conn.CONNECTIVITY_CHANGE的广播了
registerReceiver(networkChangeReceiver,intentFilter);
}
@Override
protected void onDestroy(){
super.onDestroy();
//动态注册的广播接收器一定要取消注册
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
//每当网络状态发生变化时,onReceive就会得到执行
public void onReceive(Context context,Intent intent){
//getSystemService此为系统服务类,专门用于管理网络连接
ConnectivityManager connectivityManager =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
//isAvailable()判断当前是否有网络
if (networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context,"network is available",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context,"network is unavailable",Toast.LENGTH_LONG).show();
}
}
}
}
2.MyBroadcastReceive:
package com.example.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();
}
}
【注】:通知需要到在AndroidManifest中申明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />







网友评论