[1] Android的系统架构 [2]Android已发布的版本 [3]Android应用开发的特色
一:Android大致可以分为四层架构: Linux 内核层、系统运行库层、应用框架层和应用层。
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.应用层 所有安装在手机上的应用程序都是属于这一层的, 比如系统自带的联系人、短信等程序,或者是你从Google Play.上下载的小游戏,当然还包括你自己开发的程序。
二Android已发布的版本 三:Android应用开发的特色 1.四大组件 Android系统四大组件分别是活动( Activity)、 服务(Service)、广播接收器( Broadcast Receiver )和内容提供器( Content Provider )。其中活动是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。而服务就比较低调了,你无法看到它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然是可以继续运行的。广播接收器允许你的应用接收来自各处的广播消息,比如电话、短信等,当然你的应用同样也可以向外发出广播消息。内容提供器则为应用程序之间共享数据提供了可能,比如你想要读取系统电话簿中的联系人,就需要通过内容提供器来实现。
2.丰富的系统控件 Android系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。当然如果你品位比较高,不满足于系统自带的控件效果,也完全可以定制属于自己的控件。
SQLite数据库 Android系统还自带了这种轻量级、运算速度极快的嵌人式关系型数据库。它不仅支持标准的SQL语法,还可以通Android封装好的API进行操作,让存储和读取数据变得非常方便。4.强大的多媒体 Android系统还提供了丰富的多媒体服务,如音乐、视频、录音、拍照、闹铃,等等,这一切你都可以在程序中通过代码进行控制,让你的应用变得更加丰富多彩。
5.地理位置定位 移动设备和PC相比起来,地理位置定位功能应该可以算是很大的-一个亮点。现在的Android手机都内置有GPS,走到哪儿都可以定位到自己的位置,发挥你的想象就可以做出创意十足的应用,如果再结合功能强大的地图功能,LBS这- -领域潜力无限。
由于Android Studio在-一个工作区间内只允许打开一一个项目,因此首先你需要将当前的项目关闭,点击导航File→Close Projecto然后再新建-一个 Android项目,项目名可以作为ActityTest,包名我们就使用默认com.example.activitytest。 新建项目的步骤你已经在上-章学习过了,不过图1.12中的那一步需要稍做修改,我们不再选择Empty Activity 这个选项,而是选择Add NoActivity,因为这次我们准备手动创建活动,如图2.1所示。 现在右击com.example.activitytest包→New→Activity →Empty Activity,会弹出一个创建活动的对话框,我们将活动命名为FirstActivity ,并且不要勾选Generate Layout File和Launcher Activity如下图: 勾选Generate Layout File表示会自动为FirstActivity创建一个对应的布 局文件,勾选LauncherActivity表示会自动将FirstActivity 设置为当前项目的主活动,这里由于你是第一次 手动创建活动,这些自动生成的东西暂时都不要勾选,下面我们将会-一个个手动来完成。勾选BackwardsCompatibility表示会为项目启用向下兼容的模式,这个选项要勾上。点击Finish完成创建。
首先需要定义一个弹出Toast的触发点,正好界面有这个按钮,那我们就让这个点击按钮时出现Toast。代码如下 protected void onCreate(Bundle savedInstanceState) { super . onCreate(savedInstanceState); setContentView(R. layout. first_ layout); 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 Button 1”, } }); }
使用显示intent
仍然还是右击com.example.activitytest包-→New- →Activity-→Empty Activity,会活动的对话框,我们这次将活动命名为SecondActivity, 并勾选Generate Layout件起名为second_ layout, 但不要勾选Launcher Activity选项,如图2.14所示。 点击Finish完成创建, Android Studio会为我们自动生成SecondActivityjava和second_ layout. xml这两个文件。不过自动生成的布局代码目前对你来说可能有些复杂,这里我们仍然还是使用最 熟悉的LinearL ayout,编辑second layout.xml,将里面的代码替换成如下内容: <LinearLayout xmIns: android=" http://schemas . android. com/apk/ res/android" android:orientation=“vertical” android: layout_ width=“match_ parent ” android: layout_ height= “match. parent”> <Button android:id=”@+id/button_ 2" android: layout_ width=" match_ parent’ android: layout_ height=“wrap_ content " android:text=“Button 2” /> 我们还是定义了一个按钮,按钮上显示Button 2。 然后SecondActivity中的代码已经自动生成了-部分,我们保持默认不变就好,如下所示: public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super . onCreate(savedInstanceState); setContentView(R. layout. second_ layout) ; } 另外不要忘记,任何-一个活动都是需要在AndroidManifest.xml 中注册的,不过幸运的是, Android Studio已经帮我们自动完成了,你可以打开AndroidManifest.xml瞧- -瞧: <application android: allowBackup=“true” android: icon=”@mipmap/ic_ launcher" android: label="@string/app_ name " android: supportsRtl=“true android: theme=”@style/AppTheme"> Intent有多个构造函数的重载,其中-一个是Intent (Context packageContext, Class<?> cls)。这个构造函数接收两个参数,第-一个参数Context要求提供- - 个启动活动的上下文,第 二个参数Class则是指定想要启动的目标活动,通过这个构造兩数就可以构建出Intent的“意 图"。然后我们应该怎么使用这个Intent 呢? Activity 类中提供了一一个startActivity()方法,这 个方法是专门用于启动活动的,它接收一个Intent 参数,这里我们将构建好的Intent 传入 startActivity()方法就可以启动目标活动了。 修改FirstActivity中按钮的点击事件,代码如下所示: button1. set0nClickListener(new View. 0nClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity . this, SecondActivity . class); startActivity(intent); }); 我们首先构建出了一个Intent, 传入FirstActivity. this作为上下文,传入Second- Activity.class作为目标活动,这样我们的“意图”就非常明显了,即在FirstActivity 这个活 动的基础上打开SecondActivity这个活动。然后通过startActivity( )方法来执行这个Intent。 重新运行程序,在FirstActivity的界面点击一下按钮, 结果如图2.15所示。 @Override protected void onCreate(Bundle savedInstanceState) { super . onCreate(savedInstanceState); setContentView(R. layout. second_ layout) ; } 另外不要忘记,任何-一个活动都是需要在AndroidManifest.xml 中注册的,不过幸运的是, Android Studio已经帮我们自动完成了,你可以打开AndroidManifest.xml瞧- -瞧: <application android: allowBackup=“true” android: icon="@mipmap/ic_ launcher" android: label="@string/app_ name " android: supportsRtl=“true android: theme=”@style/AppTheme"> 结果如下
相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪-个活动, 而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent, 并帮我们找出合适的活动去启动。 什么叫作合适的活动呢?简单来说就是可以响应我们这个隐式Intent的活动,那么目前 SecondActivity可以响应什么样的隐式Intent 呢?额,现在好像还什么都响应不了,不过很快就 会有了。 通过在标签下配置<intent . filter>的内容,可以指定当前活动能够响应的 action和category,打开AndroidManifest.xml,添加如下代码: <category android: name="android . intent . category . DEFAULT”1> 在标签中我们指明了当前活动可以响应com. example . activitytest . ACTION_ START这个action,而标签 则包含了- -些附加信息,更精确地指明了当前的活动能 够响应的Intent中还可能带有的category。只有和中的内容同时能够匹配 上Intent中指定的action和category时,这个活动才能响应该Intent。 修改FirstActivity中按钮的点击事件,代码如下所示: button1. setOnClickListener(new View. OnClickListener() { @0verride public void onCLick(View v) { Intent intent = new Intent(“com. example. activitytest .ACTION_ START”); startActivity(intent); });
LinearLayout又称作线性布局,是- -种非常常用的布局。正如它的名字所描述的一样,这个 布局会将它所包含的控件在线性方向上依次排列。相信你之前也已经注意到了,我们在上一节中 学习控件用法时,所有的控件就都是放在LinearLayout布局里的,因此上一节中的控件也确实是 在垂直方向上线性排列的。 3.3详解4种基本布局 95 的呢?这是由于我们通过android:orientation属性指定了排列方向是vertical,如果指定的是 horizontal,控件就会在水平方向上排列了。下面我们通过实战来体会一下, 修改activity main.xml 中的代码,如下所示: <LinearLayout xmIns: android=" http://schemas . android . com/apk/ res/ android" android; orientation= “vertical” android: layout width=“match_ parent” android: layout_ height=" match_ parent"> <Button androld: 1d="@+ 1d/button1" android; layout, width= “wrap_ content” android; layout_ height= " wrap content" android:text= “Button 1” 1> <Button androld: 1d="@+1d/button2" androld:layout widthe"wrap_ content " andro1d:’ layout. height “wrap content” android:textu “Button 2” 1> <Button androld: 1d="@+1d/button3" andro1d:layout. width= “wrap_ content” androld; Layout height=“wrap_ content” android:textu"Button 3" 1> 结果: