了解Android
[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的触发点,正好界面有这个按钮,那我们就让这个点击按钮时出现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
使用显示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,隐式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>
结果: