1、Android的四层结构:
1)Linux内核层:它基于Linux内核,内核层为它的硬件设备提供底层驱动。
2)系统运行库层:通过一些C/C++库来为它提供主要的特性支持,比如SQLite库提供数据库支持,OpenGL|ES库提供3D绘图支持,Webkit提供浏览器内核支持。
另:这一层还有Android运行时库,这个库提供了一些核心库,允许开发者使用JAVA语言编写安卓应用;这个库还包含了Dalvik虚拟机,相当于JAVA虚拟机的移动设备定制版,主要对手机内存、CPU性能有限的情况做了优化处理。
3)应用框架层:提供了构建应用程序时可能用到的各种API,开发者可以通过使用这些API构建自己的应用程序。
4)应用层:安装在手机上的应用程序属于这一层。
2、Android 5.0系统使用ART运行环境替代了Dalvik虚拟机大大提升了应用的运行速度,提出了Material Design的概念优化应用的界面设计。
3、安卓系统提供的可供我们开发应用程序的东西:
1)四大组件:活动:是所有安卓应用程序的门面,凡是在应用中看到的东西都是放在活动中的。服务:无法看到它,在后台运行,即使退出应用,服务仍然可以运行。广播接收器:允许应用接收来自各处的广播消息,比如电话、短信,也可以允许应用向外发出消息。内容提供器:使应用程序之间共享数据。
2)丰富的系统控件:编写界面。
3)SQLite数据库:轻量级、运算速度极快的嵌入式关系型数据库,可以通过安卓封装好的API进行操作。
4)强大的多媒体:可以通过代码控制系统提供的多媒体服务。
5)地理位置定位:安卓手机自带。
//2017/5/9
1、project中的.gradle和.idea是自动生成的,不用关它们。
2、project中的app目录是项目中的代码及资源的放置目录,开发工作基本在这个目录下进行。
3、project中的build目录主要包含了在编译时自动生成的文件。
4、project中的gradle目录(项目自动化建构工具)包含了gradle wrapper的配置文件,开启方式:Android Studio导航栏->File->Settings->Build,Execution,Deployment->Gradle,进行配置更改。
5、project中的.gitignore目录用来将制定的目录或者文件排除在版本控制之外。
6、project中的build.gradle目录是项目全局的gradle构建脚本,通常这个文件中的内容不需要更改。
7、project中的gradle.properties目录是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
8、project中的gradlew和gradle.bat文件是用来在命令行界面中执行gradle命令的。
9、project中的.iml文件不需要改动。
10、project中的local.properties文件用于指定本机中的Android SDK路径。
11、project中的settings.gradle文件用于指定项目中所有引入的模块,通常模块的引入都是自动完成的,需要手动去修改的场景比较少。
12、app目录中的build目录和外层的build很相似,不需要关心。
13、app目录里的libs目录用于存放第三方jar包,这些jar包会自动添加到构建路径里去。
14、app目录里的java目录存放所有的Java代码。
15、app目录里的res目录,用于存放项目里的图片,布局,字符串,其子目录drawable存放图片,子目录layout放布局,子目录values放字符串。mipmap目录放应用图标。
16、app目录里的AndroidManifest.xml文件是整个Android项目的配置文件,在程序中定义的所有四大组件都需要在这个文件里注册,还可以在这个文件中给应用程序添加权限声明,这个文件经常会用到。
17、app目录里的test目录,用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
18、app目录里的.gitignore文件用于将app模块内的指定的目录或文件排除在版本控制之外,与外层的.gitignore文件类似。
19、app目录里的app.iml文件,同外边的.iml文件一样不需要关注。
20、app目录里的build.gradle文件,这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
21、app目录里的proguard-rules.pro文件,这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆从而让破解者难以阅读。
22、Android程序的设计讲究逻辑和视图分离,不推荐在活动中直接写界面而是在布局文件中写界面,在活动中引入。在OnCreat()方法中调用SetContentView()方法就是给当前活动引入一个布局。
23、引用资源文件(res目录)可以通过两种方式:
1)在代码中通过R.string.hello_world可以获得字符串的引用。
2)在XML中通过@string/hello_world可以获得该字符串的引用。
24、Android Studio是采用Gradle来构建项目的,Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置摒弃了传统的基于XML的各种繁琐配置。
25、外层的build.gradle文件中的两处repositories闭包中都声明了jcenter()这行配置,其实它是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter()上,声明了这行配置之后,就可以在项目中轻松引用任何jcenter上的开源项目了。
26、外层build.gradle文件中的dependencies闭包使用classpath声明了一个Gradle插件,如果想使用Gradle构建Android项目,需要声明com.android.tools.build:gradle:2.2.20这个插件。
27、内层build.gradle文件中的第一行或者为apply plugin: 'com.android.application'即是一个应用程序模块,或者为 apply plugin: 'com.android.library'表示这是一个库模块。
28、内层build.gradle文件中的Android闭包中可以配置项目构建的各种属性,其中compileSdkVersion用于指定项目的编译版本,而buildToolsVersion用于指定项目构建工具的版本。
29、android闭包里嵌套的defaultConfig闭包可以对项目的更多细节进行配置:其中applicationId用于指定项目的包名,在创建项目适合其实已经指定过包名了,在这里可以进行修改。minSdkVersion用于指定项目最低兼容的Android系统版本。targetSdkVersion指定的值表示在该版本上已经做过了充分测试,系统将会为应用程序启动一些最新的功能和特性。versionCode用于指定项目的版本号。versionName用于指定版本的版本名,这两个属性在生成安装文件时非常重要。
30、Android闭包里嵌套的defaultConfig闭包,它用来指定生成安装文件的相关配置,通常包含debug和release两个子闭包,其中release闭包中的minifyEnabled用于指定是否对项目代码进行混淆。proguardFiles用于指定混淆时使用的规则文件:proguard-android.txt是在Android SDK目录下,里面是所有项目通用的混淆规则;proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。
31、内层build.gradle里的dependencies闭包功能强大,用以指定当前项目所有的依赖关系,一般android studio项目一共3中依赖方式:本地依赖、库依赖和远程依赖:
1)本地依赖可以对本地的Jar包或目录添加依赖关系;
2)库依赖可以对项目中的库模块添加依赖关系;
3)远程依赖则可以对jcenter库上的开源项目添加依赖关系。
//2017/5/10
1、Android中的日志工具类Log(Android.util.Log),包括五中级别,由低到高分别是:Log.v()、Log.d()、Log.i()、Log.w()及Log.e()。
2、活动(Activity)是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见。
3、项目中的任何活动都应该重写Activity的onCreate()方法。
4、如果需要再XML中引用一个id,就使用@id/id_name这种语法,如果需要再XML中定义一个id,则要使用@+id/id_name这种语法。
5、项目中添加的任何资源都会在R文件中生成一个相应的资源id,而setContentView()方法来给当前活动加载一个布局,而一般给这个函数传入布局的id。
6、Toast是Android系统提供的一种提醒方式,可以用来给用户传递短小的消息,并且这些消息在一段时间后自动消失。
7、使用Intent在活动之间穿梭。
8、Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。分为显示Intent和隐式Intent。
9、通过在AndroidManifest.xml文件中<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够影响的action和category
10、每个Intent中智能指定一个action,但却能指定多个category。
//2017/5/11
1、可以在 <intent-filter>标签中配置一个<data>标签用于更精确的指定当前活动能够响应什么类型的数据。
//2017/5/15
1、<data>标签中主要可以配置以下内容:
android:scheme:用于指定数据的协议部分,如上例中的http部分。2
Android:host:用于指定数据的主机部分,如上例中的www.baidu.com
android:port:用于指定数据的端口部分,一般紧随在主机名之后。
android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
2、Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些活动再从Intent中取出就可以了。
3、Activity中还有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
4、android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。默认情况下,每启动一个新的活动,它会在返回栈中入栈,并处于栈顶位置。而每当按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。
5、每个活动在生命周期中最多可能会有:运行状态、暂停状态、停止状态及销毁状态,四个状态。
6、Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节:
1)onCreate():它在活动第一次被创建的时候调用,主要完成活动的初始化操作:加载布局、绑定事件等。
2)onStart():在活动由不可见变为可见的时候调用。
3)onResume():在活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶,并且处于运行状态。
4)onPause():在系统准备去启动或者恢复另一个活动的时候调用。通常在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。
5)onStop():在活动完全不可见的时候调用。
6)onDestroy():在活动被销毁之前调用。
7)onRestart():由停止状态变为运行状态之前调用。
7、将活动分成3中生存期:
1)完整生存期:活动再onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。
2)可见生存期:活动再onStart方法和onStop()方法之间所经历的,就是可见生存期。
3)前台生存期:活动在onResume方法和onPause()方法之间所经历的就是前台生存期。
//2017/5/17
1、对于AndroidManifest.xml里的activity,可以给它设置Android:theme属性,这是用于给当前活动指定主题的,例如:@android:style/Theme.Dialog就是让该activity使用对话框式的主题。
2、activity中提供了一个onSaveInstanceState()回调方法,这个方法可以保证在活动被回收之前一定会被调用,可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。这个方法携带一个Bundle类型参数,而Bundle提供了一系列的方法用于保存数据:putString()、putInt()等,每个方法有两个参数:键和值。
3、standard模式的原理示意图:
standard模式缺点:即使活动已经在栈顶了,再次启动这个活动的时候,还要创建一个新的活动实例。
4、singleTop模式:当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
设置模式方式就是在activity的标签中设置:android:launchMode="singleTop"。
singleTop的缺点就是:如果活动没灾栈顶位置,还是可能会创建这个活动的多个活动实例。
5、singleTask模式:每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
6、singleInstance模式:假设程序中有一个活动时允许其他程序调用的,如果想实现其他程序和这个程序共享这个活动的实例就需要这种模式,因为每个应用程序都会有自己的返回栈,同一个活动再不同的返回栈中入栈时必然是创建了新的实例,这singleInstance模式下,会有一个单独的返回栈来管理这个被共享的活动,不管是哪个应用程序来访问这个活动,都公用的同一个返回栈,解决了共享活动实例的问题。
7、getTaskId()方法可以返回当前返回栈的id。
8、getClass().getSimpleName()可以打印当前类名。
9、杀掉当前进程的代码:
android.os.Process.killProcess(android.os.Process.myPid()),其中killProcess()方法用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法来获得当前程序的进程id。
10、对于无法知道某个activity往下传什么数据的情况,可以添加actionstart(Context context,String data1,String data2)方法,调用:SecondeActivity.actionStart(FirstActivity.this,"data1","data2')。
//2017/5/31
1、TextView控件用于在界面上显示一段文本信息。可以使用Android:gravity来指定文字的对齐方式。使用Android:textsize设置字体大小。使用Android:textcolor设置字体颜色。
2、Button控件:Android:textallcaps用来控制系统对Button中的所有英文字母进行大小写转换。
3、EditText控件是程序用于和用户进行交互的另一个重要控件。Android:hint属性指定了一段提示性文本。Android:maxlinesz指定了EditText的最大行数为两行,当输入内容超过两行时,文本就会向上滚动,而EditText则不会再继续拉伸。
4、ImageView是用于在界面上展示图片的一个控件,提前准备的图片要放在drawable目录下。imgeview.setImageResource()可以更换图片。
5、ProgressBar用于在界面上显示一个进度条。Android控件的可见属性:android:visibility指定:
1)visible表示控件是可见的,默认值。
2)invisible表示控件是不可见的,并且它仍然占据着原来的位置和大小,可以理解为控件变成透明状态了。
3)gone表示控件不仅不可见而且不再占用任何屏幕空间。
6、可以给progressBar设置style:style="?android:attr/progressBarStyleHorizontal",可以将进度条设置为水平进度条。
7、AlertDialog可以在当前的界面弹出一个对话框。
8、progessdialog和AlertDialog优点类似,不同的是ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心等待。
//2017/6/19
1、线性布局:LinearLayout:会将它所包含的控件在线性方向上一次排列。
用android:orientation= 来控制布局是水平排列还是垂直排列。
2、当LinearLayout为horizon时,可以为布局里的控件设置Android:layout_gravity=“top、center_vertical、bottom”,即控件只能在布局的垂直方向进行设置。
当。。。。为vertical时,可以为布局里。。。。。。。。,即控件只能在布局的水平方向进行设置。
3、LinearLayout的另一个属性:android:layout_weight:对于布局中的两个控件,可以设置两个控件的android:layout_width='0dp",而设置android:layout_weight="1",这样两个控件在水平方向上分别占1/(1+1),即平分屏幕宽度。
4、相对布局:RelativeLayout:可以设置每个控件相对于父布局的定位,也可以设置控件相对于其它控件的定位。
5、帧布局:FrameLayout:所有控件都默认摆放在布局的左上角。
6、百分比布局:属于新增布局。需要在项目的build.gradle中添加百分比布局库的依赖:在app/build.gradle文件中,在dependencies闭包中添加:compile 'com.android.support:perent:24.2.1':
7、常用控件和布局的继承结构:
//2017/6/20
1、若要创建一个可以被多个活动需要的标题栏,为避免重复代码,可以使用引入布局的方式来解决。
2、Android:background属性用于为布局或控件指定一个背景,可以使用颜色或图片来进行填充。
3、Android:layout_margin属性可以指定控件在上下左右方向上偏移的距离。
4、如何引用布局:在activity_main.xml中添加:<include layout="@layout/title"/>,其中被引用的布局就是title.xml。
5、在MainActivity中将系统自带的标题栏隐藏掉:添加代码:ActionBar actionbar = getSupportActionBar();
if(actionbar != null){actionbar.hide()}
6、创建自定义控件:如果引入的布局中有一些控件要求能够响应事件,需要再每个活动中为这些控件单独编写一次事件注册代码,未避免代码重复,可以使用自定义控件的方式来解决:
新建TitleLayout继承自LinearLayout,让它成为自定义的标题栏控件:
7、最常用的控件ListView:滚动显示手机上的信息。
8、数组中的数据无法直接传递给ListView,需要借助适配器完成,其中ArrayAdapter适配器,可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。
9、可以定义一个实体类Fruit,作为ListView适配器的适配类型。接着可以为ListView的子项指定一个自定义的布局,即在layout目录下新建fruit_item.xml。需要创建一个自定义的适配器,适配器继承自ArrayAdapter,并且其泛型指定为Fruit,这个适配器是个类:FruitAdapter。
10、convertView用于将之前加载好的布局进行缓存,也可以新增内部类,用于对控件的实例进行缓存。
11、ListView只能实现数据纵向滚动,不能横向滚动。而RecyclerView是ListView的加强版。
12、RecyclerView也属于新增控件,需要将其定义在support库当中。若要使用这个控件,需要再项目的build.gradle中添加相应的依赖库:compile 'com.android.support:recyclerview-v7:24.2.1'。
13、ListView与RecyclerView的区别在于ListView的布局排列是由自身管理的,而RecyclerView则将这个工作交给了LayoutManager,LayoutManager中制定了一套可以扩展的布局排列接口,子类只要按照接口的规范来实现,就能定制出各种不同排列方式的布局了。
14、RecyclerView不仅提供了LinearLayoutManager,还提供了GridLayoutManager网格布局和StaggeredGridLayoutManager瀑布布局。