辉夜的博客

繁花似锦,辉夜如昼

0%

安卓四大组件

Activity

activity的使用

  1. 在Android Menifest文件中注册
  2. 在xml文件中设定layout
  3. 在java文件中绑定activity

GridView + Adaptor, GridView + Adaptor, ViewPager + Adaptor

activity生命周期

  1. onCreate
    程序创建,进行文件的绑定
  2. onStart
    程序不可见,用户不可交互,进行一些
  3. onResume
    程序可见,用户可以交互
  4. onPause
    程序部分不可见,(比如被弹窗遮挡),在这里是最后一个比较靠谱的数据保存点(Android 5.0-)。
    之后也可以在onStop中进行数据保存
    如果之后恢复可见,会调用onResume
  5. onStop
    程序被完全遮挡,如果恢复,经由onRestart回到onStart
  6. onDestroy
    程序被销毁,注意,很多场景下可能不会走到这一步,而是在停止之后直接被系统回收

配置变化(字体改变,屏幕旋转,键盘显示隐藏…)时的生命周期:先杀死再重建,杀死时在onPause之前调用onSaveInstanceState,
恢复时在onStart之后调用onRestoreInstanceState

如果不希望重建activity,可以在android_menifest文件中配置,在配置改变时调用onConfigurationChange,而不销毁。

案例:接完电话之后,程序crush!

  • 解释:页面被回收导致本地变量被清空

  • 解决:添加判空逻辑避免空指针

    • 利用两个InstanceState保存和恢复现场!

activity启动模式

对于每个activity,都可以在android:launchMode中配置启动模式来达到消除重复activity的效果

  1. standard(默认)
    每次启动页面都会在页面栈中添加一个新实例
  2. singleTop
    不允许栈顶有多个相同实例,试图创建新示例时会回调onNewInstance,然后无事发生
  3. singleTask
    不允许栈内有多个实例,如果试图创建新示例,将弹出页面之上的所有页面,然后回调onNewInstance
  4. singleInstance
    全局只能有一个实例,应用较少(银行登陆界面,通讯录黄页)

应用:返回首页的小按钮

  • 实现:将主页activity设置为singleTask

Fragment

安卓设计fragment的初衷是为了解决页面碎片化的问题,不过平时开发中fragment经常用于提高速度(activity之间交互需要进行IPC),
以及进行组件的分离(在屏幕的各个区域用不同的fragment承载功能)

基本用法

  1. 创建布局文件
  2. 在java中加载布局文件
  3. 在activity中加载fragment
    3.1 静态绑定-在布局文件中绑定
    3.2 通过FragmentManager加载

一般使用androidx.fragment,而不是android.app.fragment,以确保版本兼容

生命周期

  1. onAttach
    使用activity资源时可以在此进行获取
  2. onCreateView
    常用于初始化
  3. onResume
    运行状态
  4. onDestroyView
    资源回收

此外也可以通过FragmentTranscation.maxLifeCycle设置可到达的最远生命周期

与activity交互

组件获取

  • getActivity.findViewById(R.id.xx)
  • getFragmentManager.findFragmentById()

数据传递

  1. setArguments(Bundle bundle)
  2. 方法调用
  3. viewmodel,handler,broadcast

service

基本用法

  1. android_menifest注冊
  2. java中实现类
  3. 加载:需要交互用bindService,不需要交互用startService

生命周期

start, bind, destroy
//TODO

通信方式

  1. 定义Binder子类,实现getService方法,返回Service对象
  2. 实现Service类onBind方法,返回Binder对象
  3. 实例化ServiceConnection对象
    //TODO

broadcast

静态广播:使用receiver,在java中实现BroadcastReceiver,用onRecieve接收,用Context.sendBroadcast发送
动态广播:

常用广播:网络/电量变化,屏幕点亮/熄灭,安装卸载升级软件