写在前面
由于实验室工作需要,我也要加入到移动端开发这里来。自己也刚刚好学习一下。
这一篇笔记我们把《第一行代码》中的主要框架和步骤记录一下,用作以后的参考。
1. 开始启程
这一章介绍了一下开发环境和版本更替之类的东西。
然后开始让我们创建第一个工程。会发现工程里面都是 Android Studio 创建好的。之后让我们在手机上(模拟器上)跑起来这个东西。然后作者给我们介绍了一下工程下每一个组件部分的作用。之后讲了一下日志工具的应用。
说了一下安卓4大组件:Activity/ service/ Content Provider / broadcast receiver
这里有一个坑,创建项目时候选语言选错了,应该选 java,选成 kotlin了。
2. 探究活动
这里给我们介绍了一下 Activity.
2.2 活动的基本用法
让我们自己在我们的包内 (com.example.activitytest) 创建一个活动;之后需要在把 Activity 在 AndroidManifest 中注册(这里 manifest 的英文含义就是“货单”),其实这里 android studio 已经完成了对于 activity 的注册。然后添加相关的 layout,编辑代码改成 LinearLayout,之后在布局中 添加一个 button。然后在 activity 中用 setContentView() 方法来加载这个布局。
总结一下:
- 创建 activity
- 注册 activity
- 添加 layout,并编辑布局设计
- 在活动中加载 layout
之后又介绍了 在活动中使用 toast ,首先Toast需要一个触发点,这里把之前添加的 button 作为触发点。
之后介绍了在活动中使用 menu。首先需要在 res 目录下创建 menu resource file,然后编辑该文件,说明 menu 的 内容。之后回到 activity 中重写 onCreateOptionMenu() 方法(快捷键 ctro+O),加载创建出的菜单。
销毁活动可以用 finish() 方法,也可以在手机上用返回键(android都是有返回键的)。
2.3 使用 Intent 在活动之间穿梭
Intent 一般可被用于启动活动、启动服务以及发送广播等场景。
上面只是用了一个 activity,如果用到 多个 activity ,当然要涉及怎么在不同的 activity 之间切换。这里我们用 Activity类中 startActivity() 方法来启动活动。
这里我们创建第二个 activity,同时编辑 layout,添加到 second activity 中。
看一眼注册表,可以看到这时候有两个活动,其中 firstactivity 是主活动,配置了相关的 <intent-filter> 标签中的内容。而 secondAct 并没有。所以我们需要用 intent 来启动。
这里分为显式和隐式两种 intent。
显式就是说,创建一个 Intent 对象(指明要启动的活动),然后作为 startActivity() 参数。
隐式就是说,不指明要启动的活动,而是指定抽象的 action & category信息,由系统去分析哪个活动满足。
比如这里书上在注册表中改变 secondAct 的 <intent-filter> 标签,指定了 action & category,然后在创建 Intent 对象时候指定这个 action 而不是直接像显式那样指定活动。
2.4 活动的生命周期
这里作者首先指出,Android 使用任务(Task)来管理活动,一个 Task 就是一组存放在栈里的活动集合,所以不同的活动是覆盖的,在手机上按下 返回键,返回上一个活动,总是显示栈顶的活动。如下图:

