纸上得来终觉浅,绝知此事要躬行。Broadcast和Fragment详解

@Override
protected void onCreate(Bundle savedInstanceState){
super.Oncreata(savedInstanceState);
setContentView(R.layout.activity_main);

intentFilter = new IntentFilter();
intentFilter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);
networkChangeReceiver = new NetWorkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);//注册广播接收器
}

@Overrid
protected void onDestroy() {
unregisterReceiver(networkChangeReceiver);//一定要记得取消广播接收器的注册
super.onDestroy();

}

class NetworkChangeReceiver extends BroadcastReceiver{//广播接收器类
@Override
public void onReceiver(Context context,Intent intent){
//这里需要权限,需要在 AndroidManifest.xml 中进行网络访问权限申请:
//
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isAvailable()) {

//有网
Toast.makeText(context, “network is available”,Toast.LENGTH_SHORT).show();
} else {
//无网
Toast.makeText(context, “network is unavailable”,
Toast.LENGTH_SHORT).show();
}
}
}
}

动态注册广播接收器的优点以及缺点: 动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在 onCreate()方法中的。那么有没有广播能在程序未启动的情况下就能接收到广播呢?静态注册的广播接收器就可以做到。

3.3 那些系统发送的广播有哪些?
  • 监听网络变化 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
4.源码角度分析广播机制
4.1 系统广播的源码角度分析

a. 自定义广播接收者 BroadcastReceiver,并且重写 onReceiver()方法。
b. 通过 Binder 机制向 AMS(Activity Manager Service)进行注册。
c. 广播发送者通过 Binder 机制向 AMS 发送广播。
d. AMS 查找符合条件(IntentFilter/Permission 等)的 BroadcastReceiver,将广播发送到相应的 BroadcastReceiver(一般情况下是 Activity)的消息队列中。
e. 消息循环执行拿到此广播,回调 BroadcastReceiver 中的 onReceiver()方法。

4.2 本地广播的源码角度分析

相比于系统广播而言,本地广播更加安全,更加高效,以下是本地广播的特点以及内部的实现机制:

特点:
a. 使用它发送的广播将只在自身 app 内传播,因此你不必担心泄漏隐私的数据。
b. 其他 app 无法对你的 app 发送该广播,因此你的 app 根本不可能收到非自身 app 发
送的该广播,因此你不必担心有安全漏洞可以利用。
c. 比系统广播更加高效。

内部实现机制:
a. LocalBroadcast 高效的原因:因为它内部是通过 Handler 实现的,它的 sendBroadcast()方法含义并非和系统的 sendBroadcast()一样,它的 sendBroadcast()方法其实就是通过Handler 发送了一个 Message 而已。
b. LocalBroadcast 安全的原因:既然它是通过 Handler 实现广播发送的,那么相比系统广播通过 Binder 机制实现那肯定更加高效,同时使用 Handler 来实现,别的 app 无法向我们应用发送该广播,而我们 app 内部发送的广播也不会离开我们的 app。

LocalBroadcast 内部协作主要是靠两个 Map 集合:
mReceiversmActions,当然还有一个 List 集合 mPendingBroadcasts,这个主要存储待接收的广播对象。

二.Android 部分 Fragment 篇
1.Fragment 为什么会被称为第五大组件?

Android 中的 4 大组件为:Activity,Broadcast,Service,ContentProvider,那么为什么Fragment 可以称之为第 5 大组件呢?你可以这么回答:
因为 Fragment 有生命周期,使用频率不输于 4 大组件,可灵活加载到 Activity 中。然后谈论谈论 Fragment 如何加载到 Activity 中

1.1 Fragment 加载到 Activity 的 的 2 种方式

Fragment 加载到 Activity 的方式分为静态加载和动态加载,下面我们看看这两种加载方式:
静态加载: 直接在 Activity 布局文件中指定 Fragment。使用指定属性 name 即可,代码如下所示:

动态加载: 动态加载需要使用到 FragmentManager,这种动态加载的方式在开发中是非常常见的,示例代码如下:

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginT
ransaction();
//将 FragmentA 从容器中移除掉,减少内存的消耗
fragmentTransaction.remove(fragmentA);
fragmentTransaction.add(R.id.fragment_layout,new.FragmentB());

最后

本文在开源项目GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

目前已经更新的部分资料,需要的自己取:



自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-ePrttu3f-1711024792181)]

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值