Android四大组件

本文详细介绍了Android的四大组件之一——Activity,包括其生命周期、启动模式、任务栈管理、Fragment回退栈以及Service和BroadcastReceiver的使用。讨论了Activity在不同场景下的生命周期变化,Fragment的复用和适配器,Service的生命周期以及广播通信机制。同时,提到了IntentService、AIDL以及广播常驻通知栏的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity:

生命周期:

在这里插入图片描述

  • onCreate():创建Activity调用,用于Activity的初始化.
  • onStart():Activity在屏幕上对用户可见时调用,但还不可与用户交互(可见不可交互)
  • onRestart():在activity停止后,在再次启动之前被调用。(重新启动)
  • onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部,并接受用户输入。
  • onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
  • onStop():Activity被停止或者Activity变成不可见时调用(不可见不可交互)
  • onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候
除了正常的7个以外还有两个方法:
  • onSaveInstanceState(状态保存)
  • onRestoreInstanceState(数据恢复)
Activity在进行跳转或者Home键、灭屏、切换横竖屏时的生命周期

创建A:
A:oncreate ->onstart->onResume
A页面->B页面:
A:onpause->B:oncreate->onstart->onResume->A:onSaveInstanceState->onstrp
B页面返回A页面:
B:onpause->A:onRestart->onstart->onRestoreInstanceState->onResume
点击Home键:
当前可视的Activity:onPause->onSaveInstanceState->onstop
桌面返回应用:
原Acticity:onRestart->onstart->onresume
锁屏:
当前可视的Activity:onPause->onSaveInstanceState->onstop
解锁屏幕:
原Acticity:onRestart->onstart->onresume
横竖屏切换:(正常不做任何处理的情况:)
切换竖(竖)屏: activity:onpause->onSaveInstanceState->onstorp->ondestory->oncreate->onstart->onRestoreInstanceState->onresume
可以通过在Activity清单中配置:
android:configChanges="keyboardHidden|orientation"

<activity android:name=".MainActivity"
    **android:configChanges="keyboardHidden|orientation">**
</activity>

这样就可以避免切换横竖屏的时候Activity销毁再启动.

任务栈(启动默认):每一个启动模式的任务栈,多个启动的任务栈, 自定义任务栈 项目当中怎么用?

Activity任务栈

首先了解栈:
栈就是一个容器,可以比喻为一个箱子,我们可以向里面放入东西,假设塞的东西的底面积和箱子的底面积是相同的,那么这些东西就具备有从下往上一定的顺序,如果我们需要取出来东西的时候又不能直接拿到最下面的,只能从上向下的取出来里面的东西.
所以就引申出栈的特点:具有一定的次序先进后出(越先放进去的东西越后取出);
Activity任务栈
在Android的官方文档描述中我们可以知道,任务栈也是栈,具有栈的一切特点。
Acticity任务栈就是存放ctivity任务的栈,
是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序.
每一个启动模式的任务栈
启动一个Application的时候,系统会为它默认创建一个对应的Task,用来放置根Activity。默认启动Activity会放在同一个Task中,新启动的Activity会被压入启动它的那个Activity的栈中,并且显示它。当用户按下回退键时,这个Activity就会被弹出栈,按下Home键回到桌面,再启动另一个应用,这时候之前那个Task就被移到后台,成为后台任务栈,而刚启动的那个Task就被调到前台,成为前台任务栈,Android系统显示的就是前台任务栈中的Top实例Activity。

Activity启动模式

栈是一个先进后出的线性表,根据Activity在当前栈结构中的位置,来决定该Activity的状态。正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动它的Activity依然保留在任务栈中,处于停止状态,当用户按下返回键或者调用finish()方法时,系统会移除顶部Activity,让后面的Activity恢复活动状态。可以通过在AndroidManifest文件中的属性andorid:launchMode来设置或者通过Intent的flag来设置Activity的启动模式,下面就先介绍下Activity的几种启动模式:
standard
默认模式,

Fragment的回退栈

fragment回退栈应用于淘宝,京东等电商项目,如果你点击了分类,发现,购物车,我的,按钮,再按返回键的话,会先回到首页,然后再退出应用.这里应用的就是Fragment的回退栈功能.
fragment回退栈,它主要就是有几个重要方法
事物.add();再添加时给fragment设一个标记
fragmentManager.addToBackStack(String tag),将fragment添加到回退栈中,定义标记
fragmentManager.getBackStackEntryCount(),获取回退栈中fragment个数
fragmentManager.popBackStackImmediate(),回退到上一个fragment.

fragment复用:

复用的好处:
避免显示错乱
避免重复添加
避免多余的内存占用
优化界面启动速度
如何获取已经存在的fragment?
不推荐:获取全部的已添加到 FragmentManager 的FragmentManager.getFragments()
根据 TAG 查找 FragmentFragmentManager.findFragmentByTag(String tag)适合一个 ViewGroup 中只有多个 Fragment 的情况。不适合于ViewPager联用
根据 Id 查找 FragmentFragmentManager.findFragmentById(int id)适合一个 ViewGroup 中只有一个 Fragment 的情况。
【重点】根据 Key 查找 Fragment,这个适合与 ViewPager 配合
//获取fragment
FragmentManager.getFragment(Bundle bundle,String key)
//存入fragment对像
FragmentManager.putFragment(Bundle bundle, String key, Fragment fragment)

两种适配器:

FragmentPagerAdapter
他继承自PagerAdapter.该类的每一个生成的Fragment都保存在内存之中,因此适用于那些相对静态,数量较少的.
如果要处理有很多页,数据动态性较大,占内存较多的情况,使用FragmentStatePagerAdapter
getItem()
Fragment.setArguments() 这种只会在新建 Fragment 时执行一次的参数传递代码,可以放在这里。
这个方法在生成新的fragment对象时会调用一次,因此在这个fragment中的数据改变时,这个fragment对象已经生成,修改数据的那部分代码没有执行,所以调用适配器.notifyDataSetChanged() ,条目的数据也不会改变
instantiateItem()
判断生成的fragement是否存在,如果存在,就用旧的,并走attach(),如果不存在,就生成一个新的,并走add().
它会将所有生成的 Fragment 对象通过 FragmentManager 保存起来备用,在需要的时候通过 FragmentManager读取,不会调用getItem().
destroyItem()
fragment会调用deach()而不是remove(),资源不被释放.

FragmentStatePagerAdapter
这个适配器只保留当前页面,当页面离开视线后,就会被消除,并释放其资源,而在页面需要显示时,就会生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

getItem()
会通过此方法创建新的对象
instantiateItem()
除非碰到 FragmentManager 刚好从 SavedState 中恢复了对应的 Fragment 的情况外,该方法将会调用 getItem() 方法,生成新的 Fragment 对象,如果不使用就会释放其资源.
destroyItem()
fragment会调用remove(),并释放其资源

Fragment与activity的通信

Fragment复用,及两种适配器的区别

Service

Service和线程的区别
生命周期
IntentService
与组件通信
AIDL(进行间通信)

广播

广播的分类
  • 系统广播
  • 粘性广播
  • 有序无序广播
广播与Server和通知结合使用
广播怎么常驻通知栏?

手写网络框架:理解http网络请求的过程,会存在的问题记录下来,对比okhttp, 为啥要手写?

token session chooke https

即时通信:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值