项目结构:

Android Dev

参考

前言

第一行代码 Android Studio 4.1.1

开始时间 2020/11/29

总述

Android 期末,之前只是简单修改了 booksource 里的源码,这次期末结课有时间了,打算手动敲一遍书中的代码。要求完全尽量理解里面的代码,有问题的做个记录,后面解决。进度不能耽误。安排 4~5 天的时间完成。

时间安排

  • 2020/11/29

    第 1 、2、3 章

  • 2020/11/30

    第 4、5 章

  • 2020/12/1

    第 6、7 章

  • 2020/12/2

    第 9、10 章

  • 2020/12/3

    第 11、12 章

  • 2020/12/4(可选)

    第 13、14、15章

实际

  • 2020/11/29

    第 1 、2 章

  • 2020/11/30

    第 2 章

  • 2020/12/1

    第 2、3章

  • 2020/12/2

    第 3 章

    第 4 章 刚开始

  • 2020/12/3

    第 4 章

  • 2020/12/4

    第 5 章

  • 2020/12/5

    第 6 7章

  • 2020/12/6

    第 8 9 章

问题

  • Java 语言
    • Array IO 不会
    • 面向对象特征不熟悉
    • 变量作用域、变量命名不规范,容易重复
  • 代码编写
    • 逻辑混乱,需要先想好逻辑再写代码。
  • Android
    • UI 定位不会

代码修改

  • booksource 里用的 support 包现在基本改为了 androidx 目录下的

第一章 HelloWorld

  • 日志打印

    在 onCreate 方法前

    输入 logt 然后 Tab 键,自动生成 TAG 常量,为当前活动名

  • 自定义过滤器

第二章 活动

  • 活动没在 Manifest 中注册会闪退。

  • 在 res 下可以新建 menu 目录,再添加 menu.xml

  • findViewById 需要在 layout 文件加载后再使用,否则 NULL Pointer 闪退

  • 在 AndroidManifest 中,添加多个 category 属性时,不能注释掉默认的

  • 活动间传递信息用

    image-20201130170142247

    有很多方法重载。

    下面是从活动2 获得相应的数据,指定类型的。

    image-20201130170415088

  • startActivityForResult

    注意在 onActivityResult 方法中

    第一种错误写法

    image-20201130173407717

    正确写法

    image-20201130173855011

    此方法可以用于某活动调用 登录活动,登录活动看是否登录成功;成功后怎么处理,失败后怎么处理看 onActivityResult 方法(不知道这样是不是复杂了?应该是这样的,MainActivity 用于流程控制。)

    若用户按返回键返回上一个程序,没有数据返回,在 被调用活动中重写 onBackPressed 方法 处理这种返回事件,可以返回数据给主调活动。

    所以说:主调活动中 onActivityResult 方法是在被调活动结束后调用,不管内部是怎么结束的(感觉说了一堆废话)。

  • 活动生命周期

    img

    • DialogActivity类需要继承自 Activity 而不是 AppCompatActivity

      • 普通活动(是一个全屏活动,会使得 MainActivity 变得不可见)

        进入 MainActivity

        1. onCreate
        2. onStart
        3. onResume

        进入 NormalActivity

        1. onPause
        2. onStop

        返回 MainActivity

        1. onRestart
        2. onStart
        3. onResume

        退出主活动

        1. onStop
        2. onDestroy
      • DialogActivity(MainActivity 可见)

        进入 MainActivity

        1. onCreate
        2. onStart
        3. onResume

        进入 NormalActivity

        1. onPause

        返回 MainActivity

        1. onResume

        退出主活动

        1. onStop
        2. onDestroy
      • 对比

        DialogActivity运行时,MainActivity 始终可见,相对 NormalActivity 来说

        没有 onStop onRestart onStart 这几个历程。

  • onSaveInstanceState()

    若 A 启动活动 B,此时内存不足,活动 A 被销毁了,从 B 中返回 A 活动,会调用 A 的 onCreate 方法,

    最开始 A 中的临时数据都没了。这种情况需要用 onSaveInstanceState方法,此方法在活动被销毁前一定被执行,用于保存临时数据。

    不过不好调试这个。

  • 启动模式

    • standard
    • singleTop
    • singleTask
    • singleInstance

活动的最佳实践

待补充

知晓当前是哪一个活动
随时随地退出程序
启动活动的最佳写法

控件声明以及活动管理的方法

此方法来自 bilibili up 主,待补充。

第三章 UI

问题

  • 写出的页面屏幕适应性不好
  • ListView 和 RecycleView 看这书第一遍的时候没学会

前言

UI 属性很多,用的时候查文档。

控件

TextView

  • 字体大小用 sp 为单位

