Android系统是什么?

Android系统是目前世界上市场占有率最高的移动操作系统,不管你在哪里,都可以看到android手机几乎无处不在。

1. Android系统架构?

Android大致可以分为四层架构:Linuxn内核层、系统运行库层、应用框架层和应用层。

  • Linux内核层

Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、电源管理等等。

  • 系统运行库层

这一层通过一些C/C++库来为Android系统提供了主要的特性支持,如SQLite库提供了数据库的支持,OpenGL提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等等。

  • 应用框架层

这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用这些API来构建自己的应用程序。

  • 应用层

所有安装在手机上的应用程序都是属于这一层的,如系统自带的联系人、短信等程序或者你从应用商店下载的程序。

如下图所示:

 2.Android应用开发特色

Android系统到底提供了哪些东西,可供我们开发出优秀的应用程序呢?

  • 四大组件

Android 系统四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。其中活动是所有 Android 应用程序的门面, 凡是在应用中你看得到的东西,都是放在活动中的。而服务就比较低调了,你无法看到 它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然是可以继续运行的。 广播接收器可以允许你的应用接收来自各处的广播消息,比如电话、短信等,当然你的 应用同样也可以向外发出广播消息。内容提供器则为应用程序之间共享数据提供了可 能,比如你想要读取系统电话簿中的联系人,就需要通过内容提供器来实现。 

  • 丰富的系统控件
Android 系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。当然如果你品味比较高,不满足于系统自带的控件效果,也完全可以定制属于 自己的控件。
  • SQLite数据库
Android 系统还自带了这种轻量级、运算速度极快的嵌入式关系型数据库。它不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作,让存储和读取数据 变得非常方便
  • 强大的多媒体
Android 系统还提供了丰富的多媒体服务,如音乐、视频、录音、拍照、闹铃等等, 这一切你都可以在程序中通过代码进行控制,让你的应用变得更加丰富多彩。
  • 地理位置定位
移动设备和 PC 相比起来,地理位置定位功能应该可以算是很大的一个亮点。现在 的 Android 手机都内置有 GPS,走到哪儿都可以定位到自己的位置,发挥你的想象就可 以做出创意十足的应用,如果再结合上功能强大的地图功能,LBS 这一领域潜力无限。
  • 传感器
Android 手机中都会内置多种传感器,如加速度传感器、方向传感器等,这也算是 移动设备的一大特点。通过灵活地使用这些传感器,你可以做出很多在 PC 上根本无法 实现的应用。
 
3.分析你的第一个 Android 程序
  • src/java
毫无疑问,src 目录是放置我们所有 Java 代码的地方,它在这里的含义和普通 Java项目下的 src 目录是完全一样的,展开之后你将看到我们刚才创建的 HelloWorldActivity 文件就在里面。
  • src/res
这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布 局、字符串等资源都要存放在这个目录下,前面提到的 R.java 中的内容也是根据这个目 录下的文件自动生成的。当然这个目录下还有很多的子目录,图片放在 drawable 目录下, 布局放在 layout 目录下,字符串放在 values 目录下,所以你不用担心会把整个 res 目录 弄得乱糟糟的。
  • AndroidManifest.xml

这是你整个 Android 项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。由于这个文件以后会经常用到,我们 用到的时候再做详细说明。

接下来我们一起分析一下 HelloWorld 项目究竟是怎么运行起来的吧。首先打开 AndroidManifest.xml 文件,从中可以找到如下代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.my_applation">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.My_Applation">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
这段代码表示对 MainActivity 这个活动进行注册,没有在 AndroidManifest.xml 里 注册的activity是不能使用的。其中 intent-filter 里的两行代码非常重要,<action android:name= "android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" /> 表示 MainActivity 是这个项目的主activity,在手机上点击应用图标,首先启动的就是这 个活动。
那 MainActivity 具体又有什么作用呢?我在介绍 Android 四大组件的时候说过,activity是 Android 应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此你在图 1.15 中看到的界面,其实就是 MainActivity 这个Activity 。那我们快去看一下它的 代码吧,打开MainActivity,代码如下所示:
package com.example.my_applation;import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
首先我们可以看到,MainActivity 是继承自 Activity 的。Activity 是 Android 系统提 供的一个活动基类,我们项目中所有的活动都必须要继承它才能拥有活动的特性。onCreate()方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有 Hello world!的字样。那么图中显示的 Hello world! 是在哪里定义的呢?
 
