Android 应用基础

android应用基础

原文地址:https://developer.android.com/guide/components/fundamentals.html

通常android应用使用java语言编写。android SDK会将你的代码和资源文件编译为一个后缀名为.apk的APK压缩文件。 APK文件包含android应用的所有内容,他是android设备安装应用的文件。
一旦app安装到android设备,每一个app都在运行在自己的安全沙盒内:

Android系统可以通过这种方式实现最小权限原则。也就是说,默认情况下,每个应用只能访问执行其工作所需的组件,而不能访问其他组件。 这样便营造出一个非常安全的环境,在这个环境中,应用无法访问系统中其未获得权限的部分。 不过,应用仍然可以通过一些途径与其他应用共享数据及访问系统服务:

应用组件

应用组件是android应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户实际入口点,有些组件相互依赖,但每个组件都一独立实体形式存在,并发挥特定作用。每个组件都是唯一的构建基块,有助于定义应用的总体行为。 共有四种不同的应用组件类型。每种类型都服务与不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。
这四种应用组件是:activitiesServicesContent providers、 Broadcast receivers

启动组件

四种组件类型种的三种:Activity、Service和Broadcast receiver通过名为Intent的异步消息进行启动。 Intent会在运行时将各个组件相互绑定(您可以将Intent看做从其他组件请求操作的信使),无论组件属于您的应用还是其他应用。
Intent可以显式声明,也可以隐式声明。隐式Intent的作用无非是描述要执行的操作类型(还可选择描述您想执行的操作所针对的数据), 让系统能够在设备上找到科执行该操作的组件,并启动该组件。 如果有多个组件可以执行Intent所描述的操作,则由用户选择使用哪一个组件。
如果触发了一个intent,而没有任何一个app会去接收这个intent,则app会crash。 所以在发送隐式intent时请对 Intent 对象调用 resolveActivity(),如果结果为非空,则至少有一个应用能够处理该 Intent,且可以安全调用;否则不应使用该 Intent。如:

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

或在发送隐式intent时需要执行queryIntentActivities()来获取到能够接收这个intent的所有activity的list。只有返回的list非空,我们才可以安全的使用这intent。如:

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

每种类型的组件有不同的启动方法:

如需了解有关 Intent 用法的详细信息,请参阅Intent 和 Intent 过滤器文档。 以下文档中还提供了有关启动特定组件的详细信息: Activity服务BroadcastReceiver内容提供程序

清单文件

在android系统启动应用前,系统必须通过读取应用的AndroidManifest.xml文件(“清单”文件)确认组件存在。您的应用必须在此文件中声明其所有组件,该文件必须位于应用项目的根目录中。
除了声明应用的组件,清单文件还有其他作用:

您必须通过以下方式声明所有应用组件:

您包括在源代码中和高,但未在清单文件中声明的Activity、服务和内容提供程序对系统不可见,因此也永远不会运行。 不过,广播接收器可以在清单文件中声明或在代码中动态创建(如Broadcast对象)并通过调用registerReceiver()在系统中注册。 构建清单文件的详细信息,请参阅AndroidManifest.xml文件文档。

Table of Contents