• Kotlin 开发Android app(十五):使用Broadcast收发广播


    在上一章中,有个问题可能大家都没有注意,Acitivity 在使用startActivityForResult后,可以给另一个的Acitivity 或者Fragment 进行数据参数的传递,可以回去也可以回来。但如果中间要进行数据的交换,使用startActivityForResult 是不能够做到的。

    在这里插入图片描述

    最常见的一种情况是Acitivity 中启动 碎片Fragmen 的时候,可以通过参数的方式进行传递,但碎片Fragmen要传回来数据,就没那么容易了。

    Android 中,可以使用 Android 中四大组件之一的Broadcast,我们叫他广播。这一节的例子就是展示怎么在碎片FragmenAcitivity 中的通讯问题,我们会建立一个AcitivityFragmen ,在Fragmen 中发送广播,Acitivity中接受,这样就可以达到双向交流的目的。

    创建Fragmen 碎片

    建立起Fragmen 碎片,在Fragmen 中发送广播给Acitivity ,让Acitivity 处理相应的广播命令。

            fun newInstance(position:Int,image_id:Int,desc:String):BroadcastFragment {
    
                val bundle = Bundle()
                bundle.putInt("position",position)
                bundle.putInt("image_id",image_id)
                bundle.putString("desc",desc)
                val fragment = BroadcastFragment()
                fragment.arguments = bundle
                return fragment
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在建立Fragmen 的时候,Acitivity通过参数的形式,把数据传递给Fragmen ,这里就有了一次数据参数的传递过程。

    主界面中添加ViewPager

    我们建立ViewPager 的目的,是这ViewPager 中添加 Fragmen,来模拟 FragmenAcitivity 之间的通信问题。

        <androidx.viewpager.widget.ViewPager
            android:id = "@+id/vp_content"
            android:layout_width="match_parent"
            android:layout_height="550dp">
    
            <androidx.viewpager.widget.PagerTabStrip
                android:id = "@+id/pts_tab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
    
        androidx.viewpager.widget.ViewPager>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    建立起适配器,来加载Fragmen 碎片。

    class BroadcastPagerAdapter(fm:FragmentManager,private val goodsList: MutableList<GoodsInfo>):FragmentStatePagerAdapter(fm) {
        override fun getCount(): Int {
            return goodsList.size
        }
    
        override fun getItem(position: Int): Fragment {
            return BroadcastFragment.newInstance(position,goodsList[position].pic,goodsList[position].desc)
        }
    
        override fun getPageTitle(position: Int): CharSequence? {
            return goodsList[position].name
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在主界面中,加载适配器。

            pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP,20f)
            vp_content.adapter = BroadcastPagerAdapter(supportFragmentManager,GoodsInfo.defaultList)
            vp_content.currentItem = 0
    
    • 1
    • 2
    • 3

    到这里,界面该有的控件就建立起来。

    在这里插入图片描述

    创建广播

    发送广播和传递数据都是用Intent,先建立起BroadcastReceiver

        private var bgChangeReceiver:BgChangeReceiver? = null
    
        private inner class BgChangeReceiver:BroadcastReceiver(){
            override fun onReceive(p0: Context?, p1: Intent?) {
    
            }
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注册广播,

        override fun onStart() {
            super.onStart()
            bgChangeReceiver = BgChangeReceiver()
            val filter = IntentFilter(BroadcastFragment.EVENT)
            activity?.registerReceiver(bgChangeReceiver,filter)
        }
    
        override fun onStop() {
    
            activity?.unregisterReceiver(bgChangeReceiver)
            super.onStop()
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    新建一个按钮,来发送广播,

            btn_cast.setOnClickListener {
    
                val intent = Intent(BroadcastFragment.EVENT)
                intent.putExtra("color",1)
                activity?.sendBroadcast(intent)
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    小结

    Android中四大 组件之一的 Broadcast 这里也简单接受了下,如果之前有接触过windows编程的话,你会接触过sendmessage的函数,其实他就是一种广播,跟Android一样没有什么两样,都是为了组件和组件,界面和界面直接的沟通。

  • 相关阅读:
    [ue5]建模场景学习笔记(1)——混合材质
    如何使用Stable Diffusion生成艺术二维码?
    HRNet人体关键点检测
    基于DDR3的串口传图帧缓存系统设计实现
    6160. 和有限的最长子序列
    Subset Selection
    人工智能学习:ResNet神经网络(8)
    设置linux的时间
    mac中安装Homebrew
    2022飞天技术峰会:硬之城如何基于 SAE 打造数智化电子工业互联网平台
  • 原文地址:https://blog.csdn.net/weixin_40425640/article/details/127993563