Activity
activity的使用
- 在Android Menifest文件中注册
- 在xml文件中设定layout
- 在java文件中绑定activity
GridView + Adaptor, GridView + Adaptor, ViewPager + Adaptor
activity生命周期
- onCreate
程序创建,进行文件的绑定 - onStart
程序不可见,用户不可交互,进行一些 - onResume
程序可见,用户可以交互 - onPause
程序部分不可见,(比如被弹窗遮挡),在这里是最后一个比较靠谱的数据保存点(Android 5.0-)。
之后也可以在onStop中进行数据保存
如果之后恢复可见,会调用onResume - onStop
程序被完全遮挡,如果恢复,经由onRestart回到onStart - onDestroy
程序被销毁,注意,很多场景下可能不会走到这一步,而是在停止之后直接被系统回收
配置变化(字体改变,屏幕旋转,键盘显示隐藏…)时的生命周期:先杀死再重建,杀死时在onPause之前调用onSaveInstanceState,
恢复时在onStart之后调用onRestoreInstanceState
如果不希望重建activity,可以在android_menifest文件中配置,在配置改变时调用onConfigurationChange,而不销毁。
案例:接完电话之后,程序crush!
解释:页面被回收导致本地变量被清空
解决:添加判空逻辑避免空指针
- 利用两个InstanceState保存和恢复现场!
activity启动模式
对于每个activity,都可以在android:launchMode中配置启动模式来达到消除重复activity的效果
- standard(默认)
每次启动页面都会在页面栈中添加一个新实例 - singleTop
不允许栈顶有多个相同实例,试图创建新示例时会回调onNewInstance,然后无事发生 - singleTask
不允许栈内有多个实例,如果试图创建新示例,将弹出页面之上的所有页面,然后回调onNewInstance - singleInstance
全局只能有一个实例,应用较少(银行登陆界面,通讯录黄页)
应用:返回首页的小按钮
- 实现:将主页activity设置为singleTask
Fragment
安卓设计fragment的初衷是为了解决页面碎片化的问题,不过平时开发中fragment经常用于提高速度(activity之间交互需要进行IPC),
以及进行组件的分离(在屏幕的各个区域用不同的fragment承载功能)
基本用法
- 创建布局文件
- 在java中加载布局文件
- 在activity中加载fragment
3.1 静态绑定-在布局文件中绑定
3.2 通过FragmentManager加载
一般使用androidx.fragment,而不是android.app.fragment,以确保版本兼容
生命周期
- onAttach
使用activity资源时可以在此进行获取 - onCreateView
常用于初始化 - onResume
运行状态 - onDestroyView
资源回收
此外也可以通过FragmentTranscation.maxLifeCycle设置可到达的最远生命周期
与activity交互
组件获取
getActivity.findViewById(R.id.xx)
- getFragmentManager.findFragmentById()
数据传递
- setArguments(Bundle bundle)
- 方法调用
- viewmodel,handler,broadcast
service
基本用法
- android_menifest注冊
- java中实现类
- 加载:需要交互用bindService,不需要交互用startService
生命周期
start, bind, destroy
//TODO
通信方式
- 定义Binder子类,实现getService方法,返回Service对象
- 实现Service类onBind方法,返回Binder对象
- 实例化ServiceConnection对象
//TODO
broadcast
静态广播:使用receiver,在java中实现BroadcastReceiver,用onRecieve接收,用Context.sendBroadcast发送
动态广播:
常用广播:网络/电量变化,屏幕点亮/熄灭,安装卸载升级软件