Android权威编程指南-笔记1-3

Published: by Creative Commons Licence

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,该方法生产指定布局的视图并将其放在屏幕上。布局视图生成后,布局文件包含的组件也随之以各自的属性定义完成实例化。

activity.xml视图实例化

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

参考别处画的图2016.7.26
Activity生命周期2

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(横向)选项。

Android Studio创建水平布局1 Android Studio创建水平布局2

此时目录名会自动添加一个-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观察日志。

日志过滤

异常与跟踪栈

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来发挥作用。