Android权威编程指南-笔记1-3
Android权威编程指南-笔记1-3
第一章:Android开发初体验
命名规则
包名: 遵循“DNS”反转约定,也就是将企业组织或公司域名反转后,在尾部加上应用名称。
Activity子类命名:一般添加Activity后缀。比如QuizActivity。
布局的命名规则:将Activity名称的单词顺序颠倒过来,并全部转换为小写,然后在单词间添加下划线。比如activity_quiz。
控件属性
layout与没有layout的区别:
android:layout_gravity
:指定元素相对于其父元素的位置。
android:gravity
:指定该元素包含的子元素的位置。
gravity: 重力;在此表示“停靠位置”
组件与XML元素
- 组件与XML元素一一对应。元素名称就是组件的类型。
- 个元素均有一组XML属性。属性可以看作是如何配置组件的指令。
Android Studio视图
- 默认使用Android项目视图;该视图是开发者专注与常用文件和目录,默认隐藏了真实目录结构。
- Project视图:会显示当前项目的所有文件和目录。
R.java
R.java文件:该文件在Android项目编译过程中自动生成。Android Studio另外还保存了一份代码编译用的R.java隐藏文件。可见的R.java文件仅在点击运行应用时,才会更新。
Android为整个布局文件 和 各个字符串生成资源ID。但布局文件中的组件除外,因为并不是所有的组件都需要资源ID。
Alt + Enter 组合键,让Android Studio自动导入jar包;代码有误时,也可以使用该组合键来修正。
Toast
Android的Toast(吐司)是用来通知用户的简短弹出消息。
Activity是Context的子类。
创建toast后记得调用 Toast.show()方法显示消息。
布局文件内容转变为View对象
activity_.xml布局文件的内容是如何转变为View对象呢?**
aapt(Android Asset Packaging Tool)将布局文件资源编译压缩后,打包到.apk文件中。然后 Activity类的onCreate(…)方法调用setContentView(…)方法时该Activity使用LayoutInflater类实例化布局文件中定义的每一个View对象。
Activity子类的实例创建后,onCreate(Bundle)方法会调用。activity被创建后,它需要通过setContentView(int layoutResID)获取并不管理属于自己的用户界面,根据传入的布局资源ID,该方法生产指定布局的视图并将其放在屏幕上。布局视图生成后,布局文件包含的组件也随之以各自的属性定义完成实例化。
Getter和Setter
生成获取方法与设置方法:
首先,配置Android Studio识别成员变量的m前缀;static Fields的s前缀。
File --> Settings --> Editor --> Code Style --> Java --> Code Generation
使用快捷键 alt + Insert
然后选择 Getter and Setter
即可。
向项目中添加资源
将图片添加到对应的drawable目录;切换到Project视图。展开app/src/main/res
,找到或创建匹配各类像素密度的子目录。
任何添加到res/drawable目录中,后缀名为 .png、.jpg、.gif的文件都会自动获得ID。注意:文件名必须是小写且不能有任何空格符号。
第三章:Activity的生命周期
详见:Android AIP文档,API Guides –> App Components –> Activities
MIUI 8.1 打开开发者模式:
设置 –> 关于手机 –> 点击5次"MIUI版本";然后即可进入"设置–更多设置–开发者选项"。
日志跟踪
android.util.Log类能够发送日志信息到系统级别的共享日志中心。 运行时可以使用LogCat工具来查看日志;应用编译运行时,一般会自动打开。为了方便查找,可以使用TAG常量过滤日志输出。
Activity生命周期
操作 | Activity调用的方法 |
---|---|
按返回键 | onPause()、onStop()、onDestroy() 不会保存状态数据 |
按 Home键 | onPause()、onStop() |
被部分遮挡 | onPause() |
设备旋转 | – onDestroy() –> onCreate() – |
设备旋转与Activity生命周期
设备旋转时,系统会销毁(onDestroy())当前Activity实例,然后创建(onCreate())一个新的该Activity实例。
原因是:Android在匹配设备配置时,需要新建该最匹配的activity,来显示一个新布局。所以需要先销毁在创建。
设备配置与备选资源
设备配置:用来描述设备当前状态的一系列特征。包括:屏幕方向、屏幕密度、屏幕尺寸、键盘类型、底座模式、语言,等等。
通常为匹配不同的设备配置,应用会提供不同的备选资源。
创建水平模式布局
在Project视图中,右键 res目录 –> New –> Android resource directory; 从资源类型(Resource type)中选择layout;在可用的限定符列表中,选择Orientation,点击 "»" 按钮,最后选中Screen Orientation下拉列表中的Landscape(横向)选项。
此时目录名会自动添加一个-land
后缀名;可以在网站上查看Android的配置修饰符列表以及其代表的设备配置信息。
将res/layout
目录下的activity_**.xml文件复制到res/layout-land
目录下,并修改其内容。
创建styles-v21.xml文件:
创建用于 Android 5.0(API 级别 21)的文件 Right click on res folder, choose New –>Android resource file
(直接是文件), set the same name for the new file "styles", in Available qualifiers: choose the last item "Version" and finally set "Platform API level" 21.
之后应该会直接会创建values-v21目录和该目录下的styles-v21.xml文件。
FrameLayout 帧布局
FrameLayout是最简单的ViewGroup组件,它不以特定的方式安排其子视图的位置。
FrameLayout的子视图的位置排列取决于它们各自的android:layout_gravity
属性。
<LinearLayout
android:layout_gravity="center_vertical|center_horizontal">
<!-- 使用位或 | 使用两个值 -->
设备旋转前保存数据
onSaveInstanceState()只是为了防止Activity被意外杀死,和设备配置变更? 它的目的是? 目的:在Activity对象被销毁时,还能够进行一些数据恢复。而当 activity is paused or stopped,其状态是保存的,没有丢失,不需要恢复。按返回键后数据不能通过这种方法恢复。
而当前Activity没有被销毁,数据是一直都存在的,也就不需要进行恢复。所以恢复操作只在onCreate()中进行? 也要注意恢复。
注意:当按Back键时,系统会彻底销毁当前的Activity;此时暂存的Activity记录也会被清除。另区别 销毁Activity 和 停止当前应用的进程的区别
详细的Activity生命周期记录见,另一个md文件。和一个Activity.mm。
覆盖onSaveInstanceState(Bundle)方法
Activity缺省会保留一些数据;而这些可保存数据的组件需要有一个ID。
//检测为null的原因:在首次启动时(按了back又回来,可能也是这种情况)并没有保存数据。
if(savedInstanceState != null){
//恢复数据
}
Android应用的调试
点击底部图标:Android Monitor,展开DDMS工具,再选中LogCat观察日志。
日志过滤
异常与跟踪栈
诊断应用异常
对于逻辑错误,非崩溃型运行异常,追踪起来更加困难。
如确实不知道问题产生的原因,则需要设法跟踪并找出问题所在。
两种跟踪问题的方法:
- 记录栈跟踪的诊断性日志
- 利用调试器设置断点调试
记录栈跟踪日志
Log.d(String, String, Throwable)
设置断点调试
通过“调试运行”,来启用代码调试器并触发已经设置的断点;点击"debug"按钮即可。
使用异常断点
使用调试器来捕捉异常。选择"Run –> View Breakpoints … " 菜单项,调出异常断点设置窗口。
Android特有的调试工具
使用Android Lint
Android Lint是Android应用的静态分析器。
主动查看项目中的所有潜在问题,可以选择 Analyze -> Inspect Code 菜单手动运行Lint。
R类的问题
如遇到,资源编译错误可以尝试如下操作:
- 重新检查资源文件中Xml文件的有效性;如某个布局文件中的拼写错误引起。
- 清理项目: Build –> Clean Project。这会重新编译整个项目。
- 使用Gradle同步项目:如果修改了build.gradle配置文件,就需要进行同步。Tools -> Android -> Sync Project with Gradle…
- 运行Lint:查看Lint的警告信息。
《Android 4高级编程》
R 类是基于外部资源而生成的类,并且是在编译项目时创建的,对于已为其定义了至少一个资源的资源类型,R类将对应地包含一个静态子类。比如R.String子类(内部类)。
R类的每个子类都把它的相关资源表示为变量的形式,这些变量的名字与资源标识符想匹配。这些变量的值是一个整数,代表每个资源在资源文件中的位置,而不是资源本身的一个实例。
当一个构造函数或方法接受一个资源标识符时,就可以传递资源变量。当需要一个资源本身的实例时,就需要使用辅助方法来把它们从资源表中提取出来;在应用程序中,资源表是为Resources类的一个实例。而这些辅助方法不能是静态的,可以在应用程序的上下文中使用getResources方法来访问应用程序的Resources实例。
Resources类为每一个可用的资源类型包含了getter,并且通常是通过传递你需要的资源实例的资源ID来发挥作用。