安卓开发_广播机制_接收系统广播
动态注册监听时间变化
class MainActivity_Time : AppCompatActivity() {
lateinit var timeChangeReceiver: TimeChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_time)
val intentFilter = IntentFilter()
intentFilter.addAction("android.intent.action.TIME_TICK")
timeChangeReceiver = TimeChangeReceiver()
registerReceiver(timeChangeReceiver, intentFilter)
}
override fun onDestroy() {
super.onDestroy()
// 动态注册的BroadcastReceiver要取消注册
unregisterReceiver(timeChangeReceiver)
}
inner class TimeChangeReceiver: BroadcastReceiver(){
override fun onReceive(context: Context, intent: Intent){
Toast.makeText(context, "Time has changed", Toast.LENGTH_SHORT).show()
// Log.d("test", "Time")
}
}
}
静态注册实现开机启动
- Exported属性表示是否允许这个BroadcastReceiver接收本程序以外的广播
- Enabled属性表示是否启用这个BroadcastReceiver
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!--权限声明-->
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
...
<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>
BootCompleteReceiver:
class BootCompleteReceiver : BroadcastReceiver() {
// onReceive()中不要有耗时操作, 因为BroadcastReceiver不允许开启线程,->
// ->当onReceive()耗时较久而没有结果, 程序就会出现错误
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show()
}
}