1、沙箱机制
Android操作系统是一种多用户Linux系统,系统会为每个应用分配一个唯一的Linux用户ID,再为应用中的所有文件设置权限,使得只有拥有这个ID的应用才能访问这些文件。
每个进程都有自己的VM环境,每个应用都在自己的进程中执行,与其他应用进行隔离。默认情况下,每个应用都只能访问执行其工作所需的组件,而不能访问其他组件。
可以安排两个应用共享同一个Linux用户ID。在这种情况下,他们能够互相访问彼此的文件。
2、应用组件
应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相互依赖,但每个组件都以独立实体形式存在,并发挥特定作用 — 每个组件都是唯一的构建基块,有助于定义应用的总体行为。共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。
- Activity:表示具有用户界面的单一屏幕。最常用的。
- Service:服务。是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面。使用场景不多,一般有音乐服务等。
- ContentProvider:内容提供程序管理一组共享的应用数据。可以将数据存储在文件系统、SQLite 数据库、网络上或应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供程序查询数据,甚至修改数据(如果内容提供程序允许)。
- BroadcastReceiver:广播接收器是一种用于响应系统范围广播通知的组件。
任何应用都可以启动其他应用的组件(隐式启动)。
当系统启动某个组件时,会启动该应用的进程(如果尚未运行),并实例化该组件所需的类。
Android应用没有单一的入口点,比如没有main()函数。
启动组件
Activity,Service,BroadcastRecevier通过Intent进行启动,可以将各个组件进行相互绑定,包括其他应用的组件。Intent定义了用于启动特定组件或者特定类型的组件,可以是显示的,也可以是隐式的。
ContentProvide不会被Intent启动.会在成为 ContentResolver 的请求目标时启动。 内容解析程序通过内容提供程序处理所有直接事务,使得通过提供程序执行事务的组件可以无需执行事务,而是改为在 ContentResolver 对象上调用方法。 这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。
- Activity:可以通过Intent传递到startAcivity()或者startActivityForResult()来启动。
- Service:可以通过Intent传递到startService或者bindService()来启动或者绑定该服务。
- BroadcastReceiver:可以将Intent传递到sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast()来发起广播。
- ContentProvider:调用query()对内容提供程序执行查询。
3、AndroidManifest.xml文件
系统启动应用组件之前,必须通过读取应用的AndroidManifest.xml文件确定组件存在(BroadcastReceiver可以在AndroidManifest.xml文件声明,也可以在代码中动态创建并通过调用 registerReceiver() 在系统中注册。)。组件必须在文件中申明,文件必须存在项目的的根目录中。
声明组件的功能
通过在AndroidManifest.xml文件中为组件设置一些Intent-filter下的规则,隐式启动时,遍历手机中所有的组件,寻找符合规则的进行启动,如果存在多个结果,则弹出弹框,让用户自己选择。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.zhangchao.test">
<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/AppTheme">
<!--应用的入口activity-->
<activity android:name=".MainActivity">
<!--过滤规则,可以有其他的规则-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--声明一个MyActivity-->
<activity android:name=".MyActivity"/>
<!--声明一个MyService-->
<service android:name=".MyService"/>
<!--声明一个BroadcastReceiver-->
<receiver android:name=".MyBroadcastReceiver"/>
<!--声明一个ContentProvider,authorities是指定的uri,name是Android指定的类-->
<provider
android:authorities=""
android:name=""/>
</application>
<!--申请获得访问网络的权限-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
4、应用资源
应用资源是指应用中与源代码分离的资源,如图像、音频文件以及任何与应用的视觉呈现有关的内容。在Android项目中的每一项资源,SDK构建工具都会定义一个唯一的整形ID,可以通过ID对资源进行应用。提供与源代码分离的资源的其中一个最重要优点在于,您可以提供针对不同设备配置的备用资源。
项目res/目录下支持的资源目录
目录 | 资源类型 |
---|---|
animator/ | 定义属性动画的xml文件 |
anim/ | 定义渐变动画的XML文件 |
color/ | 定义颜色状态列表的XML文件 |
drawable/ | 位图文件(.png、.9.png、.jpg、.gif) |
values/ | 包含字符串、整型数和颜色等简单值的 XML 文件。 |
mipmap/ | 适用于不同启动器图标密度的可绘制对象文件。 |
layout/ | 用于定义用户界面布局的XML文件 |
menu/ | 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。 |
raw/ | 要以原始形式保存的任意文件,要以原始的InputStream打开这些资源 |
xml/ | 可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处 |
values/目录下的资源
其他 res/ 子目录中的 XML 资源文件是根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件,<resources> 元素的每个子元素均定义一个资源。例如,<string> 元素创建 R.string 资源,<color> 元素创建 R.color 资源。
目录 | 资源类型 |
---|---|
arrays.xml | 用于资源数组(类型化数组) |
color.xml | 颜色值 |
dimens.xml | 尺寸值 |
string.xml | 字符串值 |
styles.xml | 样式 |
网友评论