之后作者介绍了活动的 4 种状态:
- 运行状态:
处于栈顶。 - 暂停状态:
不在栈顶,但是可见。
比如弹出来一个窗口,窗口的活动是栈顶,但是后面的活动还是可见的(不是每个活动都要占满屏幕)。 - 停止状态:
不在栈顶,也不可见。 - 销毁状态:
从栈中移除,不在栈中。
对应上面的运行状态,Activity 类中定义了7个回调方法
7个回调方法同时对应了 3 种活动的生存期:
- 完整生存期: 从 onCreate() 到 onDestroy(),即从创建,到销毁。
可以看到在每个 Actitity 中都重写了 onCreate() 方法,因为所有的活动我们都是要创建的,不创建你要这个玩意干嘛。 - 可见生存期:onStart() 到 onStop(),在可见生存期内,活动对用户是可见的。
-
前台生存期:onResume() 到 onPause() 。在前台生存期内,活动是出于运行状态的,可以跟用户交互的。
还有一个 onRestart() 方法,用于将活动从停止状态变成运行状态。
说了那马多话,其实下面一张图就可以说明整个问题。
运行周期图
之后,为了让我们实实在在感受到活动的生存周期,作者通过 ActivityLifeCycleTest 项目中,重写 onCreate() 等方法,使用 Log.d() 在 Logcat 中打印出相关的可视信息,让我们明白自己对于上面说过的那些回调方法的调用情况。其中 Log.d() 方法含有两个参数,第一个参数是 contex,一般为当前类名;第二个参数是要打印的信息,注意二者都是 字符串。
同时android提供 有 onSaveInstanceState() 方法来保证活动在 回收前一定会被调用。
2.5 活动的启动方式
这里介绍了不同的活动启动的方式。
2.6 活动的最佳实践
知晓当前在哪个活动
首先给出一个父类 BaseActivity,在 重写的 onCreate() 方法中通过 Log.d("BaseActivity", getClass().getSimpleName()) 来打印当前实例的类名。然后在子类中运行时候,Log中就可以打印出来当前活动的类名了。
随时随地退出程序
通过建立一个专门的集合类对所有活动进行管理。在别的地方直接调用这个管理集合类中的 finishAll() 方法即可全部销毁所有的 actitity 来退出程序。
管理类 ActitityCollector 中,通过 List 来将所有的 Activity 进行管理,并且在static finishAll() 遍历 List 中所有的活动,调用 finish() 方法来停止活动。同时在 BaseActivity 中,在 onCreate() 方法中,将新建的活动添加进入 Activitylist;在 onDestroy() 方法中将销毁的活动 remove掉。
最后,在别的类中即可调用 ActitityCollector.finishAll() 方法来全部销毁。
3. UI点点滴滴
3.1 如何编写程序界面
作者说,不推荐可视化编辑器,用 xml(Extended markable Language)来写。
3.2 常用控件的使用方法
作者在这一个小节介绍了几个常用的控件。
TextView
这个控件很简单,我们看一下控件中的一些属性都是用来指定什么的。
- android:gravity 指定控件的对齐方式
Button
控件也很简单,可以在 活动中给 控件注册一个监听器。来指定当我们点击按钮之后调用的方法。两种监听器方法。
EditText
- android:hint 指定里面的提示内容。
- android:maxLines 指定最大行数,输入超过时候不再拉长,而是向上滚动
ImageView
展示图片的控件。图片一般放在 drawable 目录下。其中还有不同的 drawable-xxxdpi 之类的文件夹用于存放不同分辨率的图片。
ProgressBar
显示进度条。可以在 activity 中通过 progressBar.setVisibility() 来设置其可见性。
- style="" 指定进度条的样式。可以是横条,或者转圈圈那种的。
AlertDialog
Alert对话框。置顶于所有的界面元素之上的。
这个空间不需要在 xml 样式表中指定,因为其样式是固定的。所以直接在 activity 中创建。 首先通过 AlertDialong.Builder 创建一个 AlertDialog 的实例,然后通过 setTitle() / setMessage() / setCancelable() / setPossitiveButton 等来指定其标题、内容等。最后不要忘记 调用 show() 来显示对话框。
ProgressDialog
Progress对话框。置顶。
跟上面 AlertDialog 类似。具体查阅文档。
3.3 详解4种布局
布局是放置很多控件的容器。

线性布局
这里作者介绍了一哈 layout 的一些属性。
- android:layout_gravity:控件在布局中的对其方式
前面说过,android:gravity 指定控件中文字的对齐方式。而这里 android:layout_gravity 用于指定控件在布局中的对齐方式。所以实际上,一个控件可以有两个跟 gravity 有关的属性,android:gravity & android:layout_gravity - android:layout_weight:用比例的方式指定控件大小
这个在不同屏幕的适应性匹配方面可以很好地适用。不同的控件都有这个属性,最终比例就是 weight/sum
相对布局
帧布局
百分比布局
这里需要添加一下依赖。书上的是老版的,现在是新版的 用 implements。
3.4 创建自定义控件
可以看到所有的控件都是继承自 View 类的,所有的布局都是直接或者间接继承自ViewGroup的。
View 是 Android中最基本的一种UI组件,可以在屏幕上绘制出一块矩形区域并且相应相关的事件。而ViewGroup是一种特殊的 View,包含很多子View 和子 ViewGroup,是一个用于放置控件和布局的容器。

所以在系统提供的控件不够用的时候,我们可以通过上述的这种继承关系来创建一些自定义控件。
这里作者给出了一个创建标题栏的例子。
引入布局
其实创建标题栏也很简单,直接在布局中加入一个 TextView 和 两个 Button,但是问题是,标题栏在所有的页面布局中都要使用,难道我们要把重复的代码在所有 xml 布局文件中都写一次吗?当然不是。所以我们通过 引入布局 的方式完成这项工作。
新建一个 title.xml 布局文件。写好 LinearLayout 中的两个按钮和一个 TextView,调整好位置,这里还给定了一下 android:background 属性,给控件指定一个背景。
然后在 其他活动的 xml 布局文件中,只需要 include 将title 布局引入进来即可。最后在 其他活动 的 .java 文件中,调用 getSupportActionBar() 方法获取 ActionBar 实例(具体会在12章中学习),将原来的标题隐藏。
网友评论