{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
过一遍这本书,记一下个人认为比较重要的一些点
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中通过给
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,是一个用于放置控件和布局的容器。 先挖坑,晚点填。。。