Android应用程序基础

来源:互联网 发布:ripper算法是什么 编辑:程序博客网 时间:2024/05/19 03:44

一、基础介绍

Android应用程序是使用Java编写的,使用Android SDK工具将应用程序数据和资源打包成一个apk文件,即可在Android设备上安装运行。

每一个Android应用程序都运行在它自己的安全沙盒里:
    • Android系统是一个多用户的Linux系统,每个应用程序都是一个不同的用户;
    • 默认情况下,系统的每个应用程序分配一个独一无二的Linux用户ID(ID仅仅被系统所用,对应用程序是未知的)。系统为一个应用程序中所有的文件设置权限,因此只有使用分配给该应用程序的用户ID才可以访问它们;
    • 每个仅此都有他自己的虚拟机VM,应用程序之间的运行是相互隔离的;
    • 默认情况下,每个应用程序都运行在自己的Linux进程。当需要执行任何应用程序组件时,Android启动进程,当系统不再需要或者必须为其他应用程序回收内存的时候,关闭进程。
以上设计原则实现了“最小特权原则”。

注意:只有应用程序拥有相应的权限,才能访问设备数据信息。

二、应用程序组件


每个组件都是系统进入一个应用程序的不同的切入点,并不是所有的组件都是用户实际的入口点,其中一些还相互依赖。但是每一个组件都有自己的实体并扮演了一个特定的角色——每个组件都是帮助定义应用程序的整体行为的是一个特有的功能块。

1、Activities

一个Activity就代表了一个单独的用户界面。

通过继承Activity类来实现。

2、Services

Service组件,就是在后台运行执行耗时操作,或者执行远程进程工作的,没有用户界面。

通过继承Service类来实现。

3、Content providers

一个Content provider管理着一个共享的应用程序数据集合。可以将数据存储在文件系统,SQLite数据库,网络,或者其他的持久存储位置上,Content providers也可以用来读写私有的应用程序数据。

通过继承ContentProvider类来实现,并且必须实现一系列允许其他应用程序执行事务的API集合。

Content Provider旨在给其他应用程序访问自己的应用程序数据的统一接口。

4、Broadcast receivers

Broadcast Receiver是一个响应整个系统的广播公告的组件。

不显示在用户界面上,但可以通过创建状态栏通知来广播事件。

通过继承BroadcastReceiver类实现,并且每一个广播都会交付一个Intent对象。



Android系统设计的一个独特的方面,就是任何程序都可以启动其他应用程序的组件,这极大地减轻了用户的工作。

当系统启动一个组件时,会启动那个应用程序服务的进程并实例化该组件需要的类。因此Android应用程序没有单一的入口点,也就是没有main函数。

由于系统中的每一个Android应用程序都运行在一个独立的进程中,而且对文件设定了访问权限,限制了其他应用程序的访问,所以,一个应用程序不能直接激活另外一个应用程序的组件,但是,我们可以通过发送一个Intent给系统,我们可以指定这个Intent去启动一个特定的组件,这样系统就为我们激活了这个组件。

激活组件

Activities,Services,BroadcastReceivers都是通过一个叫做Intent的异步的消息来激活的。Intent(可以将它想象成一个请求其他组件的动作的使者)在运行时绑定了一个单独的组件(可以是本应用程序的,也可以使其他应用程序的)。

ContentProvider不是通过Intent激活的,而是当一个来自ContentResolver的请求命中目标时被激活。
  • 可以通过startActivity()或者startActivityForResult()传递一个Intent来启动Activity。
  • 可以通过startService()或者bindService()传递一个Intent来启动Service。
  • 可以通过sendBroadcast(), sendOrderedBroadcast(), 或sendStickyBroadcast()传递一个Intent来发起一个Broadcast。
  • 可以调用ContentResolver的query()方法来实现ContentProvider的查询。

三、Manifest文件


在系统启动应用程序组件之前,系统是通过AndroidManifest.xml文件来判断组件是否存在。所有应用程序组件必须事先在manifest文件里声明,这个文件是存放在应用程序工程的根目录下。

除了声明组件之外,manifest还需要做下面一些事情:

  • 确定应用程序需要的用户权限,如互联网访问或读取访问用户的联系人权限等。
  • 基于API应用程序使用的APIs,声明应用程序所需的最低API级别。
  • 声明应用程序使用或者需要的硬件和软件功能,如相机,蓝牙服务,或者一个多点触控屏幕。
  • 应用程序需要的链接到的API库,比如Google Maps 库。

1、声明组件


manifest文件的主要任务是通知系统关于应用程序组件的信息,比如,在AndroidManifest.xml是这样声明一个Activity的:

<?xml version="1.0" encoding="utf-8"?><manifest ... >    <application android:icon="@drawable/app_icon.png" ... >        <activity android:name="com.example.project.ExampleActivity"                  android:label="@string/example_label" ... >        </activity>        ...    </application></manifest>

<application>中, android:icon 属性指定了应用程序的图标;android:label 属性指定了显示给用户的应用程序的名字;

<activity>中, android:name 属性指定了全路径描述的类名;android:label 属性指定了显示给用户的应用程序的名字

声明activities使用<activity>声明services使用<service>; 声明broadcast receivers使用<receiver>;声明content providers使用<provider>。

包含在代码中的Activities,Services和content providers,如 果没有在manifest文件中声明,则对于系统来说它们是不可见的,因此不能运行。但是broadcast receivers既可以在manifest中声明,也可以动态地在代码中(作为BroadcastReceiver的对象)创建,通过调用registerReceiver()方法来注册。

2、声明组件功能


上面已经提到过,系统是使用Intent来激活组件的。在Intent中,一个很重要的概念便是Intent Actions。使用Intent actions,可以简单地描述想要执行的动作类型(也可指定这个动作的数据),这样就让系统在设备中寻找可以执行这个动作的组件,然后启动执行;如果存在多个可执行该动作的组件,这就由用户来决定使用哪个组件。

系统是通过比较Intent在manifest文件中或设备中其他应用程序上接收到的Intent filters,来确定哪些组件能够响应这个Intent的。所以,当我们在manifest中声明组件时,我们可以选择性地添加一些包含特定功能的Intent filters,这样这个组件就能够响应其他应用程序的Intent了,我们只需在声明组件的时候,添加一个 <intent-filter> 子节点就可以实现

3、声明应用程序需求

不同的设备有不同的特性和功能,为了避免应用程序安装在了缺乏它所需特性和功能的设备上,这就需要在manifest文件中清楚地定义一些应用程序所需特性的配置信息。当然,这大部分声明仅仅是一些信息,系统不会去读取,但是Google Play服务会去读取这些信息,这些信息对于发布应用到Google Play上非常重要

虽然这些特性系统不检查,但是我们在设计开发的时候应该考虑这些因素:

屏幕尺寸(small,normal,large,extra large)和密度(low,medium,high,extra high density),可以在manifest中使用 <supports-screens> 来进行配置;

输入配置,由于有各式各样的输入硬件,可以在manifest中使用 <uses-configuration> 来进行配置;

设备特性,比如相机,传感器,蓝牙等,可以在manifest中使用  <uses-feature>  来进行配置;

Android平台版本,不同版本有它独有的特性,我们可以manifest中使用 <uses-sdk>  来进行配置相应的API级别.

三、应用程序资源

Android应用程序除了源代码之外,还有图片,音频,视频,可以定义动画,菜单,风格,颜色,界面布局等等。存放在工程的res目录下。

原创粉丝点击