其实Android 程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的, 更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。你可以看到,在 onCreate()方法的第二行调用了 setContentView()方法,就是这个方法给当前的活动引入了一 个 activity_main布局,那 Hello world!一定就是在这里定义的了!我们快打开这个文件看一看。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
你现在只需要看到上面代码 中有一个 TextView,这是 Android 系统提供的一个控件,用于在布局中显示文字的。然后你 终于在 TextView 中看到了 hello world 的字样,哈哈终于找到了,原来就是通过 android:text= "@string/hello_world"这句代码定义的!咦?感觉不对劲啊,好像图 1.15 中显示的是 Hello world!,这感叹号怎么没了,大小写也不太一样。其实你还是被欺骗了,真正的 Hello world!字符串也不是在布局文件中定义的。Android 不推荐在程序中对字符串进行硬编码,更好的做法一般是把字符串定义在 res/values/strings.xml 里,然后可以在布局文件或代码中引用。那我们现在打开 strings.xml 看 一下,里面的内容如下:
<resources>
    <string name="app_name">My_Applation</string>
    <string name="hello_world">Hello world!</string>
</resources>
这下没有什么再能逃出你的法眼了,Hello world!字符串就是定义在这个文件里的。并且 字符串的定义都是使用键值对的形式,Hello world!值对应了一个叫做 hello_world 的键,因此 在 hello_world_layout.xml 布局文件中就是通过引用了 hello_world 这个键,才找到了相应的值。这个时候我无意中瞄到了这个文件中还有一个叫做 app_name 的键。你猜对了,我们还 可以在这里通过修改 app_name 对应的值,来改变此应用程序的名称。那到底是哪里引用了 app_name 这个键呢?打开 AndroidManifest.xml 文件自己找找去吧!
 
4.详解项目中的资源

看到这么多的文件夹不用害怕,其实归纳一下,res 目录就变得非常简单了。所有以 drawable 开头的文件夹都是用来放图片的,所有以 values 开头的文件夹都是用来放字符串的, layout 文件夹是用来放布局文件的,menu 文件夹是用来放菜单文件的。怎么样,是不是突然 感觉清晰了很多?之所以有这么多 drawable 开头的文件夹,其实主要是为了让程序能够兼容更多的设备。在制作程序的时候最好能够给同一张图片提供几个不同分辨率的副本,分别放 在这些文件夹下,然后当程序运行的时候会自动根据当前运行设备分辨率的高低选择加载哪 个文件夹下的图片。当然这只是理想情况,更多的时候美工只会提供给我们一份图片,这时你就把所有图片都放在 drawable-hdpi 文件夹下就好了。

知道了 res 目录下每个文件夹的含义,我们再来看一下如何去使用这些资源吧。比如刚 刚在 strings.xml 中找到的 Hello world!字符串,我们有两种方式可以引用它:

  1. 在代码中通过 R.string.hello_world 可以获得该字符串的引用;

  2. 在 XML 中通过@string/hello_world 可以获得该字符串的引用。

基本的语法就是上面两种方式,其中 string 部分是可以替换的,如果是引用的图片资源就可以替换成 drawable,如果是引用的布局文件就可以替换成 layout,以此类推。 HelloWorld 项目的图标就是在 AndroidManifest.xml 中通过 android:icon="@drawable/ic_launcher"来指定的,ic_launcher 这张图片就在 drawable 文件夹下, 如果想要修改项目的图标应该知道怎么办了吧? 

5.使用 Android 的日志工具 Log 

Android 中的日志工具类是 Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志。

(1)Log.v()

这个方法用于打印那些最为琐碎的,意义最小的日志信息。对应级别 verbose,是Android 日志里面级别最低的一种。

(2)Log.d()

这个方法用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助 的。对应级别 debug,比 verbose 高一级。

(3)Log.i()

这个方法用于打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮 你分析用户行为的那种。对应级别 info,比 debug 高一级。

(4)Log.w()

这个方法用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好 去修复一下这些出现警告的地方。对应级别 warn,比 info 高一级。

(5)Log.e()

这个方法用于打印程序中的错误信息,比如程序进入到了 catch 语句当中。当有错 误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级 别 error,比 warn 高一级。 其实很简单,一共就五个方法,当然每个方法还会有不同的重载,但那对你来说肯定不是什么难理解的地方了。我们现在就在 HelloWorld 项目中试一试日志工具好不好用吧。 打开 HelloWorldActivity,在 onCreate()方法中添加一行打印日志的语句,如下所示:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_world_layout);
        Log.d("HelloWorldActivity", "onCreate execute");

}

Log.d 方法中传入了两个参数,第一个参数是 tag,一般传入当前的类名就好,主要用于 对打印信息进行过滤。第二个参数是 msg,即想要打印的具体的内容。 

现在可以重新运行一下 HelloWorld 这个项目了,仍然是右击 HelloWorld 项目→Run As →Android Application。等程序运行完毕,可以看到 LogCat 中打印信息。   

posted on 2021-07-09 15:29  夜尽天明00  阅读(102)  评论(0编辑  收藏  举报