《第一行代码》读书笔记

阅读:467 2019-03-19 14:40:28 来源:开源中国

过一遍这本书,记一下个人认为比较重要的一些点

1.linux内核层:linux2.6内核,为android设备的硬件提供底层驱动。如显卡音频蓝牙相机wifi电源管理等。

2.系统运行库

通过一些c/c++库提供一些特性支持。如sqlite库提供数据库支持、如opengl提供3d绘图支持、webkit库提供浏览器内核支持等。

此外还包括androidruntime库,主要提供了一些核心库,能够允许开发者使用java语言来编写android应用。另外android运行时库中还包含了dalvik虚拟机,它使得每一个android应用都能运行在独立的进程当中,并且拥有一个自己的dalvik虚拟机实例。dalvik是专门为移动设备定制的。

3.应用框架层

提供应用程序可能用到的api。

4.应用层

安装在手机上的应用。

本书出版时4.0以上已经占80%市场份额,所以没有必要支持2.x了。(16年2月20日4.0以上已经90%+,友盟数据)

1.四大组件

activity:与用户交互的组件。

service:后台服务,即使退出应用,service还可以运行,监控其他组件。

broadcastreceiver:接收应用广播(监听其他组件)。

contentprovider:跨应用数据共享。

2.丰富的系统控件

3.sqlite数据库

4.地理位置定位

5.强大的多媒体

6.传感器

这里写的还是adt(eclipse),不多说。

现在主要是androidstudio+genymotion或手机

也不多说。

目录结构

这里说一下as的目录结构

libs:第三方jar包

res:资源文件

drawable-ldpidrawable-mdpidrawable-hdpidrawable-xhdpi低、中、高、超高分辨率的图片文件

layout布局文件

valuesxml格式的资源文件如字符串资源文件:string.xml颜色colors.xml尺寸dimens.xml

src:java源文件目录

androidmanifast.xml:项目清单,应用的名称、图标、访问权限等属性在这里定义。四大组件也是在这里配置。

build:androidstudio自动生成的源文件。对应eclipse的gen和bin

build.gradlegradle配置文件,配置编译版本、依赖库等。

androidstudio没有assets目录,需要自行添加,可参考

http://stackoverflow.com/questions/18302603/where-to-place-assets-folder-in-android-studio

log.v()verbose琐碎的

log.d()debug

log.i()info

log.w()warning

log.e()error

system.out打印不可控制、打印时间无法确定、不能添加过滤器、system.out没有级别区分等。

