Android系统架构
Android大致可以分为四层架构:Linux内核层、系统运行库层、应用框架层、应用层。
1. Linux内核层
Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理。
2. 系统运行库层
这一层通过一些c/c 库来为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES提供了3D绘图的支持,Webkit提供了浏览器内核的支持。
在这一层还有Android运行时库,他主要提供了一些核心库,能够允许开发这使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的。它针对手机内存、CPU性能有限等情况做了优化处理。
3. 应用框架层
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成,开发者也可以通过这些API来构建自己的应用程序
4. 应用层
所有安装在手机上的应用程序都是属于这一层的。
Android应用开发特色
1. 四大组件
Android系统四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。其中活动是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。而服务就比较低调了,你无法看到它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然是可以继续运行的。广播接收器允许你的应用接收来自各处的广播消息,比如电话,短信等。当然你的应用也可以向外发出广播消息。内容提供器则为应用程序之间共享数据了可能,比如你想要读取系统电话本中的联系人,就需要通过内容提供器来实现。
2. 丰富的系统控件
Android系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。也可以自己定制自己的控件。
3.SQLite数据库
Android系统还自带了这种轻量级、运算速度极快的嵌入式关系型数据库,不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作、让存储和读取数据变得非常方便。
4. 强大的多媒体
Android系统还提供了丰富的多媒体服务,如音乐、视频、录音、拍照等等。这些都可以在程序中通过代码进行控制。
5. 地理位置定位
Android手机都内置GPS。
搭建开发环境
下载JDK
下载IDEA
下载Android SDK,通过idea下载
打开idea,新建一个项目,选择android,点击install SDK进行下载。
创建第一个Android项目
* name为软件名称,package name是项目的包名,Andriod系统是通过包名来区分不同的应用程序,所以要保证包名的唯一性。Minimum API Level为项目的最低兼容版本*
运行第一个Android项目
1.点击菜单栏File下的project structure。配置Artifacts。artifact是一种用于装载项目资产以便于测试,部署,或者分布式软件的解决方案。
2. 选择运行设备
分析第一个Android项目
1. 项目结构的分析
4. .gradle和.idea都是自动生成的一些文件,无需关心,也不需要编辑。
5. app :项目中的代码、资源等内容几乎都是放置在这个目录下的。
6. gradle:这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。
7. .gitgnore:这个文件是用来将指定的目录或文件排除在版本控制之外的。
8. build.gradle:项目全局的gradle构建脚本,通常这个文件的内容是不需要修改的。
9. gradle.properties:全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
10. gradlew和gradlew.bat:用来是命令行界面执行gradle命令,其中gradlew是在linux或mac系统中使用的,gradlew.bat是在windows系统中使用的。
11. 项目名.iml:自动生成的文件,用于标识这是一个IntelliJ IDEA项目,不需要修改这个文件中的任何内容。
12. local.properties:用于指定本机中的Android SDK路径,通常内容都是自动生成的,不需要修改。
10.settings.gradle:这个文件用于指定项目中所有引入的模块。
2. app目录的分析
1 build:主要包含了一些在编译时自动生成的文件,不需要过多关心。
2 libs:在项目中使用的第三方jar包,放在这个目录下的jar包会自动添加到构建路径里去。
3 androidTest:用来编写Android Test测试用例,可以对项目进行一些自动化测试。
4 main下面的java:放置所有Java代码的地方。
5 res:项目中使用到的所有图片、布局、字符串等资源需要存放在这个目录下。图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下。应用图标放在mipmap目录下。
6 AndroidMainifest.xml:整个Android项目的配置文件,在程序中定义的所有四大组件都需要在这个文件里注册,还可以在这个文件中给应用程序添加权限声明。
7 test:用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8 gitinore:这个文件用于将app模块内的指定的目录或文件排除在版本控制之外。
9 app.iml:自动生成的文件,不需要关心。
10 build.gradle:这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
11 proguard-rules.pro:这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
3. 分析项目如何运行
1 打开AndroidMainifest.xml
2 分析活动代码
继承AppCompatActivity,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Andriod2.1系统。Activity是Andriod系统的一个活动基类,项目中所有活动都必须继承它或者它的子类才能拥有活动的特性。onCreate这个方法是一个活动被创建时必定要执行的方法。
Android程序的设计讲究逻辑和视图分离,因此不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。
3 如何引用res目录下的内容
例如res/values/strings.xml。可以有两种方式进行引用。
在代码中通过R.string.name获得该字符串的引用
在xml中通过@string/name获得该字符串的引用。
其中string部分是可以替换的,如果是引用的图片资源就可以换成drawable,如果引用的是应用图标就可以替换成mipmap,如果是引用的布局文件可以替换成layout
4 详解build.gradle文件
Gradle是一个非常先进的项目构建文件,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种繁琐配置。
最外层的build.gradle
dependencies闭包中使用了classpath声明了一个Gradle插件。
app目录下的build.gradle
apply plugin应用了一个插件,一般有两种值可选:com.android.application,表示这是一个应用程序模块,com.android.library表示这是一个库文件。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
compileSdkVersion用于指定项目的编译版本。buildToolsVersion用于指定项目构建工具的版本。
在defaultConfig闭包中可以对项目的更多细节进行配置。applicationId用于指定项目的包名。minSdkVersion用于指定项目最低兼容的Android系统版本。targetSdkVersion指定的值表示你在该目标版本上已经做过充分的测试。
在buildTypes闭包中用于指定生成完整文件的相关配置,通常会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。debug闭包是可以忽略不写的release闭包中minifyEnabled用于指定是否对项目的代码进行混淆,true代表混淆,false代表不混淆。proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件,第一个是proguard-android.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则。第二个是proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。
掌握日志工具的使用
Android中的日志工具是Log(android.util.Log),这个类提供了如下5个方法来供我们打印日志。
Log.v()。用于打印那些最为繁琐的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
Log.d()。用于打印一些调试信息,对应级别debug,比verbose高一级。
Log.i()。用于打印一些比较重要的数据,可以分析用户行为数据,对应级别info,比debug高一级。
Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比info高一级。
Log.e()。用于打印程序中的错误信息,当有错误信息打印出来,代表程序出现了严重问题,必须尽快修复。对应级别error,比warn高一级。
活动是什么
活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动。
手动创建活动
右键new -activity- empty activity。
勾选Generate Layout File表示会自动创建一个对应的布局文件。
勾选LauncherActivity表示会自动将新创建的活动设置为当前项目的主活动。
创建和加载布局
Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的。
右击app/src/main/res目录->New->Directory,会弹出一个新建目录的窗口,起名为layout。右键->new ->Layout resources file,新建布局资源文件。
Design是当前的可视化布局编辑器 ,在这里不仅可以预览当前的布局,还可以通过托放的方式编辑布局。而Text则是通过XML文件的方式来编辑布局。
代码语言:javascript复制 <Button
android:text=" Button 1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@ id/button_1"/>
match_parent表示让当前元素和父元素一样宽,wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
在活动里新增代码setContentView(R.layout.first_layout);setContentView()方法来给当前的活动加载一个布局。项目中添加的任何资源都会在R文件中生成一个相应的资源id。
注册活动以及配置主活动
所有的活动都要在AndroidManifest.xml中进行注册才能生效。Idea会自动帮忙注册。但是现在仍然不能运行程序,程序当前仍然没有配置主活动。
配置主活动的方法
在标签的内部加入
代码语言:javascript复制 <intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
在活动中使用Toast
Toast是Android系统提供的一种提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间内后自动消失,并且不会占用任何屏幕空间。
代码语言:javascript复制 Button button1=(Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this,"you clicked",
Toast.LENGTH_SHORT).show();
}
});
findViewById()可以获取到在布局文件中定义的元素,返回的是一个View对象,需要向下转型成Button对象。setOnClickListener()为按钮注册一个监听器,点击按钮时就会执行监听器的onClick()方法。
Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来就可以。makeText()需要传入3个参数,第一个参数时Context,也就是Toast要求的上下文。第二个参数时Toast显示的文本内容,第三个参数时Toast显示的时长。
在活动中使用Menu
在res目录下新建一个menu文件夹,右键文件夹->new ->Menu resource file。
在新创建好的文件添加代码。
代码语言:javascript复制<item android:id="@ id/add_item" android:title="Add"/>
<item android:id="@ id/remove_item" android:title="Remove"/>
标签用来创建具体的某一个菜单项。
回到活动重写onCreateOptionsMenu()
方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
getMenuInflater()方法可以获得MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单。inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单。第二个参数用于指定菜单项将添加到哪一个Menu对象当中。返回值true,表示允许创建的菜单显示出来,如果返回false,创建的菜单将无法显示。
销毁活动
使用代码的方式:finish(),在活动中调用一下这个方法就可以销毁当前活动了。
暂时先写这么多把,后续有空将会更新这个系列!