BroadcastReceiver
作用:
监听 / 接收 应用 App
发出的广播消息,并 做出响应
应用场景:
Android
不同组件间的通信(含 :应用内 / 不同应用之间)- 多线程通信
- 与
Android
系统在特定情况下的通信
如:电话呼入时、网络可用时、耳机插入时
初步使用BroadcastReceiver:实现向BroadcastRecever发送消息,在控制台输出BroadcastReceiver接收到的消息
步骤一:
activity_main.xml布局:
步骤二:
创建一个BroadcastReceiver(自定义类继承BroadcastReceiver,重写onReceive方法),
package com.contentprovide.liuliu.brodcast_demo1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra("date");
System.out.println("===================接收到的消息是:"+s);
}
}
这一步系统会在AndroidManifest.xml文件中自动静态注册BroadcastReceiver
步骤三: Java代码向广播接收器传递信息
package com.contentprovide.liuliu.brodcast_demo1;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, MyReceiver.class);
intent.putExtra("date", "11111");
// 传送消息
sendBroadcast(intent);
}
});
}
}
实现效果:
动态注册和注销BroadcastReceiver
在Android Studio中一键创建BroadcastReceiver时系统会自动的静态注册,但是很多时候为了优化程序,在需要的时候动态注册,不需要时及时注销
步骤一:activity_main.xml布局文件:
步骤二:创建BroadcastRecever,声明一个对象用作广播接收器的类型
MyReceiver.java
package com.contentprovide.liuliu.brodcast_demo2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
//声明一个字符串变量储存当前广播接收器的路径,用作接收广播的类型
public static final String Path = "com.contentprovide.liuliu.brodcast_demo2";
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra("date");
System.out.println("===================接收到的消息是:"+s);
}
}
步骤三:使用Java代码动态注册和注销广播接收器
package com.contentprovide.liuliu.brodcast_demo2;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_send, btn_reg, btn_unreg;
Intent intent;
MyReceiver myReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_send = (Button) findViewById(R.id.btn_send);
btn_reg = (Button) findViewById(R.id.btn_reg);
btn_unreg = (Button) findViewById(R.id.btn_unreg);
btn_send.setOnClickListener(this);
btn_reg.setOnClickListener(this);
btn_unreg.setOnClickListener(this);
intent = new Intent(MyReceiver.Path);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_send:
intent.putExtra("date", "11111");
sendBroadcast(intent);
break;
case R.id.btn_reg:
//添加判断语句是为了防止重复注册和重复注销
if (myReceiver == null) {
myReceiver = new MyReceiver();
// 设置接收广播的类型,在实例化后面的括号中调用在MyReceiver.java中声明的字符串变量
IntentFilter intentFilter = new IntentFilter(myReceiver.Path);
// 注册广播接收器
registerReceiver(myReceiver, intentFilter);
}
break;
case R.id.btn_unreg:
if (myReceiver != null) {
// 注销广播接收器
unregisterReceiver(myReceiver);
myReceiver = null;
}
break;
}
}
}
实现效果:在点击注册播放器前点击传送消息,控制台没有消息输出。先点击注册播放器再点击发送消息,控制台有消息输出。点击注销播放器后再点击发送消息,控制台也没有消息输出
- Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播
- 每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:
系统操作 | action |
---|---|
监听网络变化 | android.net.conn.CONNECTIVITY_CHANGE |
关闭或打开飞行模式 | Intent.ACTION_AIRPLANE_MODE_CHANGED |
充电时或电量发生变化 | Intent.ACTION_BATTERY_CHANGED |
电池电量低 | Intent.ACTION_BATTERY_LOW |
电池电量充足(即从电量低变化到饱满时会发出广播 | Intent.ACTION_BATTERY_OKAY |
系统启动完成后(仅广播一次) | Intent.ACTION_BOOT_COMPLETED |
按下照相时的拍照按键(硬件按键)时 | Intent.ACTION_CAMERA_BUTTON |
屏幕锁屏 | Intent.ACTION_CLOSE_SYSTEM_DIALOGS |
设备当前设置被改变时(界面语言、设备方向等) | Intent.ACTION_CONFIGURATION_CHANGED |
插入耳机时 | Intent.ACTION_HEADSET_PLUG |
未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡) | Intent.ACTION_MEDIA_BAD_REMOVAL |
插入外部储存装置(如SD卡) | Intent.ACTION_MEDIA_CHECKING |
成功安装APK | Intent.ACTION_PACKAGE_ADDED |
成功删除APK | Intent.ACTION_PACKAGE_REMOVED |
重启设备 | Intent.ACTION_REBOOT |
屏幕被关闭 | Intent.ACTION_SCREEN_OFF |
屏幕被打开 | Intent.ACTION_SCREEN_ON |
关闭系统时 | Intent.ACTION_SHUTDOWN |
重启设备 | Intent.ACTION_REBOOT |
注:当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播
推荐相关博客:https://www.jianshu.com/p/ca3d87a4cdf3