Broadcast概念
广播Broadcast是Android的四大组件之一,是用来互相通信(传递信息)的一种机制。
- 组件间(应用内)通信
- 进程间 通信
广播Broadcast的组成部分
主要分为两大部分,一个是广播发送者(Activity)、另一个则是广播接收者(BroadcastReceiver)。它们之间也是使用Intent来发送广播。
基本使用方式
1. 广播发送
① 发送标准广播
配置Action的作用是标识广播可以被哪些接收器收到。简单的实现代码如下:
Intent intent = new Intent();
intent.setAction(ACTION_UPLOAD_RESULT);
发送标准广播的建议代码可以参考如下:
val intent = Intent("com.example.broadcasttest.MY_BROADCAST")
intent.setPackage(packageName)
sendBroadcast(intent)
其中MY_BROADCAST是我们的自定义广播名。
② 发送有序广播
可通过putExtra,传递额外的bundle信息。简单的实现代码如下:
intent.putExtra(KEY_RESULT,filePath);
//发送广播
sendBroadcast(intent);
发送有序广播的建议代码可以参考如下:
val intent = Intent("com.example.broadcasttest.MY_BROADCAST")
intent.setPackage(packageName)
sendOrderedBroadcast(intent, null)
2. 广播接收
① 接收系统广播
我们可以根据自己感兴趣的广播,自由地注册BroadcastReceiver,这样当有相应的广播发出时,相应的BroadcastReceiver就能够收到该广播,并可以在内部进行逻辑处理。
注册BroadcastReceiver的方式一般有以下两种:
- 动态注册(在代码中注册)
下述代码是监听到系统时间发生变化后进行相关逻辑操作的代码(这里是出现一条通知)。
class MainActivity : AppCompatActivity(){
lateinit var timeChangeReceiver: TimeChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intentFilter = IntentFilter()
intentFilter.addAction("android.intent.action.TIME_TICK")//添加接收系统时间的变化
timeChangeReceiver = TimeChangeReceiver()
//动态注册广播接收器
registerReceiver(timeChangeReceiver,intentFilter)
}
override fun onDestroy() {
super.onDestroy()
// 记得需要取消注册广播
unregisterReceiver(timeChangeReceiver)
}
// 广播接收类(监测到系统时间发生变化进行接收)
inner class TimeChangeReceiver : BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context,"监测到系统时间发生变化",Toast.LENGTH_SHORT).show();
//TODO("接收到系统时间发生变化后的具体执行操作")
}
}
}
- 静态注册(在AndroidManifest.xml中注册)
静态注册主要用于解决动态注册必须需要应用程序启动后才能监听到广播的弊端,其实现了当应用程序未启动时就接收广播的功能。
静态注册的使用方法类似于Activity中的“隐式跳转”,也是在清单文件AndroidManifest.xml中添加内容进行的操作,一个简单的示例如下述代码所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
在其中的<intent-filter>标签内添加需要监听的广播,上述的代码是监听了开机(BOOT_COMPLETED)这一系统广播。