Android开发系列_手把手开发APP_002_Android四大件

我们拿到一部安卓手机。想想原理。
1.手机由硬件+软件构成。
2.手机软件:
系统软件由谷歌+手机厂商提供
应用软件由开发者提供
3.系统软件:
linux内核+谷歌皮肤。
linux可以执行二进制文件。
Android最初应用默认使用Java开发,Java-> .class,交给虚拟机运行。
Android为了兼容老式设备,必须要提供高性能的虚拟机。
Android打通软件市场,为了提高系统竞争力,需要做优化。Java语言达不到效率最高,C++是面向对象的,编译后可以得到二进制。C++就被加入进来了。
4.Android=linux kernel + 应用层API。
5.应用层API设计的时候,时时刻刻关注内核。因此linux的一些特性Android必定支持。
6.linux支持多用户,最典型的。
每个 Android 应用都处于各自的安全沙盒中。
7.Android 应用的应用ID.
8.Android 应用运行在单独的VM线程中。
9.linux中sam创建的文件会盖上sam的时间戳。tom不可以访问。
不过可以appA.id = appB.id = 1使A,B可以交换数据。
10.Android中的数据结构:

  • Activity
  • Service
  • Brocast Receive
  • Content Provider

重点关注用途&生命周期

Activity 是与用户交互的入口点
它表示拥有界面的单个屏幕
怎样让B activity和A activity同时运行?
点击A的button,B跳出来,但并没有完全遮住A的内容。
Activity 有助于完成系统和应用程序之间的以下重要交互:
追踪屏幕上显示的内容,以确保系统继续运行托管 Activity 的进程。这是个回调函数。
Service是一个通用入口点
因各种原因使应用在后台保持运行状态
它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。
它是守护进程。
服务不提供界面。
Service是在应用失焦后,使APP后台处理任务的一种结构。
eg:音乐播放
BroadCast Receiver
借助广播接收器,系统可以向任何应用传递消息。
这里的任何应用也可以指没有运行的应用。
eg:调度提醒来发布通知,以告知用户即将发生的事件。
eg2:屏幕关闭,系统像游戏应用传递消息,游戏应用切换会阻塞状态。
eg3:电池电量<20%,系统提醒,同时调节屏幕亮度。
ContentProvider
管理共享的应用数据。
这些数据的来源可以是:File System、SQLite、网络...
应用可通过这个数据结构来获取本机数据,包括自己的和别人的。
思考?内容提供者的level是什么?
内容提供者不等同与数据库。相反,应用只有通过它才可以获取应用的所有数据,它应该作为View空间初始化结束后第一该初始化的类。
而Android系统也正是这样。通过R.id.XXX来获取资源,称作URI,找寻Content provider内置的数据项。
现在,我打开QQ。
Activity类被实例化。QQ被VM隔离,与其他APP保持安全举例,如微信。
当启动QQ时,会出现欢迎界面。显示QQ的版本号并启动service。update service...
我向朋友发送照片,我打开相机,此时,相机的activity被运行在它的VM中。
QQ进程回到继续态,相机Activity获得焦点,在CPU中运行。
当拍照好了之后,通过ContentProvider来获取拍好的照片,你觉得可以,就点击发送。此时经过udp的协议,
qq的服务器收到了你的消息,qq的服务器解码,查出你好友的qq客户端的ip和端口,并发送。
你好友恰好也用安卓手机。
他的手机qq的会发送broadcast,系统组件显示qq发来了新的消息。
回想细节:qq客户端使用相机,是两个APP.
qq通过像系统申请,使系统启动另一个组件。
明白这点将是下面的重点.

11.启动组件

在四种组件类型中,有三种(Activity、服务和广播接收器)均通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。。

intent就是信使。APP a想呼叫APP b,通过Intent对象。

您需使用 Intent 对象创建 Intent,该对象通过定义消息来启动特定组件(显式 Intent)或特定的组件类型(隐式 Intent)。

对于 Activity 和服务,Intent 会定义要执行的操作(例如,查看或发送某内容),并且可指定待操作数据的 URI,以及正在启动的组件可能需要了解的信息。例如,Intent 可能会传达对 Activity 的请求,以便显示图像或打开网页。在某些情况下,您可以通过启动 Activity 来接收结果,这样 Activity 还会返回 Intent 中的结果。例如,您可以发出一个 Intent,让用户选取某位联系人并将其返回给您。返回 Intent 包含指向所选联系人的 URI。

对于广播接收器,Intent 只会定义待广播的通知。例如,指示设备电池电量不足的广播只包含指示“电池电量不足”的已知操作字符串。