Button

监听事件

  • 匿名内部类
  • 当前活动实现 View.OnClickListener 的 onClick 方法

EditText


获取 EditText 中的内容

ImageView

Java 代码修改图片源

ProgressBar

  • 控件的共同属性 visibility

AlertDialog

Layout

LinearLayout

  • Layout 内控件的对齐方式

  • android:layout_gravity 和 android:gravity 的区别 - 蝈蝈俊 - 博客园

  • Android线性布局重要属性 - 知乎

    • Android中的gravity属性有两种形式:layout_gravity和gravity,这两种有什么区别呢?

      从字面意思上就可以大概理解

      第一个layout_gravity控制控件在父布局中的位置(和margin比较类似),

      gravity可以控制控件中内容的显示位置(和padding比较类似)。

      • 我之前认为的 layout_gravity 中的父布局是:假如现在是在一个 ImageView 中,父布局我会认为是 LinearLayout ,这个理解是错误的。正确理解的父布局是类似于 css 中的盒子模型,则 layout_gravity 和 margin 类似

RelativeLayout

layout_*:是控件或者布局?的属性,相对于父布局或者 指定id的控件(仅RelativeLayout) 的位置,对 LinearLayout 和 RelativeLayout 都适用。

image-20201201170607952

考虑多使用 layout_* 来定位,用 margin 屏幕适应性没那么好?

自定义布局

image-20201201175403184

ListView

定制 ListView

构成

  • 实体类 Fruit

    存放 Fruit 信息,等于 DAO 设计模式里的 vo,用在 FruitAdapter 中的泛型。

  • ListView 子项布局文件

  • FruitAdapter

    继承自 ArrayAdapter,重写 构造方法 和 getView 方法

    getView 这部分代码没懂。

  • 将自定义的 FruitAdapter 添加到 ListView 中。

ListView 性能优化
  • 重用 convertView
  • 新建内部类缓存控件
ListView Item 点击事件

RecylcerView

ListView 中的性能优化代码迁移到了 Adapter 类中,布局和 vo 类没变。

横向滚动和瀑布流布局
  • 修改 layout.xml 文件(我的代码里是新建的 布局文件,修改 FruitAdapter 中传入的布局为新建的布局文件)
  • Java 代码设置 layoutManager 相关参数
点击事件

需要自己在 Adapter 类中定义控件的点击事件

第四章 探究碎片

  • 开始不太明白 fragment 的意义
    • 在于可以替换布局?适配安卓平板?

动态加载布局的技巧

使用限定符

使用最小宽度限定符

P159

碎片实践

第五章 广播机制

广播执行时间很短,执行时间超过 10s 会显示应用无响应,onReceive 方法中不能做太复杂的逻辑

动态注册广播接收器

Java 代码注册

检测网络状态

静态注册广播接收器

AndroidManifest.xml 里注册

开机自启

发送标准广播

5.3.1 中的发送标准广播发现问题

发送有序广播

第六章 数据存储

文件存储

SharedPreference

P 204

kv键值对存储在 xml 文件中

数据库

第七章 内容提供器

第八章 运用手机多媒体

第九章 网络

WebView

OkHttp

解析 XML

解析 JSON

最佳实践

这个最佳实践写了回调方法,让我耳目一新,以前从没这样的尝试。

对平常使用的那些操作更熟悉了。需要好好理解下。

  • HttpCallbackListener

  • HttpUtil

  • 调用 HttpUtil.sendHttpRequest方法

  • 定义

    • 定义 Interface:HttpCallbackListener

    • 此 Interface:HttpCallbackListener 作为 sendHttpRequest 的第二个参数

      sendHttpRequest 方法中网络请求失败调用 Interface :HttpCallbackListener 的 onError 方法,成功调用 onFinish 方法。

  • 调用 HttpUtil.sendHttpRequest 方法

    需要实现接口 HttpCallbackListener 的方法

  • 注意

    • UI 只能在主线程操作 或者实现 runOnUiThread(() -> {} 接口,在子线程中调用 Toast 等会出错。

第十章 服务

  • 服务适合执行不与用户交互且需要长期运行的任务。
  • 不依赖于界面
  • 依赖于应用程序,应用程序关闭,服务也会被关闭
  • 服务运行在主线程,需要自己在服务内部创建子线程

多线程编程

  • 继承 Thread 类 实现 run 方法 start 方法开启线程
  • 实现 Runnable 接口

子线程更新 UI

  • Handler
  • AsyncTask

前台服务

IntentService

服务中自动开启线程、自动关闭的类。

下载地址:微信扫一扫,关注下方【毕业设计组织】公众号,请回复数字”6273“获取下载链接