栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 笔记 广播机制(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 笔记 广播机制(二)

广播机制

用BroadcastReceiver接收。分两种类型:

  1. 标准广播
    完全异步广播,接收者同步收到,无法阻拦,传播效率高。
  2. 有序广播
    同步广播,一次只能有一个接收者,优先级越高,越早接收,接收者可以阻断传播。
注册方法
  1. 动态注册在代码注册
  2. 静态注册在AndroidManifest.xml注册
动态注册

动态注册一定要取消注册,可以在onDestory()取消。
代码如下所示。

class MainActivity : AppCompatActivity()
{
	lateinit var timeChange: TimeChange
	override fun onCreate(savedInstanceState: Bundle?)
	{
		super.onCreate(savedInstanceState)

		timeChange = TimeChange()
		val intentFilter = IntentFilter().apply {
			// 监听的事件
			addAction("android.intent.action.TIME_TICK")
		}
		// 注册
		registerReceiver(timeChange, intentFilter)
	}

	override fun onDestroy()
	{
		super.onDestroy()
		// 取消注册
		unregisterReceiver(timeChange)
	}

	inner class TimeChange : BroadcastReceiver()
	{
		// 不支持线程,过长时间运行会报错
		override fun onReceive(p0: Context?, p1: Intent?)
		{
			Toast.makeText(this@MainActivity, "时间改变", Toast.LENGTH_SHORT).show()
		}
	}
}
静态注册

 动态注册只有在程序启动的时候才能接收,而在android 8.0以后,所有的隐式广播都不允许使用静态注册方式接收了。
 隐式广播:没有具体指发送给某程序的广播,大多数系统广播属于隐式广播。但譬如开机启动广播还是静态注册。

class MainActivity : AppCompatActivity()
{
	// 必须是静态
	class BootComplete : BroadcastReceiver()
	{
		override fun onReceive(context: Context?, p1: Intent?)
		{
			Toast.makeText(context, "开机", Toast.LENGTH_SHORT).show()
		}
	}
}

申请权限以及注册receiver



        
        
           ...
        
    
自定义广播
  1. 自定义接收器
  2. 在AndroidManifest添加receiver 标签,并补全。
  3. 写sendBroadcast
    这里定义发送广播为this.is.my.br
class MainActivity : AppCompatActivity()
{
	override fun onCreate(savedInstanceState: Bundle?)
	{
		super.onCreate(savedInstanceState)
		
		val button = Button(this)
		button.setOnClickListener {

			Intent("this.is.my.br").run {
				// 8.0之后,无法接收隐式广播,默认自定义都是隐式,
				// 所以要调用这个发送给指定应用程序,从而显式化
				setPackage(packageName)
				// 可以此法传输数据
				putExtra("text", "this is broadcast data")
				sendBroadcast(this)
			}
		}

		setContentView(button)
	}
	
	// 必须是静态
	class MyBroadcastReceiver : BroadcastReceiver()
	{
		override fun onReceive(context: Context?, pIntent: Intent?)
		{
			val res = pIntent?.getStringExtra("text") ?: "无数据"

			Toast.makeText(context, "My Broadcast Receiver :$res", Toast.LENGTH_SHORT).show()
		}
	}
}

receiver标签加在application里,指定MainActivity$MyBroadcastReceiver为接收者,并写入intent-filter的响应活动是this.is.my.br


            
                
            
        
发送有序广播

有序广播继承了标准广播的写法,改的如下:

  1. sendBroadcas() 改为 sendOrderedBroadcast(),如无必要,与权限有关的第二参数可填null
  2. 设定先后顺序:在AndroidManifest.xml的receiver标签下的intent-filter加入优先级
  3. 截断方法:abortBroadcast()

            
                
            
        
class MainActivity : AppCompatActivity()
{
	private fun sendMyBroadcast()
	{
		Intent("this.is.my.br").run {
			// 8.0之后,无法接收隐式广播,默认自定义都是隐式,
			// 所以要调用这个发送给指定应用程序,从而显式化
			setPackage(packageName)
			// 可以此法传输数据
			putExtra("text", "this is broadcast data")
	//				sendBroadcast(this)
			sendOrderedBroadcast(this, null)
		}
	}

	// 必须是静态
	class MyBroadcastReceiver : BroadcastReceiver()
	{
		override fun onReceive(context: Context?, pIntent: Intent?)
		{
			Toast.makeText(context, "My Ordered Broadcast Receiver ", Toast.LENGTH_SHORT).show()
			// 截断
			abortBroadcast()
		}
	}
}
牵制下线功能简述
  1. 在onResume()和onPasue()注册、取消,保证广播始终在顶层Activity
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006445.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号