项目结构:
- 📁.idea
- 📁app
- 📁gradle/wrapper
- 📁img/README
- 📝.gitignore
- 📝README.md
- 📝build.gradle
- 📝gradle.properties
- 📝gradlew
- 📝gradlew.bat
- 📝settings.gradle
Android Dev
参考
前言
- 📁.idea
- 📁app
- 📁gradle/wrapper
- 📁img/README
- 📝.gitignore
- 📝README.md
- 📝build.gradle
- 📝gradle.properties
- 📝gradlew
- 📝gradlew.bat
- 📝settings.gradle
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 属性时,不能注释掉默认的
-
活动间传递信息用
有很多方法重载。
下面是从活动2 获得相应的数据,指定类型的。
-
startActivityForResult
注意在 onActivityResult 方法中
第一种错误写法
正确写法
此方法可以用于某活动调用 登录活动,登录活动看是否登录成功;成功后怎么处理,失败后怎么处理看 onActivityResult 方法(不知道这样是不是复杂了?应该是这样的,MainActivity 用于流程控制。)
若用户按返回键返回上一个程序,没有数据返回,在 被调用活动中重写 onBackPressed 方法 处理这种返回事件,可以返回数据给主调活动。
所以说:主调活动中 onActivityResult 方法是在被调活动结束后调用,不管内部是怎么结束的(感觉说了一堆废话)。
-
活动生命周期
-
DialogActivity类需要继承自 Activity 而不是 AppCompatActivity
-
普通活动(是一个全屏活动,会使得 MainActivity 变得不可见)
进入 MainActivity
- onCreate
- onStart
- onResume
进入 NormalActivity
- onPause
- onStop
返回 MainActivity
- onRestart
- onStart
- onResume
退出主活动
- onStop
- onDestroy
-
DialogActivity(MainActivity 可见)
进入 MainActivity
- onCreate
- onStart
- onResume
进入 NormalActivity
- onPause
返回 MainActivity
- onResume
退出主活动
- onStop
- 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中的gravity属性有两种形式:layout_gravity和gravity,这两种有什么区别呢?
从字面意思上就可以大概理解
第一个layout_gravity控制控件在父布局中的位置(和margin比较类似),
gravity可以控制控件中内容的显示位置(和padding比较类似)。
- 我之前认为的 layout_gravity 中的父布局是:假如现在是在一个 ImageView 中,父布局我会认为是 LinearLayout ,这个理解是错误的。正确理解的父布局是类似于 css 中的盒子模型,则 layout_gravity 和 margin 类似
-
RelativeLayout
layout_*:是控件或者布局?的属性,相对于父布局或者 指定id的控件(仅RelativeLayout) 的位置,对 LinearLayout 和 RelativeLayout 都适用。
考虑多使用 layout_* 来定位,用 margin 屏幕适应性没那么好?
自定义布局
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 中的发送标准广播发现问题
-
使用 AndroidManifest.xml 注册 receiver,无效。查阅以下文档后发现
我用的 API 30,所以自定义的隐式广播用 AndroidManifest 文件注册接收器方法无效了。
只能使用 动态注册。而前面一个例子中的
android.intent.action.BOOT_COMPLETED
是例外,依然可以使用。
发送有序广播
第六章 数据存储
文件存储
-
预备知识
这属于 Java 语言没学好的问题,继承,文件 IO,Arra,后面有时间补充一下
SharedPreference
P 204
kv键值对存储在 xml 文件中
数据库
第七章 内容提供器
第八章 运用手机多媒体
第九章 网络
WebView
OkHttp
解析 XML
-
服务器
svenstaro/miniserve:
For when you really just want to serve some files over HTTP right now!
🌟
-
xml
解析 JSON
-
访问错误
-
Android 8: Cleartext HTTP traffic not permitted - Stack Overflow
看这个的回答解决的
- 将 http 转为 https 或者 新建 xml 配置文件,允许 http 链接
-
从 Android 9(API 级别 28)开始 Android 的默认安全设置不允许 http 请求
-
最佳实践
这个最佳实践写了回调方法,让我耳目一新,以前从没这样的尝试。
对平常使用的那些操作更熟悉了。需要好好理解下。
-
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
前台服务
-
需要权限
-
报错
service - startForeground fail after upgrade to Android 8.1 - Stack Overflow
-
构造函数需要增加 channelID,且 channel 需要用 NotificationManager 创建
-
参考
完整代码
需要声明权限
-
IntentService
服务中自动开启线程、自动关闭的类。
下载地址:微信扫一扫,关注下方【毕业设计组织】公众号,请回复数字”6273“获取下载链接
