【客户端学习】Kotlin Android 学习笔记

Kotlin Android 学习笔记

Android 应用的基本组件

1. Activity 和 View

Activity 是 Android 应用中负责与用户交互的组件

View 组件是所有 UI 控件、容器控件的基类

2. Service

Service 通常位于后台运行,它一般不需要与用户交互,因此 Service 组件没有图形用户界面

3. BroadcastReceiver

类似于事件编程中的监听器,监听 Android 应用中的其他组件,相当于一个全局的事件监听器

4. ContentProvider

用于 Android 应用间进行实时的数据交换,通常结合 ContentResolver 来使用

5. Intent 和 IntentFilter

实现不同组件之间通信,可以启动 Activity 和 Service,也可以触发 BroadcastReceiver

视图组件与容器组件

Android 应用的绝大部分 UI 组件都放在 android.widget 和 android.view 包及它们的子包中,所有 UI 组件都继承了 View 类

View 类重要的子类 ViewGroup 通常是作为其他组件的容器使用

布局管理器

**1. 线性布局 **

可以控制横向排列或纵向排列,不会换行显示

**2. 表格布局 **

3. 帧布局

Android 的 View 和 UI 组件不是线程安全的,所以 Android 不允许开发者启动线程访问用户界面的 UI 组件

如果直接使用对象表达式(相当于 Java 的匿名内部类)定义 Handler 类的实例,如果该 Handler 直接使用主线程的 Looper 或 MessageQueue,就可能导致内存泄漏。因此,为 Handler 派生一个子类,并让该子类实例持有它所在 Activity 的弱引用(WeakReference)可以更好地避免内存泄漏

4. 相对布局

5. 网格布局

6. 绝对布局 ( deprecated )

在 Android 中一般支持如下常用的布局单位:

  • px: 每个 px 对应屏幕上一个点
  • dp: 基于屏幕密度的抽象单位。在每英寸 160 点的显示器上,1dp = 1px。但随着屏幕密度的改变,dp 与 px 的换算会发生改变,主要用于控件的固定尺寸
  • sp: 主要处理字体的大小,可以根据用户字体大小首选项进行缩放
  • in: 标准长度单位
  • mm: 标准长度单位
  • pt: 标准长度单位,1/72 英寸

7. Android 8 的约束布局

Activity 状态

1. 运行状态:Activity 处于栈顶

2. 暂停状态:Activity 不再处于栈顶,但依然可见(不是每个 Activity 都会占满整个屏幕,比如对话框形式的 Activity 只会占用屏幕中间的部分区域)

3. 停止状态:不处于栈顶,完全不可见

4. 销毁状态:从返回栈中移除

Activity 生存期

onCreate():第一次被创建,应该在此完成初始化操作,如加载布局、绑定事件

onStart():由不可见变为可见

onResume():准备好和用户进行交互。此时它一定位于栈顶,并且处于运行状态

onPause():准备去启动或者恢复另一个 Activity,一般用来把一些消耗 CPU 的资源释放掉,以及保存一些关键数据。这个方法的执行速度一定要快

onStop():在 Activity 完全不可见时调用。和onPause()的主要区别在于,如果启动的新 Activity 是一个对话框式的 Activity,那么onPause()方法会执行,而onStop()方法不会执行

onDestroy():在 Activity 被销毁之前调用,之后 Activity 的状态变为销毁状态

onRestart():在 Activity 由停止状态变为运行状态之前调用

可以将 Activity 分为以下 3 种生存期:

完整生存期onCreate()初始化 --> onDestroy()释放内存

可见生存期onStart() --> onStop()

前台生存期onResume() --> onPause()

Activity 被回收了怎么办

使用onSaveInstanceState()方法保存临时数据,在onCreate()方法中取出数据

ListView

  • android.R.layout.simple_list_item_1是一个 Android 内置的布局文件,里面只有一个 TextView,可用于简单地显示一段文字
  • LayoutInflatorinflate()方法接受 3 个参数,第三个参数指定成false,表示只让我们在父布局中声明的layout属性生效,但不会为这个 View 添加父布局。因为一旦 View 有了父布局之后,它就不能再添加到 ListView 中了
  • kotlin-android-extensions 插件在 ListView 的适配器中是无法工作的,它的主要应用场景是在 Activity 以及 Fragment 当中

RecyclerView

  • onCreateViewHolder():用于创建 ViewHolder 实例(加载 item 布局)
  • onBindViewHolder():对 RecyclerView 子项的数据进行赋值
  • getItemCount():返回数据源长度

TextView

android:ellipsize:用于设定当文本内容超出控件宽度时文本的缩略方式,指定成end表示在尾部进行省略

Fragment

动态添加 Fragment 主要分为 5 步:

  1. 创建待添加 Fragment 的实例
  2. 获取 FragmentManager,在 Activity 中可以直接调用getSupportFragmentManager()方法获取
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器内添加或替换 Fragment,一般使用replace()方法实现,需要传入容器的 id 和待添加的 Fragment 实例
  5. 提交事务,调用commit()方法完成

调用 FragmentManager 的findFragmentById()方法,可以在 Activity 中得到相应 Fragment 的实例,然后就可以轻松调用 Fragment 中的方法了。同时,kotlin-android-extensions 也提供了简便方法

在每个 Fragment 中都可以通过调用getActivity()方法来得到和当前 Fragment 关联的 Activity 实例

附加的回调方法:

onAttach():当 Fragment 和 Activity 建立关联时调用

onCreateView():为 Fragment 创建视图(加载布局)时调用

onActivityCreated():确保与 Fragment 相关联的 Activity 已经创建完毕时调用

onDestroyView():当与 Fragment 关联的视图被移除时调用

onDetach():当 Fragment 和 Activity 解除关联时调用

广播机制

  • 标准广播:完全异步执行的广播,不可被截断
  • 有序广播:同步执行的广播,可被截断

静态注册的广播:可以用来实现开机启动等功能,Android 8.0 起不能监听隐式广播(指没有指定发送给哪个应用程序的广播)

注意:不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为 BroadcastReceiver 中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会出现错误

Kotlin 相关语法

internal:用于限制跨 module 方法调用的关键字

if语句: Kotlin 中的 if 语句是可以有返回值的,返回值就是 if 语句中每个条件最后一行代码的返回值

创建区间..用于创建闭区间,until用于创建左闭右开的区间


如果一个 Java 方法的参数列表中不存在一个以上 Java 单抽象方法接口参数,我们还可以将接口名进行省略,例子如下:

省略前

Thread(Runnable {
  	println("Thread is running")
}).start()

省略后

Thread({
  	println("Thread is running")
}).start()

lateinit:延迟初始化,可结合!::adapter.isInitialized来判断变量是否已经初始化

sealed class:密封类,使用后 Kotlin 编译器会自动检查该密封类有哪些子类,并强制要求将每一个子类所对应的条件全部处理

你可能感兴趣的:(【客户端学习】Kotlin Android 学习笔记)