@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 集合:
mReceivers
和 mActions
,当然还有一个 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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-ePrttu3f-1711024792181)]