与 Activity、服务和广播接收器不同,内容提供程序并非由 Intent 启动。相反,它们会在成为 ContentResolver 的请求目标时启动。内容解析程序会通过内容提供程序处理所有直接事务,因此通过提供程序执行事务的组件便无需执行事务,而是改为在 ContentResolver 对象上调用方法。这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。

  • 如要启动 Activity,您可以向 startActivity() 或 startActivityForResult() 传递 Intent(当您想让 Activity 返回结果时),或者为其安排新任务。
  • 在 Android 5.0(API 级别 21)及更高版本中,您可以使用 JobScheduler 类来调度操作。对于早期 Android 版本,您可以通过向 startService() 传递 Intent 来启动服务(或对执行中的服务下达新指令)。您也可通过向将 bindService() 传递 Intent 来绑定到该服务。
  • 您可以通过向 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播。
  • 您可以通过在 ContentResolver 上调用 query(),对内容提供程序执行查询。
    12.在 Android 系统启动应用组件之前,系统必须通过读取应用的清单文件 (AndroidManifest.xml) 确认组件存在
    除了声明应用的组件外,清单文件还有许多其他作用,如:
  • 确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限。
  • 根据应用使用的 API,声明应用所需的最低 API 级别
  • 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务多点触摸屏幕
  • 声明应用需要链接的 API 库(Android 框架 API 除外),如 Google 地图库。
    13.在androidmanifest.xml中声明组件:
<?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>

android:name 属性指定 Activity 子类的完全限定类名,
android:label 属性指定用作 Activity 的用户可见标签的字符串
android:icon 属性指向标识应用的图标所对应的资源。
14.在androidmanifest.xml中声明组件:

  • Activity 的 元素。
  • 服务的 元素。
  • 广播接收器的 元素。
  • 内容提供程序的 元素。

如果未在清单文件中声明源代码中包含的 Activity、服务和内容提供程序,则这些组件对系统不可见,因此也永远不会运行
不过,您可以 BroadcastReceiver 对象的形式,在清单中声明或在代码中动态创建广播接收器;以及通过调用 registerReceiver(),在系统中注册广播接收器。
15.声明组件功能
如上文启动组件中所述,您可以使用 Intent 来启动 Activity、服务和广播接收器。
您可以通过在 Intent 中显式命名目标组件(使用组件类名)来使用 Intent。
您还可使用隐式 Intent,通过它来描述要执行的操作类型和待操作数据(可选)。
借助隐式 Intent,系统能够在设备上找到可执行该操作的组件,并启动该组件。如果有多个组件可以执行 Intent 所描述的操作,则由用户选择使用哪一个组件

注意:如果您使用 Intent 来启动 Service,请使用显式 Intent 来确保应用的安全性。使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会抛出异常。请勿为您的服务声明 Intent 过滤器。

通过将收到的 Intent 与设备上其他应用的清单文件中提供的 Intent 过滤器进行比较,系统便可识别能响应 Intent 的组件。

在应用的清单文件中声明 Activity 时,您可以选择性地加入声明 Activity 功能的 Intent 过滤器,以便响应来自其他应用的 Intent。
您可以将 元素作为组件声明元素的子项进行添加,从而为您的组件声明 Intent 过滤器。

例如,如果您构建的电子邮件应用包含用于撰写新电子邮件的 Activity,则可通过声明 Intent 过滤器来响应“send”Intent(目的是发送新电子邮件),如下方示例所示:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

如果另一个应用创建包含 ACTION_SEND 操作的 Intent 并将其传递到 startActivity(),则系统可能会启动您的 Activity,以便用户能够草拟并发送电子邮件。

如需了解有关创建 Intent 过滤器的详细信息,请参阅 Intent 和 Intent 过滤器文档。
16.声明应用要求
Android 设备多种多样,但并非所有设备都提供相同的特性和功能。以防将您的应用安装在缺少应用所需特性的设备上,您必须通过在清单文件中声明设备和软件要求,为该应用支持的设备类型明确定义一个配置文件。
其中的大多数声明只是为了提供信息,系统并不会读取它们,但 Google Play 等外部服务会读取它们,以便在用户通过其设备搜索应用时为用户提供过滤功能
例如,如果您的应用需要相机功能,并使用 Android 2.1(API 级别 7)中引入的 API,您必须在清单文件中声明以下要求,如下方示例所示:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
</manifest>

通过示例中所述的声明,没有相机且 Android 版本低于 2.1 的设备将无法从 Google Play 安装您的应用。不过,您可以声明您的应用使用相机,但并不要求必须使用。在此情况下,您的应用必须将 required 属性设置为 false,并在运行时检查设备是否拥有相机,然后根据需要停用任何相机功能
也就是说不想在声明文件中声明硬件必须的条件,为了不让你的应用出bug,你得自己做代码的判断。
16.应用资源
Android 应用并非仅包含代码,它还需要与源代码分离的资源,如图像音频文件以及任何与应用的视觉呈现有关的内容。例如,您可以通过 XML 文件定义 Activity 界面的动画、菜单、样式、颜色和布局。借助应用资源,您无需修改代码即可轻松更新应用的各种特性。通过提供备用资源集,您可以针对各种设备配置(如不同的语言和屏幕尺寸)优化您的应用。

对于您在 Android 项目中加入的每一项资源,SDK 构建工具均会定义唯一的整型 ID,您可以利用此 ID 来引用资源,这些资源或来自应用代码,或来自 XML 中定义的其他资源。例如,如果您的应用包含名为 logo.png 的图像文件(保存在 res/drawable/ 目录中),则 SDK 工具会生成名为 R.drawable.logo 的资源 ID。此 ID 映射到应用特定的整型数,您可以利用它来引用该图像,并将其插入您的界面。
Android为应用建立了资源索引表。
是唯一的、整型的。

发布了174 篇原创文章 · 获赞 28 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u010563350/article/details/104499287