(更推荐使用logger项目https://github.com/orhanobut/logger

一种可以包含用户界面的组件,主要用于和用户进行交互。

右键--》new—》activity

或者

1.继承activity类。

2.androidmanifast.xml注册该activity。

3.res/layout创建布局文件。

4.该activityoncreate方法setcontentview,设置刚刚的布局文件。

button1.setonclicklistener(newonclicklistener(){

@override

publicvoidonclick(viewv){

finish();

}

});

2.3使用intent在活动之间穿梭

intent是android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作(要启动哪个组件),还可以在不同组件之间传递数据。intent一般可被用于启动活动、启动服务、以及发送广播等场景。

明确指定要启动的组件是哪个类。

intentintent=newintent(firstactivity.this,secondactivity.class);

startactivity(intent);2.3.2隐式intent

指定需要启动的组件需要满足怎样的条件。

intentfilter:声明自己能处理哪些隐式intent。

java代码:

intentintent=newintent("com.example.activitytest.action_start");

startactivity(intent);

manifast文件:

2.3.3更多隐式intent的用法

intentfilter处理可以设置action和category作为过滤条件外,还可以用data更精确地指定当前活动能够响应什么类型的数据

标签中主要可以配置以下内容。1.android:scheme用于指定数据的协议部分,如上例中的http部分。2.android:host用于指定数据的主机名部分,如上例中的www.baidu.com部分。3.android:port用于指定数据的端口部分,一般紧随在主机名之后。4.android:path用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。5.android:mimetype用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

intent中提供了一系列putextra()方法的重载,可以把我们想要传递的数据暂存在intent中,启动了另一个活动后,只需要把这些数据再从intent中取出就可以了。

重写startactivityforresult()方法和重写onactivityresult方法

启动的activity结束前setresult就ok了。

在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

1.运行状态活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动。2.暂停状态当一个活动不再处于栈顶位置,但仍然可见时(新启动的活动可能只占屏幕一部分),这时活动就进入了暂停状态。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动,只有在内存极低的情况下,系统才会去考虑回收这种活动。3.停止状态当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统仍然会为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。4.销毁状态当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动。

一个活动进入了停止状态,可能会因内存不足被系统回收。若被回收,再返回该活动不会执行onrestart(),会执行oncreate(),它的一些临时数据和状态丢失了。onsaveinstancestate()就可以避免这种情况。回收之前会调用onsaveinstancestate(),将临时数据塞进bundle,然后在oncreate()方法取出来即可。

启动模式一共有四种,分别是standard、singletop、singletask和singleinstance,可以在androidmanifest.xml中通过给标签指定android:launchmode属性来选择启动模式。

standard

每次启动都会创建新的实例

singletop

若栈顶刚好是该activity的实例,就会重用该实例,并调用onnewintent方法

singletask

若栈中已存在该activity的实例,就会重用该实例,并调用onnewintent方法。重用时,该实例重回栈顶,该实例以上的activity会被销毁

singleinstance

在一个新栈中创建该实例,若该实例被创建,再启动时会复用该实例,并调用onnewintent方法。

关于在新栈中创建实例:

例子:firstactivity–>创建secondactivity–>创建thirdactivity然后依次按返回

我们按下back键进行返回,你会发现thirdactivity竟然直接返回到了firstactivity,再按下back键又会返回到secondactivity,再按下back键才会退出程序,这是为什么呢?其实原理很简单,由于firstactivity和thirdactivity是存放在同一个返回栈里的,当在thirdactivity的界面按下back键,thirdactivity会从返回栈中出栈,那么firstactivity就成为了栈顶活动显示在界面上,因此也就出现了从thirdactivity直接返回到firstactivity的情况。然后在firstactivity界面再次按下back键,这时当前的返回栈已经空了,于是就显示了另一个返回栈的栈顶活动,即secondactivity。最后再次按下back键,这时所有返回栈都已经空了,也就自然退出了程序。

2.6活动的最佳实践

2.6.1知晓当前是在哪一个活动

log.d("baseactivity",getclass().getsimplename());

2.6.2随时随地退出程序

通常情况下,要退出程序必须一直按back键直至栈中没有activity实例才可以退出程序。

一个常用的解决思路是:将activity存到一个list中,要退出时就将每一个list中的activity逐一finish;

主要用于在界面上显示一段文本信息

android:id="@+id/text_view"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="thisistextview"/>

android:id给当前控件定义了一个唯一标识符

android:layout_width指定了控件的宽度

android:layout_height指定了控件的高度

match_parentfill_parent表示让当前控件的大小和父布局一样大

wrap_content表示由控件内容决定当前控件的大小

此外还可以指定具体的值作为控件的大小

android:gravity指定文字的对齐方式

按钮。

设置按钮点击事件的几种方式:

1.button.setonclicklistener

2.activity实现onclicklistener接口,重写它的onclick方法。

3.xml,指定android:onclick=“mothod”

activity写一个

publicvoidmothod(viewview){

//点击响应事件

}

输入和编辑内容的控件

android:hint指定了一段提示性的文本

android:maxlines指定了edittext的最大行数

用于在界面上展示图片的一个控件

进度条,用于在界面上显示一个进度条

android:visibility指定控件的可见属性

visible可见

invisible表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了

gone则表示控件不仅不可见,而且不再占用任何屏幕空间

style指定控件的不同样式

android:max给进度条设置一个最大值。然后在代码中动态地更改进度条的进度

可以在当前的界面弹出一个对话框,能够屏蔽掉其他控件的交互能力

也是在当前的界面弹出一个对话框,能够屏蔽掉其他控件的交互能力,不同的是progressdialog会在对话框中显示一个进度条

setcancelable()表示progressdialog是不能通过back键取消

当数据加载完成后必须要调用progressdialog的dismiss()方法来关闭对话框

线性布局,这个布局会将它所包含的控件在线性方向上依次排列

android:orientation指定了排列方向

如果linearlayout的排列方向是horizontal,内部的控件就绝对不能将宽度指定为match_parent

如果linearlayout的排列方向是vertical,内部的控件就不能将高度指定为match_parent

android:layout_gravity指定控件在布局中的对齐方式

linearlayout的排列方向是horizontal时,只有垂直方向上的对齐方式才会生效

linearlayout的排列方向是vertical时,只有水平方向上的对齐方式才会生效

linearlayout的子控件可以将宽度(高度)指定成0,然后由android:layout_weight决定控件的宽度(高度)

相对布局,通过相对定位的方式让控件出现在布局的任何位置

android:layout_alignparentleft、android:layout_alignparenttop、android:layout_alignparentright、android:layout_alignparentbottom、android:layout_centerinparent

android:layout_above、android:layout_below、android:layout_toleftof、android:layout_torightof

顾名思义,不多说

帧布局,没有任何的定位方式,所有的控件都会摆放在布局的左上角。

表格布局允许我们使用表格的方式来排列控件。

所有控件都是直接或间接继承view,所有布局都是继承viewgroup。

view是android中一种最基本的ui组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在view的基础之上又添加了各自特有的功能。

viewgroup则是一种特殊的view,它可以包含很多的子view和子viewgroup,是一个用于放置控件和布局的容器。

先挖坑,晚点填。。。

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服