(Microsoft Word - Android??\253\374\253n\244\244\244\345\252\251.doc)

Size: px
Start display at page:

Download "(Microsoft Word - Android??\253\374\253n\244\244\244\345\252\251.doc)"

Transcription

1 Android 开发指南中文版 - 应用程序框架 iefreer@hotmail.com 2009/9/10 个人主页 : 本文是对 Android SDK1.5 版的英文开发资料 Android Development Guide 一文应用程序框架部分的翻译, 覆盖了 Android 应用开发所有主要的概念 部分内容整理自网络 本文仅用于技术学习, 请勿用于商业用途

2 目录 应用程序基础 应用程序基础 Application Fundamentals...4 关键类...4 应用程序组件...5 激活组件 :intent...7 关闭组件...7 manifest 文件...8 Intent 过滤器...9 Activity 和任务...10 Affinity( 吸引力 ) 和新任务...11 加载模式...12 清理堆栈...13 启动任务...14 进程和线程...14 进程...14 线程...15 远程过程调用...15 线程安全方法...16 组件生命周期...17 Activity 生命周期...17 调用父类...17 服务生命周期...20 广播接收器生命周期...22

3 进程与生命周期...22 用户界面 用户界面 User Interface...23 视图层次 视图层次 View Hierarchy...24 布局 布局 Layout...24 部件 部件 Widgets...25 用户界面事件 用户界面事件 UI Events...26 菜单 菜单 Menus...26 高级话题 高级话题 Advanced Topics...27 适配器 适配器 Adapter...27 风格与主题 风格与主题 Styles and Themes...27 资源和资产 资源和资产 Resources and Assets...27 资源引用 资源引用 Resource Reference...43 国际化和本地化 国际化和本地化 Internationalization and Localization...43 意图和意图过滤器 意图和意图过滤器 Intents and Intent Filters...43 意图过滤器 意图过滤器 Intent filters...47 通常情况 通常情况 Common cases...51 使用意图匹配 使用意图匹配 Using intent matching...52 数据存储 数据存储 Data Storage...52 概览 概览 Storage quickview...52 系统偏好 : 快速, 轻量级存储...52 文件 : 存储到设备内部或可移动闪存...52 数据库 : 任意的结构化存储...52 支持基于网络的存储...52 系统偏好 系统偏好 Preferences...53 文件 文件 Files...54

4 数据库 数据库 Databases...54 网络 网络 Network...55 内容提供器 内容提供器 Content Providers...55 内容提供器的基础知识 内容提供器的基础知识 Content Provider Basics...55 查询一个内容提供器 查询一个内容提供器 Querying a Content Provider...57 修改数据 修改数据 Modifying Data...61 创建一个内容提供器 创建一个内容提供器 Creating a Content Provider...64 Content URI 总结...67 清单文件 总结 清单文件 The AndroidManifest.xml File...68 清单文件结构 清单文件结构 Structure of the Manifest File...68 文件约定 文件约定 File Conventions...70 文件特性 文件特性 File Features...73 应用程序基础 Application Fundamentals 关键类 1. Activity 2. Service 3. BroadcastReceiver 4. ContentProvider 5. Intent Android 应用程序使用 Java 做为开发语言 aapt 工具把编译后的 Java 代码连同其它应用程序需要的数据和资源文件一起打包到一个 Android 包文件中, 这个文件使用.apk 做为扩展名, 它是分发应用程序并安装到移动设备的媒介, 用户只需下载并安装此文件到他们的设备 单一.apk 文件中的所有代码被认为是一个应用程序 从很多方面来看, 每个 Android 应用程序都存在于它自己的世界之中 :

5 默认情况下, 每个应用程序均运行于它自己的 Linux 进程中 当应用程序中的任意代码开始执行时,Android 启动一个进程, 而当不再需要此进程而其它应用程序又需要系统资源时, 则关闭这个进程 每个进程都运行于自己的 Java 虚拟机 (VM) 中 所以应用程序代码实际上与其它应用程序的代码是隔绝的 默认情况下, 每个应用程序均被赋予一个唯一的 Linux 用户 ID, 并加以权限设置, 使得应用程序的文件仅对这个用户 这个应用程序可见 当然, 也有其它的方法使得这些文件同样能为别的应用程序所访问 使两个应用程序共有同一个用户 ID 是可行的, 这种情况下他们可以看到彼此的文件 从系统资源维护的角度来看, 拥有同一个 ID 的应用程序也将在运行时使用同一个 Linux 进程, 以及同一个虚拟机 应用程序组件 Android 的核心功能之一就是一个应用程序可以使用其它应用程序的元素 ( 如果那个应用程序允许的话 ) 比如说, 如果你的应用程序需要一个图片卷动列表, 而另一个应用程序已经开发了一个合用的而又允许别人使用的话, 你可以直接调用那个卷动列表来完成工作, 而不用自己再开发一个 你的应用程序并没有吸纳或链接其它应用程序的代码, 它只是在有需求的时候启动了其它应用程序的那个功能部分 为达到这个目的, 系统必须在一个应用程序的一部分被需要时启动这个应用程序, 并将那个部分的 Java 对象实例化 与在其它系统上的应用程序不同,Android 应用程序没有为应用准备一个单独的程序入口 ( 比如说, 没有 main() 方法 ), 而是为系统依照需求实例化提供了基本的组件 共有四种组件类型 : Activity Activity 是为用户操作而展示的可视化用户界面 比如说, 一个 activity 可以展示一个菜单项列表供用户选择, 或者显示一些包含说明的照片 一个短消息应用程序可以包括一个用于显示做为发送对象的联系人的列表的 activity, 一个给选定的联系人写短信的 activity 以及翻阅以前的短信和改变设置的 activity 尽管它们一起组成了一个内聚的用户界面, 但其中每个 activity 都与其它的保持独立 每个都是以 Activity 类为基类的子类实现 一个应用程序可以只有一个 activity, 或者, 如刚才提到的短信应用程序那样, 包含很多个 每个 activity 的作用, 以及其数目, 自然取决于应用程序及其设计 一般情况下, 总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的 从一个 activity 转向另一个的方式是靠当前的 activity 启动下一个 每个 activity 都被给予一个默认的窗口以进行绘制 一般情况下, 这个窗口是满屏的, 但它也可以是一个小的位于其它窗口之上的浮动窗口 一个 activity 也可以使用超过一个的窗口 比如, 在 activity 运行过程中弹出的一个供用户反应的小对话框, 或是当用户选择了屏幕上特定项目后显示的必要信息 窗口显示的可视内容是由一系列视图构成的, 这些视图均继承自 View 基类 每个视图均控制着窗口中一块特定的矩形空间 父级视图包含并组织它子视图的布局 叶节点视图 ( 位于视图层次最底端 ) 在它们控制的矩形中进行绘制, 并对用户对其直接操作做出响应 所以, 视图是 activity 与用户进行交互的界面

6 比如说, 视图可以显示一个小图片, 并在用户指点它的时候产生动作 Android 有很多既定的视图供用户直接使用, 包括按钮 文本域 卷轴 菜单项 复选框等等 视图层次是由 Activity.setContentView() 方法放入 activity 的窗口之中的 上下文视图是位于视图层次根位置的视图对象 ( 参见用户界面章节获取关于视图及层次的更多信息 ) 服务 服务没有可视化的用户界面, 而是在一段时间内在后台运行 比如说, 一个服务可以在用户做其它事情的时候在后台播放背景音乐 从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的 activity 使用 每个服务都继承自 Service 基类 一个媒体播放器播放播放列表中的曲目是一个不错的例子 播放器应用程序可能有一个或多个 activity 来给用户选择歌曲并进行播放 然而, 音乐播放这个任务本身不应该为任何 activity 所处理, 因为用户期望在他们离开播放器应用程序而开始做别的事情时, 音乐仍在继续播放 为达到这个目的, 媒体播放器 activity 应该启用一个运行于后台的服务 而系统将在这个 activity 不再显示于屏幕之后, 仍维持音乐播放服务的运行 你可以连接至 ( 绑定 ) 一个正在运行的服务 ( 如果服务没有运行, 则启动之 ) 连接之后, 你可以通过那个服务暴露出来的接口与服务进行通讯 对于音乐服务来说, 这个接口可以允许用户暂停 回退 停止以及重新开始播放 如同 activity 和其它组件一样, 服务运行于应用程序进程的主线程内 所以它不会对其它组件或用户界面有任何干扰, 它们一般会派生一个新线程来进行一些耗时任务 ( 比如音乐回放 ) 参见下述进程和线程 广播接收器 广播接收器是一个专注于接收广播通知信息, 并做出对应处理的组件 很多广播是源自于系统代码的 比如, 通知时区改变 电池电量低 拍摄了一张照片或者用户改变了语言选项 应用程序也可以进行广播比如说, 通知其它应用程序一些数据下载完成并处于可用状态 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应 所有的接收器均继承自 BroadcastReceiver 基类 广播接收器没有用户界面 然而, 它们可以启动一个 activity 来响应它们收到的信息, 或者用 NotificationManager 来通知用户 通知可以用很多种方式来吸引用户的注意力 闪动背灯 震动 播放声音等等 一般来说是在状态栏上放一个持久的图标, 用户可以打开它并获取消息 内容提供者 内容提供者将一些特定的应用程序数据供给其它应用程序使用 数据可以存储于文件系统 SQLite 数据库或其它方式 内容提供者继承于 ContentProvider 基类, 为其它应用程序取用和存储它管理的数据实现了一套标准方法 然而, 应用程序并不直接调用这些方法, 而是使用一个 ContentResolver 对象, 调用

7 它的方法作为替代 ContentResolver 可以与任意内容提供者进行会话, 与其合作来对所有相关交互通讯进行管理 参阅独立的内容提供者章节获得更多关于使用内容提供者的内容 每当出现一个需要被特定组件处理的请求时,Android 会确保那个组件的应用程序进程处于运行状态, 或在必要的时候启动它 并确保那个相应组件的实例的存在, 必要时会创建那个实例 激活组件 激活组件 :intent 当接收到 ContentResolver 发出的请求后, 内容提供者被激活 而其它三种组件 activity 服务和广播接收器被一种叫做 intent 的异步消息所激活 intent 是一个保存着消息内容的 Intent 对象 对于 activity 和服务来说, 它指明了请求的操作名称以及作为操作对象的数据的 URI 和其它一些信息 比如说, 它可以承载对一个 activity 的请求, 让它为用户显示一张图片, 或者让用户编辑一些文本 而对于广播接收器而言,Intent 对象指明了声明的行为 比如, 它可以对所有感兴趣的对象声明照相按钮被按下 对于每种组件来说, 激活的方法是不同的 : 通过传递一个 Intent 对象至 Context.startActivity() 或 Activity.startActivityForResult() 以载入 ( 或指定新工作给 ) 一个 activity 相应的 activity 可以通过调用 getintent() 方法来查看激活它的 intent Android 通过调用 activity 的 onnewintent() 方法来传递给它继发的 intent 一个 activity 经常启动了下一个 如果它期望它所启动的那个 activity 返回一个结果, 它会以调用 startactivityforresult() 来取代 startactivity() 比如说, 如果它启动了另外一个 activity 以使用户挑选一张照片, 它也许想知道哪张照片被选中了 结果将会被封装在一个 Intent 对象中, 并传递给发出调用的 activity 的 onactivityresult() 方法 通过传递一个 Intent 对象至 Context.startService() 将启动一个服务 ( 或给予正在运行的服务以一个新的指令 ) Android 调用服务的 onstart() 方法并将 Intent 对象传递给它 与此类似, 一个 Intent 可以被调用组件传递给 Context.bindService() 以获取一个正在运行的目标服务的连接 这个服务会经由 onbind() 方法的调用获取这个 Intent 对象 ( 如果服务尚未启动,bindService() 会先启动它 ) 比如说, 一个 activity 可以连接至前述的音乐回放服务, 并提供给用户一个可操作的 ( 用户界面 ) 以对回放进行控制 这个 activity 可以调用 bindservice() 来建立连接, 然后调用服务中定义的对象来影响回放 后面一节 : 远程方法调用将更详细的阐明如何绑定至服务 应用程序可以凭借将 Intent 对象传递给 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 以及 Context.sendStickyBroadcast() 和其它类似方法来产生一个广播 Android 会调用所有对此广播有兴趣的广播接收器的 onreceive() 方法, 将 intent 传递给它们 欲了解更多 intent 消息的信息, 请参阅独立章节 Intent 和 Intent 滤过器 关闭组件 内容提供者仅在响应 ContentResolver 提出请求的时候激活 而一个广播接收器仅在响应广播信息的时候激活 所以, 没有必要去显式的关闭这些组件

8 而 activity 则不同, 它提供了用户界面, 并与用户进行会话 所以只要会话依然持续, 哪怕对话过程暂时停顿, 它都会一直保持激活状态 与此相似, 服务也会在很长一段时间内保持运行 所以 Android 为关闭 activity 和服务提供了一系列的方法 可以通过调用它的 finish() 方法来关闭一个 activity 一个 activity 可以通过调用另外一个 activity( 它用 startactivityforresult() 启动的 ) 的 finishactivity() 方法来关闭它 服务可以通过调用它的 stopself() 方法来停止, 或者调用 Context.stopService() 系统也会在组件不再被使用的时候或者 Android 需要为活动组件声明更多内存的时候关闭它 后面的组件的生命周期一节, 将对这种可能及附属情况进行更详细的讨论 manifest 文件 文件 当 Android 启动一个应用程序组件之前, 它必须知道那个组件是存在的 所以, 应用程序会在一个 manifest 文件中声明它的组件, 这个文件会被打包到 Android 包中 这个.apk 文件还将涵括应用程序的代码 文件以及其它资源 这个 manifest 文件以 XML 作为结构格式, 而且对于所有应用程序, 都叫做 AndroidManifest.xml 为声明一个应用程序组件, 它还会做很多额外工作, 比如指明应用程序所需链接到的库的名称 ( 除了默认的 Android 库之外 ) 以及声明应用程序期望获得的各种权限 但 manifest 文件的主要功能仍然是向 Android 声明应用程序的组件 举例说明, 一个 activity 可以如下声明 : <?xml version="1.0" encoding="utf-8"?> <manifest... > <application... > <activity android:name="com.example.project.freneticactivity" </activity>... </application> </manifest> android:icon="@drawable/small_pic.png" android:label="@string/freneticlabel"... > <activity> 元素的 name 属性指定了实现了这个 activity 的 Activity 的子类 icon 和 label 属性指向了包含展示给用户的此 activity 的图标和标签的资源文件 其它组件也以类似的方法声明 <service> 元素用于声明服务, <receiver> 元素用于声明广播接收器, 而 <provider> 元素用于声明内容提供者 manifest 文件中未进行声明的 activity 服务以及内容提供者将不为系统所见, 从而也就不会被运行 然而, 广播接收器既可以在 manifest 文件中声明, 也可以在代码中进行动态的创建, 并以调用 Context.registerReceiver() 的方式注册至系统

9 欲更多了解如何为你的应用程序构建 manifest 文件, 请参阅 AndroidManifest.xml 文件一章 Intent 过滤器 过滤器 Intent 对象可以被显式的指定目标组件 如果进行了这种指定,Android 会找到这个组件 ( 依据 manifest 文件中的声明 ) 并激活它 但如果 Intent 没有进行显式的指定,Android 就必须为它找到对于 intent 来说最合适的组件 这个过程是通过比较 Intent 对象和所有可能对象的 intent 过滤器完成的 组件的 intent 过滤器会告知 Android 它所能处理的 intent 类型 如同其它相对于组件很重要的信息一样, 这些是在 manifest 文件中进行声明的 这里是上面实例的一个扩展, 其中加入了针对 activity 的两个 intent 过滤器声明 : <?xml version="1.0" encoding="utf-8"?> <manifest... > <application... > <activity android:name="com.example.project.freneticactivity" android:icon="@drawable/small_pic.png" android:label="@string/freneticlabel"... > <intent-filter... > <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> <intent-filter... > <action android:name="com.example.project.bounce" /> <data android:type="image/jpeg" /> <category android:name="android.intent.category.default" /> </intent-filter> </activity>... </application> </manifest> 示例中的第一个过滤器 action android.intent.action.main 和类别 android.intent.category.launcher 的组合 是通常具有的 它标明了这个 activity 将在应用程序加载器中显示, 就是用户在设备上看到的可供加载的应用程序列表 换句话说, 这个 activity 是应用程序的入口, 是用户选择运行这个应用程序后所见到的第一个 activity 第二个过滤器声明了这个 activity 能被赋予一种特定类型的数据 组件可以拥有任意数量的 intent 过滤器, 每个都会声明一系列不同的能力 如果它没有包含任何过滤器, 它将只能被显式声明了目标组件名称的 intent 激活

10 对于在代码中创建并注册的广播接收器来说,intent 过滤器将被直接以 IntentFilter 对象实例化 其它过滤器则在 manifest 文件中设置 欲获得更多 intent 过滤器的信息, 请参阅独立章节 : Intent 和 Intent 过滤器 Activity 和任务 如前所述, 一个 activity 可以启动另外一个, 甚至包括与它不处于同一应用程序之中的 举个例子说, 假设你想让用户看到某个地方的街道地图 而已经存在一个具有此功能的 activity 了, 那么你的 activity 所需要做的工作就是把请求信息放到一个 Intent 对象里面, 并把它传递给 startactivity() 于是地图浏览器就会显示那个地图 而当用户按下 BACK 键的时候, 你的 activity 又会再一次的显示在屏幕上 对于用户来说, 这看起来就像是地图浏览器是你 activity 所在的应用程序中的一个组成部分, 其实它是在另外一个应用程序中定义, 并运行在那个应用程序的进程之中的 Android 将这两个 activity 放在同一个任务中来维持一个完整的用户体验 简单的说, 任务就是用户所体验到的 应用程序 它是安排在一个堆栈中的一组相关的 activity 堆栈中的根 activity 就是启动了这整个任务的那个 一般情况下, 它就是用户在应用程序加载器中所选择的 而堆栈最上方的 activity 则是当前运行的 用户直接对其进行操作的 当一个 activity 启动另外一个的时候, 新的 activity 就被压入堆栈, 并成为当前运行的 activity 而前一个 activity 仍保持在堆栈之中 当用户按下 BACK 键的时候, 当前 activity 出栈, 而前一个恢复为当前运行的 activity 堆栈中保存的其实是对象, 所以如果发生了诸如需要多个地图浏览器的情况, 就会使得一个任务中出现多个同一 Activity 子类的实例同时存在, 堆栈会为每个实例单独开辟一个入口 堆栈中的 Activity 永远不会重排, 只会压入或弹出 任务其实就是 activity 的堆栈, 而不是 manifest 文件中的一个类或者元素 所以你无法撇开 activity 而为一个任务设置一个值 而事实上整个任务使用的值是在根 activity 中设置的 比如说, 下一节我们会谈及 任务的 affinity, 从 affinity 中读出的值将会设置到任务的根 activity 之中 任务中的所有 activity 是作为一个整体进行移动的 整个的任务 ( 即 activity 堆栈 ) 可以移到前台, 或退至后台 举个例子说, 比如当前任务在堆栈中存有四个 activity 三个在当前 activity 之下 当用户按下 HOME 键的时候, 回到了应用程序加载器, 然后选择了一个新的应用程序 ( 也就是一个新任务 ) 则当前任务遁入后台, 而新任务的根 activity 显示出来 然后, 过了一小会儿, 用户再次回到了应用程序加载器而又选择了前一个应用程序 ( 上一个任务 ) 于是那个任务, 带着它堆栈中所有的四个 activity, 再一 次的到了前台 当用户按下 BACK 键的时候, 屏幕不会显示出用户刚才离开的 activity( 上一个任务的根 activity) 取而代之, 当前任务的堆栈中最上面的 activity 被弹出, 而同一任务中的上一个 activity 显 示了出来 上述的种种即是 activity 和任务的默认行为模式 但是有一些方法可以改变所有这一切 activity 和任务的联系 任务中 activity 的行为方式都被启动那个 activity 的 Intent 对象中设置的一系列标记和 manifest 文件中那个 activity 中的 <activity> 元素的系列属性之间的交互所控制 无论是请求发出者和回应者在这里都拥有话语权

11 我们刚才所说的这些关键 Intent 标记如下 : FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_SINGLE_TOP 而关键的 <activity> 属性是 : taskaffinity launchmode allowtaskreparenting cleartaskonlaunch alwaysretaintaskstate finishontasklaunch 接下来的一节会描述这些标记以及属性的作用, 它们是如何互相影响的, 以及控制它们的使用时必须考虑到的因素 Affinity( 吸引力 吸引力 ) 和新任务 默认情况下, 一个应用程序中的 activity 相互之间会有一种 Affinity 也就是说, 它们首选都归属于一 个任务 然而, 可以在 <activity> 元素中把每个 activity 的 taskaffinity 属性设置为一个独立的 affinity 于是在不同的应用程序中定义的 activity 可以享有同一个 affinity, 或者在同一个应用程序中定义的 activity 有着不同的 affinity affinity 在两种情况下生效 : 当加载 activity 的 Intent 对象包含了 FLAG_ACTIVITY_NEW_TASK 标记, 或者当 activity 的 allowtaskreparenting 属性设置为 true FLAG_ACTIVITY_NEW_TASK 标记 如前所述, 在默认情况下, 一个新 activity 被另外一个调用了 startactivity() 方法的 activity 载入了任务之中 并压入了调用者所在的堆栈 然而, 如果传递给 startactivity() 的 Intent 对象包含了 FLAG_ACTIVITY_NEW_TASK 标记, 系统会为新 activity 安排另外一个任务 一般情况下, 如同标记所暗示的那样, 这会是一个新任务 然而, 这并不是必然的 如果已经存在了一个与新 activity 有着同样 affinity 的任务, 则 activity 会载入那个任务之中 如果没有, 则启用新任务 allowtaskreparenting 属性 如果一个 activity 将 allowtaskreparenting 属性设置为 true 它就可以从初始的任务中转移到与其拥有同一个 affinity 并转向前台的任务之中 比如说, 一个旅行应用程序中包含的预报所选城市的天气情况的 activity 它与这个应用程序中其它的 activity 拥有同样的 affinity( 默认的 affinity) 而且允许重定父级 你的另一个 activity 启动了天气预报, 于是它就会与这个 activity 共处与同一任务之中 然而, 当那个旅行应用程序再次回到前台的时候, 这个天气预报 activity 就会被再次安排到原先的任务之中并显示出来

12 如果在用户的角度看来, 一个.apk 文件中包含了多于一个的 应用程序, 你可能会想要为它们所辖的 activity 安排不一样的 affinity 加载模式 <activity> 元素的 launchmode 属性可以设置四种不同的加载模式 : "standard" ( 默认值 ) "singletop" "singletask" "singleinstance" 这些模式之间的差异主要体现在四个方面 : 哪个任务会把持对 intent 做出响应的 activity 对 standard 和 singletop 模式而言, 是产生 intent( 并调用 startactivity()) 的任务 除非 Intent 对象包含 FLAG_ACTIVITY_NEW_TASK 标记 而在这种情况下, 如同上面 Affinitie 和新任务一节所述, 会是另外一个任务 相反, 对 singletask 和 singleinstance 模式而言,activity 总是位于任务的根部 正是它们定义了一个任务, 所以它们绝不会被载入到其它任务之中 activity 是否可以存在多个实例 一个 standard 或 singletop 的 activity 可以被多次初始化 它们可以归属于多个任务, 而一个任务也可以拥有同一 activity 的多个实例 相反, 对 singletask 和 singleinstance 的 activity 被限定于只能有一个实例 因为这些 activity 都是任务的起源, 这种限制意味着在一个设备中同一时间只允许存在一个任务的实例 在实例所在的任务中是否会有别的 activity 一个 singleinstance 模式的 activity 将会是它所在的任务中唯一的 activity 如果它启动了别的 activity, 那个 activity 将会依据它自己的加载模式加载到其它的任务中去 如同在 intent 中设置了 FLAG_ACTIVITY_NEW_TASK 标记一样的效果 在其它方面, singleinstance 模式的效果与 singletask 是一样的 剩下的三种模式允许一个任务中出现多个 activity singletask 模式的 activity 将是任务的根 activity, 但它可以启动别的 activity 并将它们置入所在的任务中 standard 和 singletop activity 则可以在堆栈的任意位置出现 是否要载入新的类实例以处理新的 intent 对默认的"standard" 模式来说, 对于每个新 intent 都会创建一个新的实例以进行响应, 每个实例仅处理一个 intent singletop 模式下, 如果 activity 位于目的任务堆栈的最上面, 则重用目前现存的 activity 来处理新的 intent 如果它不是在堆栈顶部, 则不会发生重用 而是创建一个新实例来处理新的 intent 并将其推入堆栈 举例来说, 假设一个任务的堆栈由根 activitya 和 activity B C 和位于堆栈顶部的 D 组成, 即堆栈 A-B-C-D 一个针对 D 类型的 activity 的 intent 抵达的时候, 如果 D 是默认的 standard 加载模式, 则创建并加载一个新的类实例, 于是堆栈变为 A-B-C-D-D 然而, 如果 D 的载入模式为 singletop, 则现有的实例会对新 intent 进行处理 ( 因为它位于堆栈顶部 ) 而堆栈保持 A-B-C-D 的形态

13 换言之, 如果新抵达的 intent 是针对 B 类型的 activity, 则无论 B 的模式是 standard 还是 singletop, 都会加载一个新的 B 的实例 ( 因为 B 不位于堆栈的顶部 ), 而堆栈的顺序变为 A-B-C-D-B 如前所述, singletask 或 singleinstance 模式的 activity 永远不会存在多于一个实例 所以实例将处理所有新的 intent 一个 singleinstance 模式的 activity 永远保持在堆栈的顶部 ( 因为它是那个堆栈中唯一的一个 activity), 所以它一直坚守在处理 intent 的岗位上 然而, 对一个 singletask 模式的 activity 来说, 它上面可能有, 也可能没有别的 activity 和它处于同一堆栈 在有的情况下, 它就不在能够处理 intent 的位置上, 则那个 intent 将被舍弃 ( 即便在 intent 被舍弃的情况下, 它的抵达仍将使这个任务切换至前台, 并一直保留 ) 当一个现存的 activity 被要求处理一个新的 intent 的时候, 会调用 onnewintent() 方法来将 intent 对象传递至 activity ( 启动 activity 的原始 intent 对象可以通过调用 getintent() 方法获得 ) 请注意, 当一个新的 activity 实例被创建以处理新的 intent 的时候, 用户总可以按下 BACK 键来回到前面的状态 ( 回到前一个 activity) 但当使用现存的 activity 来处理新 intent 的时候, 用户是不能靠按下 BACK 键回到当这个新 intent 抵达之前的状态的 想获得更多关于加载模式的内容, 请参阅 <activity> 元素的描述 清理堆栈 如果用户离开一个任务很长一段时间, 系统会清理该任务中除了根 activity 之外的所有 activity 当用户再次回到这个任务的时候, 除了只剩下初始化 activity 尚存之外, 其余都跟用户上次离开它的时候一样 这样做的原因是 : 在一段时间之后, 用户再次回到一个任务的时候, 他们更期望放弃他们之前的所作所为, 做些新的事情 这些属于默认行为, 另外, 也存在一些 activity 的属性用以控制并改变这些行为 : alwaysretaintaskstate 属性 如果一个任务的根 activity 中此属性设置为 true, 则上述默认行为不会发生 任务将在很长的一段时间内保留它堆栈内的所有 activity cleartaskonlaunch 属性 如果一个任务的根 activity 中此属性设置为 true, 则每当用户离开这个任务和返回它的时候, 堆栈都会被清空至只留下 rootactivity 换句话说, 这是 alwaysretaintaskstate 的另一个极端 哪怕仅是过了一小会儿, 用户回到任务时, 也是见到它的初始状态 finishontasklaunch 属性 这个属性与 cleartaskonlaunch 属性相似, 但它仅作用于单个的 activity, 而不是整个的 task 而且它可以使任意 activity 都被清理, 甚至根 activity 也不例外 当它设置为 true 的时候, 此 activity 仅做为任务的一部分存在于当前回话中, 一旦用户离开并再次回到这个任务, 此 activity 将不复存在

14 此外, 还有别的方式从堆栈中移除一个 activity 如果一个 intent 对象包含 FLAG_ACTIVITY_CLEAR_TOP 标记, 而且目标任务的堆栈中已经存在了一个能够响应此 intent 的 activity 类型的实例 则这个实例之上的所有 activity 都将被清理以使它位于堆栈的顶部来对 intent 做出响应 如果此时指定的 activity 的加载模式为 standard, 则它本身也会从堆栈中移除, 并加载一个新的实例来处理到来的 intent 这是因为加载模式为 standard 的 activity 总会创建一个新实例来处理新的 intent FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK 经常合并使用 这时, 这些标记提供了一种定位其它任务中现存的 activity 并将它们置于可以对 intent 做出响应的位置的方法 启动任务 当一个 activity 被指定一个 android.intent.action.main 做为动作, 以及 android.intent.category.launcher 做为类别的 intent 过滤器之后 ( 在前述 intent 过滤器一节中已经有了这个示例 ), 它就被设置为一个任务的入口点 这样的过滤器设置会在应用程序加载器中为此 activity 显示一个图标和标签, 以供用户加载任务或加载之后在任意时间回到这个任务 第二个能力相当重要 : 用户必须可以离开一个任务, 并在一段时间后返回它 出于这个考虑, 加载模式被设定为 singletask 和 singleinstance 的 activity 总是会初始化一个新任务, 这样的 activity 仅能用于指定了一个 MAIN 和 LAUNCHER 过滤器的情况之下 我们来举例说明如果没指定过滤器的情况下会发生的事情 : 一个 intent 加载了一个 singletask 的 activity, 初始化了一个新任务, 用户在这个任务中花费了一些时间来完成工作 然后用户按下了 HOME 键 于是任务被要求转至后台并被主屏幕所掩盖 因为它并没有在应用程序加载器中显示图标, 这将导致用户无法再返回它 类似的困境也可由 FLAG_ACTIVITY_NEW_TASK 标记引起 如果此标记使一个 activity 启动了一个新任务继而用户按下了 HOME 键离开了它, 则用户必须要有一些方法再次回到这个任务 一些实体 ( 诸如通知管理器 ) 总是在另外的任务中启动新 activity, 而不是做为它们自己的一部分, 所以它们总是将 FLAG_ACTIVITY_NEW_TASK 标记包含在 intent 里面并传递给 startactivity() 如果你写了一个能被外部实体使用这个标记调用的 activity, 你必须注意要给用户留一个返回这个被外部实体启动的任务的方法 当你不想让用户再次返回一个 activity 的情况下, 可以将 <activity> 元素的 finishontasklaunch 设置为 true 参见前述清理堆栈. 进程和线程 当一个应用程序开始运行它的第一个组件时,Android 会为它启动一个 Linux 进程, 并在其中执行一个单一的线程 默认情况下, 应用程序所有的组件均在这个进程的这个线程中运行 然而, 你也可以安排组件在其他进程中运行, 而且可以为任意进程衍生出其它线程 进程 组件运行所在的进程由 manifest 文件所控制 组件元素 <activity>, <service>, <receiver> 和 <provider> 都有一个 process 属性来指定组件应当运行于哪个进程之内 这些属性可以设置为使每

15 个组件运行于它自己的进程之内, 或一些组件共享一个进程而其余的组件不这么做 它们也可以设置为令不同应用程序的组件在一个进程中运行 使应用程序的组成部分共享同一个 Linux 用户 ID 并赋以同样的权限 <application> 元素也有一个 process 属性, 以设定所有组件的默认值 所有的组件实例都位于特定进程的主线程内, 而对这些组件的系统调用也将由那个线程进行分发 一般不会为每个实例创建线程 因此, 某些方法总是运行在进程的主线程内, 这些方法包括诸如 View.onKeyDown() 这样报告用户动作以及后面组件生命周期一节所要讨论的生命周期通告的 这意味着组件在被系统调用的时候, 不应该施行长时间的抑或阻塞的操作 ( 诸如网络相关操作或是循环计算 ), 因为这将阻塞同样位于这个进程的其它组件的运行 你应该如同下面线程一节所叙述的那样, 为这些长时间操作衍生出一个单独的线程进行处理 在可用内存不足而又有一个正在为用户进行服务的进程需要更多内存的时候,Android 有时候可能会关闭一个进程 而在这个进程中运行着的应用程序也因此被销毁 当再次出现需要它们进行处理的工作的时候, 会为这些组件重新创建进程 在决定结束哪个进程的时候,Android 会衡量它们对于用户的相对重要性 比如说, 相对于一个仍有用户可见的 activity 的进程, 它更有可能去关闭一个其 activity 已经不为用户所见的进程 也可以说, 决定是否关闭一个进程主要依据在那个进程中运行的组件的状态 这些状态将在后续的一节组件生命周期中予以说明 线程 尽管你可以把你的应用程序限制于一个单独的进程中, 有时, 你仍然需要衍生出一个线程以处理后台任务 因为用户界面必须非常及时的对用户操作做出响应, 所以, 控管 activity 的线程不应用于处理一些诸如网络下载之类的耗时操作 所有不能在瞬间完成的任务都应安排到不同的线程中去 线程在代码中是以标准 Java Thread 对象创建的 Android 提供了很多便于管理线程的类 : Looper 用于在一个线程中运行一个消息循环, Handler 用于处理消息,HandlerThread 用于使用一个消息循环启用一个线程 远程过程调用 Android 有一个轻量级的远程过程调用 (RPC) 机制 : 即在本地调用一个方法, 但在远程 ( 其它的进程中 ) 进行处理, 然后将结果返回调用者 这将方法调用及其附属的数据以系统可以理解的方式进行分离, 并将其从本地进程和本地地址空间传送至远程过程和远程地址空间, 并在那里重新装配并对调用做出反应 返回的结果将以相反的方向进行传递 Android 提供了完成这些工作所需的所有的代码, 以使你可以集中精力来实现 RPC 接口本身 RPC 接口可以只包括方法 即便没有返回值, 所有方法仍以同步的方式执行 ( 本地方法阻塞直至远程方法结束 ) 简单的说, 这套机制是这样工作的 : 一开始, 你用简单的 IDL( 界面描绘语言 ) 声明一个你想要实现的 RPC 接口 然后用 aidl 工具为这个声明生成一个 Java 接口定义, 这个定义必须对本地和远程进程都可见 它包含两个内部类, 如下图所示 :

16 内部类中有管理实现了你用 IDL 声明的接口的远程方法调用所需要的所有代码 两个内部类均实现了 IBinder 接口 一个用于系统在本地内部使用, 你些的代码可以忽略它 ; 另外一个, 我们称为 Stub, 扩展了 Binder 类 除了实现了 IPC 调用的内部代码之外, 它还包括了你声明的 RPC 接口中的方法的声明 你应该如上图所示的那样写一个 Stub 的子类来实现这些方法 一般情况下, 远程过程是被一个服务所管理的 ( 因为服务可以通知系统关于进程以及它连接到别的进程的信息 ) 它包含着 aidl 工具产生的接口文件和实现了 RPC 方法的 Stub 的子类 而客户端只需要包括 aidl 工具产生的接口文件 下面将说明服务与其客户端之间的连接是如何建立的 : 服务的客户端 ( 位于本地 ) 应该实现 onserviceconnected() 和 onservicedisconnected() 方法 这样, 当至远程服务的连接成功建立或者断开的时候, 它们会收到通知 这样它们就可以调用 bindservice() 来设置连接 而服务则应该实现 onbind() 方法以接受或拒绝连接 这取决于它收到的 intent(intent 将传递给 bindservice()) 如果接受了连接, 它会返回一个 Stub 的子类的实例 如果服务接受了连接,Android 将会调用客户端的 onserviceconnected() 方法, 并传递给它一个 IBinder 对象, 它是由服务所管理的 Stub 的子类的代理 通过这个代理, 客户端可以对远程服务进行调用 线程安全方法 在一些情况下, 你所实现的方法有可能会被多于一个的线程所调用, 所以它们必须被写成线程安全的 对于我们上一节所讨论的 RPC 机制中的可以被远程调用的方法来说, 这是必须首先考虑的 如果针对一个 IBinder 对象中实现的方法的调用源自这个 IBinder 对象所在的进程时, 这个方法将会在调用者的线程中执行 然而, 如果这个调用源自其它的进程, 则这个方法将会在一个线程池中选出的线程中运行, 这个线程池由 Android 加以管理, 并与 IBinder 存在于同一进程内 ; 这个方法不会在进程的主线程内执行 反过来说, 一个服务的 onbind() 方法应为服务进程的主线程所调用, 而实现了由 onbind() 返回的对象 ( 比如说, 一个实现了 RPC 方法的 Stub 的子类 ) 的方法将为池中的线程所调用 因为服务可以拥有多于一个的客户端, 而同一时间, 也会有多个池中的线程调用同一个 IBinder 方法 因此 IBinder 方法必须实现为线程安全的 类似的, 一个内容提供者能接受源自其它进程的请求数据 尽管 ContentResolver 和 ContentProvider 类隐藏了交互沟通过程的管理细节,ContentProvider 会由 query(), insert(), delete(), update() 和 gettype() 方法来相应这些请求, 而这些方法也都是由那个内容提供者的进程中所包涵的线程池提供的, 而不是进程的主线程本身 所以这些有可能在同一时间被很多线程调用的方法也必须被实现为线程安全的

17 组件生命周期 应用程序组件有其生命周期 由 Android 初始化它们以相应 intent 直到这个实例被摧毁 在此之间, 它们有时是激活的有时则相反 或者, 如果它是一个 activity, 则是可为用户所见或者不能 这一节讨论了 activity 服务以及广播接收器的生命周期, 包括它们在生命周期中的状态 在状态之间转变时通知你的方法 以及当这些进程被关闭或实例被摧毁时, 这些状态产生的效果 Activity 生命周期 生命周期 一个 activity 主要有三个状态 : 当在屏幕前台时 ( 位于当前任务堆栈的顶部 ), 它是活跃或运行的状态 它就是相应用户操作的 activity 当它失去焦点但仍然对用户可见时, 它处于暂停状态 即是 : 在它之上有另外一个 activity 这个 activity 也许是透明的, 或者未能完全遮蔽全屏, 所以被暂停的 activity 仍对用户可见 暂停的 activity 仍然是存活状态 ( 它保留着所有的状态和成员信息并连接至窗口管理器 ), 但当系统处于极低内存的情况下, 仍然可以杀死这个 activity 如果它完全被另一个 activity 覆盖是, 它处于停止状态 它仍然保留所有的状态和成员信息 然而它不在为用户可见, 所以它的窗口将被隐藏, 如果其它地方需要内存, 则系统经常会杀死这个 activity 如果一个 activity 处于暂停或停止状态, 系统可以通过要求它结束 ( 调用它的 finish() 方法 ) 或直接杀死它的进程来将它驱出内存 当它再次为用户可见的时候, 它只能完全重新启动并恢复至以前的状态 当一个 activity 从这个状态转变到另一个状态时, 它被以下列 protected 方法所通知 : void oncreate(bundle savedinstancestate) void onstart() void onrestart() void onresume() void onpause() void onstop() void ondestroy() 你可以重载所有这些方法以在状态改变时进行合适的工作 所有的 activity 都必须实现 oncreate() 用以当对象第一次实例化时进行初始化设置 很多 activity 会实现 onpause() 以提交数据变化或准备停止与用户的交互 调用父类 所有 activity 生命周期方法的实现都必须先调用其父类的版本 比如说 : protected void onpause() { super.onpause();

18 }... 总得来说, 这七个方法定义了一个 activity 完整的生命周期 实现这些方法可以帮助你监察三个嵌套的生命周期循环 : 一个 activity 完整的生命周期自第一次调用 oncreate() 开始, 直至调用 ondestroy() 为止 activity 在 oncreate() 中设置所有 全局 状态以完成初始化, 而在 ondestroy() 中释放所有系统资源 比如说, 如果 activity 有一个线程在后台运行以从网络上下载数据, 它会以 oncreate() 创建那个线程, 而以 ondestroy() 销毁那个线程 一个 activity 的可视生命周期自 onstart() 调用开始直到相应的 onstop() 调用 在此期间, 用户可以在屏幕上看到此 activity, 尽管它也许并不是位于前台或者正在与用户做交互 在这两个方法中, 你可以管控用来向用户显示这个 activity 的资源 比如说, 你可以在 onstart() 中注册一个 BroadcastReceiver 来监控会影响到你 UI 的改变, 而在 onstop() 中来取消注册, 这时用户是无法看到你的程序显示的内容的 onstart() 和 onstop() 方法可以随着应用程序是否为用户可见而被多次调用 一个 activity 的前台生命周期自 onresume() 调用起, 至相应的 onpause() 调用为止 在此期间,activity 位于前台最上面并与用户进行交互 activity 会经常在暂停和恢复之间进行状态转换 比如说当设备转入休眠状态或有新的 activity 启动时, 将调用 onpause() 方法 当 activity 获得结果或者接收到新的 intent 的时候会调用 onresume() 方法 因此, 在这两个方法中的代码应当是轻量级的 下图展示了上述循环过程以及 activity 在这个过程之中历经的状态改变 着色的椭圆是 activity 可以经历的主要状态 矩形框代表了当 activity 在状态间发生改变的时候, 你进行操作所要实现的回调方法 下表详细描述了这些方法, 并在 activity 的整个生命周期中定位了它们 方法 描述 可被杀死 下一个 oncreate() 在 activity 第一次被创建的时候调用 这里是你做所有初始化设置的地方 创建视图 绑定数据至列表等 如果曾经有状态记录 ( 参阅后述 Saving Activity State ), 则调用此方法时会传入一个包含着此 activity 以前状态的包对象做为参数 总继之以 onstart() 否 onstart()

19 方法 描述 可被杀死 下一个 onrestart() 在 activity 停止后, 在再次启动之前被调用 总继之以 onstart() 否 onstart() onstart() 当 activity 正要变得为用户所见时被调用 当 activity 转向前台时继以 onresume(), 在 activity 变为隐藏时继以 onstop() 否 onresume() or onstop() onresume() 在 activity 开始与用户进行交互之前被调用 此时 activity 位于堆栈顶部, 并接受用户输入 继之以 onpause() 否 onpause() onpause() 当系统将要启动另一个 activity 时调用 此方法主要用来将未保存的变化进行持久化, 停止类似动画这样耗费 CPU 的动作等 这一切动作应该在短时间内完成, 因为下一个 activity 必须等到此方法返回后才会继续 当 activity 重新回到前台是继以 onresume() 当 activity 变为用户不可见时继以 onstop() 是 onresume() or onstop() onstop() 当 activity 不再为用户可见时调用此方法 这可能发生在它被销毁或者另一个 activity( 可能是现存的或者是新的 ) 回到运行状态并覆盖了它 是 如果 activity 再次回到前台跟用户交互则继以 onrestart(), 如果关闭 activity 则继以 ondestroy() onrestart() or ondestroy() ondestroy() 在 activity 销毁前调用 这是 activity 接收的最后一个调用 这可能发生在 activity 结束 ( 调用了它的 finish() 方法 ) 或者因为系统需要空间所以临时的销毁了此 acitivity 的实例时 你可以用 isfinishing() 方法来区分这两种情况 是 nothing 请注意上表中可被杀死可被杀死一列 它标示了在方法返回后, 还没执行 activity 的其余代码的任意时间里, 系统是否可以杀死包含此 activity 的进程 三个方法 (onpause() onstop() 和 ondestroy()) 被标记为 是

20 onpause() 是三个中的第一个, 它也是唯一一个在进程被杀死之前必然会调用的方法 onstop() 和 ondestroy() 有可能不被执行 因此你应该用 onpause() 来将所有持久性数据 ( 比如用户的编辑结果 ) 写入存储之中 在可被杀死可被杀死一列中标记为 否 的方法在它们被调用时将保护 activity 所在的进程不会被杀死 所以只有在 onpause() 方法返回后到 onresume() 方法被调用时, 一个 activity 才处于可被杀死的状态 在 onpause() 再次被调用并返回之前, 它不会被系统杀死 如后面一节进程和生命周期所述, 即使是在这里技术上没有被定义为 可杀死 的 activity 仍然有可能被系统杀死 但这仅会发生在实在没有其它方法的极端情况之下 保存 activity 状态 当系统而不是用户自己出于回收内存的考虑, 关闭了一个 activity 之后 用户会期望当他再次回到那个 activity 的时候, 它仍保持着上次离开时的样子 为了获取 activity 被杀死前的状态, 你应该为 activity 实现 onsaveinstancestate() 方法 Android 在 activity 有可能被销毁之前 ( 即 onpause() 调用之前 ) 会调用此方法 它会将一个以名称 - 值对方式记录了 activity 动态状态的 Bundle 对象传递给该方法 当 activity 再次启动时, 这个 Bundle 会传递给 oncreate() 方法和随着 onstart() 方法调用的 onrestoreinstancestate(), 所以它们两个都可以恢复捕获的状态 与 onpause() 或先前讨论的其它方法不同,onSaveInstanceState() 和 onrestoreinstancestate() 并不是生命周期方法 它们并不是总会被调用 比如说,Android 会在 activity 易于被系统销毁之前调用 onsaveinstancestate(), 但用户动作 ( 比如按下了 BACK 键 ) 造成的销毁则不调用 在这种情况下, 用户没打算再次回到这个 activity, 所以没有保存状态的必要 因为 onsaveinstancestate() 不是总被调用, 所以你应该只用它来为 activity 保存一些临时的状态, 而不能用来保存持久性数据 而是应该用 onpause() 来达到这个目的 协调 activity 当一个 activity 启动了另外一个的时候, 它们都会经历生命周期变化 一个会暂停乃至停止, 而另一个则启动 这种情况下, 你可能需要协调好这些 activity: 生命周期回调顺序是已经定义好的, 尤其是在两个 activity 在同一个进程内的情况下 : 1. 调用当前 activity 的 onpause() 方法 2. 接着, 顺序调用新启动 activity 的 oncreate() onstart() 和 onresume() 方法 3. 然后, 如果启动的 activity 不再于屏幕上可见, 则调用它的 onstop() 方法 服务生命周期 服务以两种方式使用 :

21 它可以启动并运行, 直至有人停止了它或它自己停止 在这种方式下, 它以调用 Context.startService() 启动, 而以调用 Context.stopService() 结束 它可以调用 Service.stopSelf() 或 Service.stopSelfResult() 来自己停止 不论调用了多少次 startservice() 方法, 你只需要调用一次 stopservice() 来停止服务 它可以通过自己定义并暴露出来的接口进行程序操作 客户端建立一个到服务对象的连接, 并通过那个连接来调用服务 连接以调用 Context.bindService() 方法建立, 以调用 Context.unbindService() 关闭 多个客户端可以绑定至同一个服务 如果服务此时还没有加载,bindService() 会先加载它 这两种模式并不是完全分离的 你可以绑定至一个用 startservice() 启动的服务 比如说, 一个后台音乐播放服务可以调用 startservice() 并传递给它一个包含欲播放的音乐列表的 Intent 对象来启动 不久, 当用户想要对播放器进行控制或者查看当前播放曲目的详情时, 会启用一个 activity, 调用 bindservice() 连接到服务来完成操作 在这种情况下, 直到绑定连接关闭 stopservice() 才会真正停止一个服务 与 activity 一样, 服务也有一系列你可以实现以用于监控其状态变化的生命周期方法 但相对于 activity 要少一些, 只有三个, 而且, 它们是 public 属性, 并非 protected: void oncreate() void onstart(intent intent) void ondestroy() 倚仗实现这些方法, 你监控服务的两个嵌套的生命周期循环 : 服务的完整生命周期完整生命周期始于调用 oncreate() 而终于 ondestroy() 方法返回 如同 activity 一样, 服务在 oncreate() 里面进行它自己的初始化, 而在 ondestroy() 里面释放所有资源 比如说, 一个音乐回放服务可以在 oncreate() 中创建播放音乐的线程, 而在 ondestroy() 中停止这个线程 服务的活跃生命周期活跃生命周期始于调用 onstart() 这个方法用于处理传递给 startservice() 的 Intent 对象 音乐服务会打开 Intent 来探明将要播放哪首音乐, 并开始播放 服务停止时没有相应的回调方法 不存在 onstop() 方法 oncreate() 和 ondestroy() 方法在所有服务中都会被调用, 不论它们是由 Context.startService() 还是由 Context.bindService() 所启动的 而 onstart() 仅会被 startservice() 所启用的服务调用 如果一个服务允许别的进程绑定, 则它还会有以下额外的回调方法以供实现 : IBinder onbind(intent intent) boolean onunbind(intent intent) void onrebind(intent intent) 传递给 bindservice 的 Intent 的对象也会传递给 onbind() 回调方法, 而传递给 unbindservice() 的 Intent 对象同样传递给 onunbind() 如果服务允许绑定,onBind() 将返回一个供客户端与服务进行交互的通讯渠道 如果有新的客户端连接至服务, 则 onunbind() 方法可以要求调用 onrebind()

22 下图描绘了服务的回调方法 尽管图中对由 startservice 和 startservice 方法启动的服务做了区分, 但要记住, 不论一个服务是怎么启动的, 它都可能允许客户端的连接, 所以任何服务都可以接受 onbind() 和 onunbind() 调用 广播接收器生命周期 广播接收器只有一个回调方法 : void onreceive(context curcontext, Intent broadcastmsg) 当广播消息抵达接收器时,Android 调用它的 onreceive() 方法并将包含消息的 Intent 对象传递给它 广播接收器仅在它执行这个方法时处于活跃状态 当 onreceive() 返回后, 它即为失活状态 拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死 但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉 这种方式引出了一个问题 : 如果响应一个广播信息需要很长的一段时间, 我们一般会将其纳入一个衍生的线程中去完成, 而不是在主线程内完成它, 从而保证用户交互过程的流畅 如果 onreceive() 衍生了一个线程并且返回, 则包涵新线程在内的整个进程都被会判为失活状态 ( 除非进程内的其它应用程序组件仍处于活跃状态 ), 于是它就有可能被杀掉 这个问题的解决方法是令 onreceive() 启动一个新服务, 并用其完成任务, 于是系统就会知道进程中仍然在处理着工作 下一节中, 我们会讨论更多进程易误杀的问题 进程与生命周期 Android 系统会尽可能长的延续一个应用程序进程, 但在内存过低的时候, 仍然会不可避免需要移除旧的进程 为决定保留或移除一个进程,Android 将每个进程都放入一个 重要性层次 中, 依据则是它其中运行着的组件及其状态 重要性最低的进程首先被消灭, 然后是较低的, 依此类推 重要性共分五层, 依据重要性列表如下 : 1. 前台进程是用户操作所必须的 当满足如下任一条件时, 进程被认为是处于前台的 : o 它运行着正在与用户交互的 activity(activity 对象的 onresume() 方法已被调用 ) o 一个正在与用户交互的 activity 使用着它提供的一个服务 o 它包含着一个正在执行生命周期回调方法 (oncreate() onstart() 或 ondestroy()) 的 Service 对象 o 它包含着一个正在执行 onreceive() 方法的 BroadcastReceiver 对象 任一时间下, 仅有少数进程会处于前台, 仅当内存实在无法供给它们维持同时运行时才会被杀死 一般来说, 在这种情况下, 设备已然处于使用虚拟内存的状态, 必须要杀死一些前台进程以用户界面保持响应 2. 可视进程没有前台组件, 但仍可被用户在屏幕上所见 当满足如下任一条件时, 进程被认为是可视的 :

23 o 它包含着一个不在前台, 但仍然为用户可见的 activity( 它的 onpause() 方法被调用 ) 这种情况可能出现在以下情况 : 比如说, 前台 activity 是一个对话框, 而之前的 activity 位于其下并可以看到 o 它包含了一个绑定至一个可视的 activity 的服务 可视进程依然被视为是很重要的, 非到不杀死它们便无法维持前台进程运行时, 才会被杀死 3. 服务进程是由 startservice() 方法启动的服务, 它不会变成上述两类 尽管服务进程不会直接为用户所见, 但它们一般都在做着用户所关心的事情 ( 比如在后台播放 mp3 或者从网上下载东西 ) 所以系统会尽量维持它们的运行, 除非系统内存不足以维持前台进程和可视进程的运行需要 4. 背景进程包含目前不为用户所见的 activity(activity 对象的 onstop() 方法已被调用 ) 这些进程与用户体验没有直接的联系, 可以在任意时间被杀死以回收内存供前台进程 可视进程以及服务进程使用 一般来说, 会有很多背景进程运行, 所以它们一般存放于一个 LRU( 最后使用 ) 列表中以确保最后被用户使用的 activity 最后被杀死 如果一个 activity 正确的实现了生命周期方法, 并捕获了正确的状态, 则杀死它的进程对用户体验不会有任何不良影响 5. 空进程不包含任何活动应用程序组件 这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间 系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡 Android 会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别 比如说, 如果一个进程中同时有一个服务和一个可视的 activity, 则进程会被判定为可视进程, 而不是服务进程 此外, 一个进程的级别可能会由于其它进程依赖于它而升高 一个为其它进程提供服务的进程级别永远高于使用它服务的进程 比如说, 如果 A 进程中的内容提供者为进程 B 中的客户端提供服务, 或进程 A 中的服务为进程 B 中的组件所绑定, 则 A 进程最低也会被视为与进程 B 拥有同样的重要性 因为运行着一个服务的进程重要级别总高于一个背景 activity 所以一个 activity 以启动一个服务的方式启动一个长时间运行过程比简单的衍生一个线程来进行处理要好 尤其是当处理过程比 activity 本身存在时间要长的情况之下 我们以背景音乐播放和上传一个相机拍摄的图片至网站上为例 使用服务则不论 activity 发生何事, 都至少可以保证操作拥有 服务进程 的权限 如上一节广播接收器生命周期所提到的, 这也正是广播接收器使用服务, 而不是使用线程来处理耗时任务的原因 用户界面 User Interface 在一个 Android 应用中, 用户界面是由 View 和 ViewGroup 对象构建的 View 与 ViewGroup 都有很多种类, 而它们都是 View 类的子类 View 对象是 Android 平台中用户界面体现的基础单位 View 类是它称为 widgets( 工具 ) 的子类的基础, 它们提供了诸如文本输入框和按钮之类的 UI 对象的完整实现 ViewGroup 类同样为其被称为 Layouts( 布局 ) 的子类奠定了基础, 它们提供了象流式布局 表格布局以及相对布局之类的布局架构

24 View 对象是一个数据体, 它的属性存储了用于屏幕上一块矩形区域的布局参数及内容 并负责这块它所辖的这个矩形区域之中所有测量 布局 焦点转换 卷动以及按键 / 触摸手势的处理 作为一个用户界面对象, View 同时也担任着用户交互关键点以及交互事件接受者的角色 视图层次 View Hierarchy 在 Android 平台上, 你可以用下图所示的 View 和 ViewGroup 层次图来定义一个 Activity 的 UI 这个层次树可随你所愿的简单或者复杂化, 你能使用 Android 预定义的一套工具和布局来创建它, 或者使用你自己定义的 Views 来创建 为了把一个视图层次树展现到屏幕上, 你的 Activity 必须调用 setcontentview() 方法, 并传给它一个根节点对象的引用 Android 系统将接受此引用, 并用来进行界面的废止 测量并绘制这棵树 层次的根结点会要求它的子节点进行自我绘制 进而, 每个视图组节点也负责调用它的子视图进行自我绘制 子节点将向父节点申请绘制的位置以及大小, 而其父类享有子节点绘制的位置及大小的最终决定权 Android 依次 ( 自层次树顶层开始 ) 解析你布局中的元素, 实例化 View 并将它们添加到它们的父节点中 因为这个过程是依次进行的, 所以如果出现了元素重叠的情况, 最后一个绘制的元素将位于所有重叠元素之上显现 如欲获得更多关于视图层次如何测算以及绘制细节的讨论, 情参阅 Android 如何绘制视图 布局 Layout 定义并展现你的视图层次的最常用的方法是使用 XML 布局文件 如同 HTML 一样,XML 为布局提供了一种可读的结构 XML 中的每个元素都是 View 或 ViewGroup 对象 ( 抑或它们的子类 ) View 对象是树的叶节点, 而 ViewGroup 对象是树的分支 ( 参阅楼上的视图层次图 )

25 XML 元素的名称与它体现的 Java 类相对应 所以一个 <TextView> 元素将在你的 UI 中生成一个 TextView, 而 <LinearLayout> 则创建一个 LinearLayout 视图组 当你载入一个布局资源时,Android 系统会根据你布局中的元素初始化这些运行时对象 举例来说, 一个包含文本视图和一个按钮的简单垂直布局如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="hello, I am a TextView" /> <Button android:id="@+id/button" </LinearLayout> android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="hello, I am a Button" /> 请注意 :LinearLayout 元素包含了 TextView 和 Button 对象 你可以在其中另外安置一个 LinearLayout ( 或其它类型的视图组 ), 以延展这个视图层次, 构建更复杂的布局 欲获知更多如何构建 UI 布局的内容, 请参阅声明布局 提示 : 您也可以用 Java 代码来绘制 View 和 ViewGroup 对象, 并用 addview(view) 方法动态 的插入新的 View 和 ViewGroup 对象 您有相当多的方法来对视图进行布局 使用大量不同种类的视图组, 您可以有近乎无穷的方式来构建子视图和视图组 Android 提供了一些预定义的视图组, 其中包括 LinearLayout, RelativeLayout, AbsoluteLayout, TableLayout, GridLayout 以及其它的一些 每个都为定义子视图和布局结构提供了一套独特的布局参数 欲了解其它用于布局的不同种类的视图组, 请参阅普通布局对象 部件 Widgets 部件是为用户交互界面提供服务的视图对象 Android 提供了一套完整的部件实现, 包括按钮 复选框 文本输入框等, 以助于你快速的构建 UI Android 还提供了一些更高级的部件, 比如日期选择 时钟以及

26 缩放控制 但您并没有被局限于 Android 平台提供的这些部件上 如果您想创建一些您自己的定制动作元素, 您可以这么做, 只要定义自己的视图对象或者扩展或合并现有的部件就行 更多信息参阅构建自定义组件 您可以在 android.widget 包中找到 Android 提供的部件列表 用户界面事件 UI Events 当你在用户界面中加入了一些视图和工具之后, 你可能想要知道如何让它们与用户交互, 进而实现你的动作 如欲获得用户界面事件通知, 你需要做以下两件事情之一 : 定义一个事件侦听器并将其注册至视图 通常情况下, 这是你侦听事件的主要方式 View 类包含了一大堆命名类似 On< 什么什么 >Listener 的接口, 每个都带有一个叫做 On< 什么什么 >() 的回调方法 比如 : View.OnClickListener ( 用以处理视图中的点击 ), View.OnTouchListener ( 用以处理视图中的触屏事件 ), 以及 View.OnKeyListener ( 用以处理视图中的设备按键事件 ) 所以, 如果你希望你的视图在它被 点击 ( 比如选择了一个按钮 ) 的时候获得通知, 你就要实现 OnClickListener, 定义它的 onclick() 回调方法 ( 在其中进行相应处理 ), 并将它用 setonclicklistener() 方法注册到视图上 为视图覆写一个现有的回调方法 这种方法主要用于你自己实现了一个 View 类, 并想侦听其上发生的特定事件 比如说当屏幕被触摸 (ontouchevent()), 当轨迹球发生了移动 (ontrackballevent()) 或者是设备上的按键被按下 (onkeydown()) 这种方式允许你为自己定制的视图中发生的每个事件定义默认的行为, 并决定是否需要将事件传递给其它的子视图 再说一次, 这些是 View 类相关的回调方法, 所以你只能在你构建自定义组件时定义它们 如何在视图中处理用户交互请参见处理用户界面事件文档 菜单 Menus 应用程序菜单是应用程序用户界面中另外一个重要的组成部分 菜单为展现应用程序功能和设置提供了一个可靠的界面 按下设备上的 MENU 键会调出最普通的应用程序菜单 然而, 你也可以加入当用户长按一个项目时调出的上下文菜单 菜单也是用视图层次进行构架的, 但你不必自己定义这个架构 你只要为你的 Activity 定义 oncreateoptionsmenu() 和 oncreatecontextmenu() 回调方法, 并声明你想要包含在菜单中的项目就行了 Android 将为你的菜单自动创建视图层次, 并在其中绘入你的菜单项 菜单会自行处理它们的事件, 所以你不必为你菜单中的项目注册事件侦听器 当你菜单中的一项被选定时, 框架将自动调用 onoptionsitemselected() 或 oncontextitemselected() 方法

27 如同应用程序布局一样 你也可以在一个 XML 文件中定义你菜单中的项目 更多信息, 请参阅创建菜单 高级话题 Advanced Topics 一旦你对创建用户界面的基础了如指掌, 你就可以尝试着用一些高级功能来创建更加复杂的应用程序界面 适配器 适配器 Adapter 有时候你会想要用一些无法硬编码的信息来填充视图组 你想将源于外部的数据绑定到你的视图中 为达到这个目的, 你可以使用 AdapterView 作为你的视图组, 并用 Adapter 传来的数据初始化每个子视图并填入其中 AdapterView 对象是一个用给定的 Adapter 对象为基础构建它的子视图的 ViewGroup 实现 而 Adapter 在你的数据源 ( 可能是一个外部字符串数组 ) 和显示这些数据的 AdapterView 之间扮演着一个信使的角色 针对特定的任务有着很多不同的 Adapter 类实现, 比如 CursorAdapter 依据 Cursor 读出一个数据库的数据, 而一个 ArrayAdapter 则从任一个数组进行读取 想要了解如何运用 Adapter 填充你的视图, 请参见用 AdapterView 绑定至数据 风格与主题 风格与主题 Styles and Themes 或许你对标准工具的外表不是那么满意 为了解决这个问题, 你可以创建你自己的风格和主题 风格是一套包含一个或多个格式化属性的整体, 你可以把它们加诸于你布局中的单个元素之上 比如, 你可以定义一个包含特定文本字体大小和颜色的风格, 并将它单独施用于特定的视图元素 主题也是一套包含一个或多个格式化属性的整体, 但却应用于一个应用程序中的所有 Activity, 或单独一个 Activity 比如说, 你可以定义一个包含了特定窗口边框颜色和版面背景 以及一套字体大小和菜单颜色的主题 这个主题可以施用于特定的 Activity 抑或整个应用程序 风格与主题隶属于资源 Android 提供了一些默认的风格和主题供你使用, 你也可以定制你自己的风格和主题资源 想了解更多关于使用风格和主题的内容, 请参阅使用风格和主题文档 资源和资产 Resources and Assets

28 资源是 Android 应用程序不可或缺的部分 总体而言, 资源是你想包含和引入到应用程序里面的一些外部元素, 比如图片 音频 视频 文本字符串 布局 主题等 每个 Android 应用程序包含一个资源目录 (res/) 和资产目录 (assets/), 资产不经常被使用, 因为它们的应用程序很少 你仅在需要读取原始字节流时才需要保存数据为资产 资源和资产目录均驻留在 Android 项目树的顶端, 和源代码目录 (src/) 处在同一级上 资源和资产从表面上看没多大区别, 不过总体上, 在存储外部内容时资源用得更多 真正的区别在于任何放置在资源目录里的内容可以通过您的应用程序的 R 类访问, 这是被 Android 编译过的 而任何存放在资产目录里的内容会保持它的原始文件格式, 为了读取它, 你必须使用 AssetManager 来以字节流的方式读取文件 所以保持文件和数据在资源中 (res/) 中会更方便访问 在这篇文章中, 你将获取关于 Android 应用程序经常使用的标准资源类型以及如何在代码中引用方面的信息 资源和国际化 (Resources and Internationalization) 是第一步, 可以知道 Android 如何利用项目资源 然后, 可用资源类型 (Available Resource Types) 汇总描述了各种资源类型及其规格引用 资源和国际化 Resources and Internationalization 资源是外部文件 ( 即非源代码文件 ), 它们被你的代码使用, 并且在编译时被编译到你的应用程序中 Android 支持很多不同类型的资源文件, 包括 XML PNG 和 JPEG 文件 XML 文件会由于其所描述的内容不同而形式不同 该文档描述了所有支持的文件类型及每种类型的语法或格式 资源从源代码中被抽取出来, 基于效率考虑,XML 文件被编译成二进制 可以快速加载的形式 字符串, 同样被压缩为一种更富效率的存储形式 由于这些原因, 在 Android 平台中我们就有了这些不同的资源类型 这是一篇纯粹的技术性文档, 它和可用资源 (Available Resources) 一起覆盖了有关资源的众多信息 在使用 Android 时并不需要记住这篇文档, 但是当你需要它时你应该知道来这里寻找信息 介绍 Introduction 这个话题包含了与之相应的术语列表, 和一系列在代码中使用资源的实例 关于 Android 支持的所有资源类型的完整指南, 请查阅可用资源 (Available Resources) Android 资源系统记录应用程序中所有非代码资产 你可以使用 Resources 类来访问应用程序中的资源 ; 一般可以通过 Context.getResources() 获得这个 Resources 实例 一个应用程序的资源在生成 (build) 时被编译器编译到应用程序的二进制文件中 要使用一个资源, 你必须把它放置到源代码树中的正确位置, 并且生成 (build) 到你的应用程序中 作为

29 编译过程的一部分, 每个资源的标记都会被生成, 在你的源代码中可以使用这些标记 - 这允许编译器验证你的应用程序代码是否和你定义的资源相匹配 本部分的其余内容以一个在应用程序中如何使用资源的指南的形式组织 创建资源 Creating Resources Android 支持字符串 位图以及其他很多种类型的资源 每一种资源的语法 格式以及存放的位置, 都会根据其类型的不同而不同 通常, 你创建的资源一般来自于三种文件 :XML 文件 ( 除位图和 raw 之外的任何文件 ) 位图文件 ( 图像 ) 以及 Raw 文件 ( 除前面以外的其他东西, 如声音文件, 等等 ) 事实上,XML 文件也有两种不同的类型 : 被原封不动地编译进包内的文件和被 aapt 用来产生资源的文件 这里有一个每种资源类型的列表, 包括文件格式 文件描述以及 XML 文件类型的细节 你可以在你的项目中的 res/ 目录的适当的子目录中创建和保存资源文件 Android 有一个资源编译器 (aapt), 它依照资源所在的子目录及其格式对其进行编译 这里有一个每种资源的文件类型的列表, 关于每种类型的描述 语法 格式以及其包含文件的格式或语法见资源参考 表一 目录 目录 Directory 资源类型 资源类型 Resource Types res/anim/ XML 文件, 它们被编译进逐帧动画 (frame by frame animation) 或补间动画 (tweened animation) 对象 res/drawable/.png.9.png.jpg 文件, 它们被编译进以下的 Drawable 资源子类型中 : 要获得这种类型的一个资源, 可以使用 Resource.getDrawable(id) 位图文件 9-patches( 可变尺寸的位图 ) 为了获取资源类型, 使用 mcontext.getresources().getdrawable(r.drawable.imageid) 注意 : 放在这里的图像资源可能会被 aapt 工具自动地进行无损压缩优化 比如, 一个真彩色但并不需要 256 色的 PNG 可能会被转换为一个带调色板的 8 位 PNG 这使得同等质量的图片占用更少的资源 所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化 如果你想读取一个图像位流并转换成一个位图 (bitmap), 请把图像文件放在 res/raw/ 目录下, 这样可以避免被自动优化

30 res/layout/ res/values/ 被编译为屏幕布局 ( 或屏幕的一部分 ) 的 XML 文件 参见布局声明 (Declaring Layout) 可以被编译成很多种类型的资源的 XML 文件 注意 : 不像其他的 res/ 文件夹, 它可以保存任意数量的文件, 这些文件保存了要创建资源的描述, 而不是资源本身 XML 元素类型控制这些资源应该放在 R 类的什么地方 尽管这个文件夹里的文件可以任意命名, 不过下面使一些比较典型的文件 ( 文件命名的惯例是将元素类型包含在该名称之中 ): array.xml 定义数据 colors.xml 定义 color drawable 和颜色的字符串值 (color string values) 使用 Resource.getDrawable() 和 Resources.getColor() 分别获得这些资源 dimens.xml 定义尺寸值 (dimension value) 使用 Resources.getDimension() 获得这些资源 strings.xml 定义字符串 (string) 值 ( 使用 Resources.getString() 或者 Resources.getText() 获取这些资源 gettext() 会保留在 UI 字符串上应用的丰富的文本样式 ) styles.xml 定义样式 (style) 对象 res/xml/ res/raw/ 任意的 XML 文件, 在运行时可以通过调用 Resources.getXML() 读取 直接复制到设备中的任意文件 它们无需编译, 添加到你的应用程序编译产生的压缩文件中 要使用这些资源, 可以调用 Resources.openRawResource(), 参数是资源的 ID, 即 R.raw.somefilename 资源被编进最终的 APK 文件中 Android 创建了一个封装类, 叫做 R, 在代码中你可以使用它来引用这些资源 R 包含了根据资源文件的路径和名称命名的子类 全局资源说明 Global Resource Notes 一些资源允许你定义颜色值 Android 接受的颜色值可以使用多种 web 样式的形式 -- 以下几种包含十六进制常数的形式 :#RGB #ARGB #RRGGBB #AARRGGBB

31 所有颜色值支持设置透明度 (alpha channel value), 前两位的十六进制数指定了透明了 0 在透明度值是全透明 默认值是不透明 使用资源 Using Resources 这一部分描述如何使用你创建的资源 它包含以下主题 : 代码中使用资源 - 如何在你的代码中调用资源进行实例化 从其他资源中引用资源../../Docs/android_dev_guide/android_dev_guide/developer.android.com/guide/t opics/resources/resources-i18n.html - ReferencesToResources - 你可以从其他资源中引用资源 这就使得你可以重用资源中公共资源值 支持针对交替配置的交替资源 - 你可以根据主机硬件的语言或显示配置指定加载不同的资源 在编译时,Android 产生一个名为 R 的类, 它包含了你的程序中所有资源的资源标识符 这个类包含了一些子类, 每一个子类针对一种 Android 支持的资源类型, 或者你提供的一个资源文件 每一个类都包含了已编译资源的一个或多个资源标识符, 你可以在代码中使用它们来加载资源 下面是一个小的资源文件, 包含了字符串 布局 ( 屏幕或屏幕的一部分 ) 和图像资源 注意 : R 类是一个自动产生的文件, 并没有设计为可以手动编辑 当资源更新时, 它会根据需要重新产生 package com.google.android.samples; public final class R { public static final class string { public static final int greeting = 0x e; public static final int start_button_text = 0x ; public static final int submit_button_text = 0x ; public static final main_screen_title = 0x a; }; public static final class layout { public static final int start_screen = 0x ; public static final int new_user_pane = 0x ; public static final int select_user_list = 0x ; }; public static final class drawable { public static final int company_logo = 0x ;

32 public static final int smiling_cat = 0x ; public static final int yellow_fade_background = 0x ; public static final int stretch_button_1 = 0x ; }; }; 在代码中使用资源 Using Resources in Code 在代码中使用资源, 只是要知道所有资源 ID 和你的被编译的资源是什么类型 下面是一个引用资源的语法 : R.resource_type.resource_name 或者 android.r.resource_type.resource_name 其中 resource_type 是 R 的子类, 保存资源的一个特定类型 resource_name 时在 XML 文件定义的资源的 name 属性, 或者有其他文件类型为资源定义的文件名 ( 不包含扩展名 ) 每一种资源类型都会根据其类型加为一个特定的 R 子类 ; 要了解 R 的哪一个子类是关于你的资源类型的, 请参考资源参考 (resource reference) 文档 被你的应用程序编译的资源可以不加包名引用 ( 就像 R.resource_type.resource_name 这样简单 ) Android 包含了很多标准资源, 如屏幕样式和按钮背景 要在代码中引用这些资源, 你必须使用 android 进行限定, 如 android.r.drawable.button_background 这里有一些在代码中使用已编译资源的正确和错误用法的例子 // Load a background for the current screen from a drawable resource. this.getwindow().setbackgrounddrawableresource(r.drawable.my_ba ckground_image); // WRONG Sending a string resource reference into a // method that expects a string. this.getwindow().settitle(r.string.main_title); // RIGHT Need to get the title from the Resources wrapper. this.getwindow().settitle(resources.gettext(r.string.main_title )); // Load a custom layout for the current screen. setcontentview(r.layout.main_screen);

33 // Set a slide in animation for a ViewFlipper object. mflipper.setinanimation(animationutils.loadanimation(this, R.anim.hyperspace_in)); // Set the text on a TextView object. TextView msgtextview = (TextView)findViewByID(R.id.msg); msgtextview.settext(r.string.hello_message); 引用资源 References to Resources 在属性 ( 或资源 ) 中提供的值也可以作为资源的引用 这种情况经常使用在布局文件中, 以提供字符串 ( 因此它们可以被本地化 < 将 UI 上的字符串放在一个单独的文件中, 在做国际化时只需要将它们翻译成相应的语言版本, 然后应用程序根据 locale 信息加载相应的字符串文件 译者注 >) 和图像 ( 它们存在于另外的文件中 ), 虽然引用可以是任何资源类型, 包括颜色和整数 例如, 如果我们有颜色资源 (color resources), 我们可以编写一个布局文件, 将文本的颜色 设为那些资源中包含的值 : <?xml version="1.0" encoding="utf-8"?> <EditText id="text" xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textcolor="@color/opaque_red" android:text="hello, World!" /> 注意, 前缀引入对一个资源的引用 形式中后面的文本是资源的名称 在这种情况下, 我们不需要指定包名, 因为我们引用的是我们自己包中的资源 要引用系统资源, 你应该这样写 : <?xml version="1.0" encoding="utf-8"?> <EditText id="text" xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textcolor="@android:color/opaque_red" android:text="hello, World!" />

34 另外一个例子, 当在布局文件中提供字符串以便于本地化时, 你应该一直使用资源引用 <?xml version="1.0" encoding="utf-8"?> <EditText id="text" xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 这种技巧还可以用来创建资源之间的引用 例如, 我们可以创建新的 drawable 资源作为已存在资源的别名 <?xml version="1.0" encoding="utf-8"?> <resources> <drawable e> </resources> 引用主题属性 References to Theme Attributes 另外一种资源值允许你引用当前主题中的属性的值 这个属性值只能在样式资源和 XML 属性中使用 ; 它允许你通过将它们改变为当前主题提供的标准变化来改变 UI 元素的外观, 而不是提供具体的值 如例中所示, 我们在布局资源中使用这个特性将文本颜色设定为标准颜色的一种, 这些标准的颜色都是定义在基本系统主题中 <?xml version="1.0" encoding="utf-8"?> <EditText id="text" xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textcolor="?android:textdisabledcolor"

35 /> 注意, 这和资源引用非常类似, 除了我们使用一个? 当你使用这个标记时, 你就提供了属性资源的名称, 它将会在主题中被查找 因为资源工具知道需要的属性资源, 所以你不需要显示声明这个类型 ( 如果声明, 其形式就是?android:attr/android:textDisabledColor) 除了使用这个资源的标识符来查询主题中的值代替原始的资源, 形式一致 :?[namespace:]type/name, 这里类型可选 使用系统资源 Using System Resources 在系统中的包含了很多应用程序可以使用的资源 所有的这些资源都在 android.r 类下定义 例如, 使用下面的代码你可以在屏幕上显示标准应用程序的图标 : public class MyActivity extends Activity { public void onstart() { requestscreenfeatures(feature_badge_image); super.onstart(); setbadgeresource(android.r.drawable.sym_def_app_icon); } } 以相似的方式, 下面的代码将对你的屏幕应用系统定义的标准 绿色背景 视觉处理 public class MyActivity extends Activity public void onstart() { super.onstart(); settheme(android.r.style.theme_black); } } 替换资源 ( 为了可替换的资源和配置 )Alternate Resources

36 你可以根据 UI 语言或者设备上的硬件配置, 为你的产品提供不同的资源 注意, 尽管你可以包含不同的字符串 布局和其他资源, 然而 SDK 没有方法供你指定加载哪一个替换资源 Android 检测关于硬件和未知的适当配置, 然后适当加载 用户可以使用设备上的设置面板选择替换语言设置 为了包含替换资源, 需要创建平行的资源文件夹, 而文件夹的名字后面要使用限定符表示它要应用的配置 ( 语言 屏幕方向等等 ) 例如, 下面的工程包含了字符串资源, 一个用于英语, 而另外一个用于法语 : MyApp/ res/ values-en/ strings.xml values-fr/ strings.xml Android 支持几种类型的限定符, 每一个都有不同的值 把它们连接在资源文件夹名称的后面, 使用短横线隔开 你可以为每一个文件夹名称添加多个限定符, 但是它们必须按照这里列出的顺序排列 例如, 一个包含 drawable 资源的文件夹, 对于一个完整详细的配置, 可能看起来像 : MyApp/ res/ values-en/ drawable-en-rus-port-160dpi-finger-qwerty-dpad-480x320/ 更典型的是, 你只需指定一些特定的要定义资源的配置选项 你可以放弃完整列表中的任何值, 但同时要保证剩下的值仍然保持列表中的顺序 MyApp/ res/ drawable-en-rus-finger/ drawable-port/ drawable-port-160dpi/ drawable-qwerty/ 表 2 列举了合法的限定符目录名称, 按优先级排序 下表中列举在上面的限定符比下面的具有更高的优先级, 如同 Android 如何查找最匹配的目录中所描述的那样

37 表 2 限定符 限定符 Qualifier 值 Values 移动国家码 MCC 和移动网络码 MNC 手机设备 SIM 卡上的移动国家码和移动网络码 比如 mcc310-mnc004 ( 美国,Verizon 品牌 ); mcc208-mnc00 ( 法国, Orange 品牌 ); mcc234-mnc00 ( 英国,BT 品牌 ). 如果这个设备使用一个无线连接 (GSM 电话 ), 则 MCC 来自 SIM 卡, 而 MNC 来自该设备将要附着的网络 你有时会仅使用 MCC, 例如包含特定国家合法资源在您的应用程序中 如果您的应用程序指定了 MCC/MNC 组合的资源, 这些资源仅在 MCC 和 MNC 都匹配的时候才能使用 语言和区域 Language and region 两个字母的 ISO 语言码和 ISO alpha-2 区域码 ( 以 "r" 为前缀 ) 比如 en-rus, fr-rfr, es-res. 这个代码是大小写敏感的 : 语言码是小写字母, 国家码是大写字母 你不能单独指定一个区域, 但是你可以单独指定一个语言, 比如 en, fr, es, zh. 屏幕方向 Screen orientation 纵向, 横向, 正方形 (port, land, square) 屏幕像素密度 Screen pixel density 92dpi, 108dpi 等. 当 Android 选择使用哪个资源时, 它对屏幕 像素密度的处理和其它限定符不同 在文章后面描述的步骤 1Android 如何查找最匹配的目录中, 屏幕密度总被认为是匹配的 在步骤 4 中, 如果被考虑的限定符是屏幕密度,Android 将选择在那个位置的最佳匹配, 而无需继续步骤 5 触摸屏类型 Touchscreen type 非触摸式, 触摸笔, 手指 (notouch, stylus, finger) 键盘可用方式 Whether the keyboard is available to the user 外在键盘, 隐藏键盘, 软键盘 (keysexposed, keyshidden, keyssoft) 如果你的应用程序有一个特定的资源只能通过软件盘使用, 则使用

38 keyssoft 值, 如果没有 keyssoft 资源可用 ( 只有 keysexposed 和 keyshidden) 并且该设备显示了一个软键盘, 那么系统将使用 keysexposed 资源 首选文本输入方法 Primary text input method 首选非触摸式导航方法 Primary non-touchscreen navigation method 不支持按键, 标准键盘,12 键 (nokeys, qwerty, 12key) 不支持导航, 滑板, 跟踪球, 滚轮 (nonav, dpad, trackball, wheel) 屏幕分辨率 Screen dimensions 320x240, 640x480, 等. 更大的分辨率必须先被指定 SDK 版本 SDK version 设备支持的 SDK 版本, 比如 v3 Android1.0 SDK 是 v1,1.1sdk 是 v2,1.5sdk 是 v3 小版本 (Minor version) 你目前还不能指定小版本, 它总是被设置为 0 这个列表不包含设备特有的参数比如载波, 品牌, 设备 / 硬件, 或者制造商 所有应用程序需要知道的设备信息均通过上表中的资源限定符编码 所有资源目录, 许可的和未经许可的, 都存放在 res/ 目录下 下面是一些关于许可的资源目录名称的指导原则 : 你可以指定多个限定符, 用破折号分开 比如,drawable-en-rUS-land 会被应用在美国英语的横向手机设备中 限定符必须符合表 2 中列举的顺序 比如 : 正确的 :values-mcc460-nokeys/ 错误的 :values-nokeys-mcc460/ 限定符的值大小写敏感 比如一个纵向特定的 drawable 目录必须命名为 drawable-port, 不可以是 drawable-port 或 drawable-port 每个限定符类型仅支持一个值 比如, 如果你想使用为法国和西班牙使用相同的 drawable 文件, 你得需要两个资源目录, 如 drawable-res/ 和 drawable-rfr/, 包含相同的文件 你不能使用一个名为 drawable-res-rfr 的目录 限定符不能嵌套使用 比如, 你不能使用 res/drawable/drawable-en 资源怎么在代码中使用 How resources are referenced in code

39 所有的资源均通过它们简单未经修饰的名字在代码或资源引用语法中引用 所以如果一个资源命名如下 : MyApp/res/drawable-port-92dpi/myimage.png 它会被这样引用 : R.drawable.myimage (XML) 如果有多个 drawable 目录可用, Android 将会选择其一 ( 如下所述 ) 并从中加载 myimage.png Android 如何查找最匹配的目录 How Android finds the best matching directory Android 将从各种潜在的资源中挑选出哪个应该在运行时使用, 这取决于设备的当前配置 这里的例子假定使用了如下的设备配置 : 区域 Locale = en-gb 屏幕方向 Screen orientation = port 屏幕像素密度 Screen pixel density = 108dpi 触摸屏类型 Touchscreen type = notouch 首选文本输入方式 Primary text input method = 12key 下面说明了 Android 如何作出选择 : 1. 排除和设备配置冲突的资源文件 比如, 假定如下的 drawables 资源目录可用 那么 drawable-fr-rca/ 会被排除, 因为它和设备的区域配置冲突 MyApp/res/drawable/ MyApp/res/drawable-en/ MyApp/res/drawable-fr-rCA/ MyApp/res/drawable-en-port/ MyApp/res/drawable-en-notouch-12key/ MyApp/res/drawable-port-92dpi/ 例外 : 屏幕像素密度是唯一不用来排除文件的限定符 即使设备屏幕密度是 108dpi, drawable-port-92dpi/ 也不会被从列表中排除, 因为在这里所有的屏幕密度都被视为匹配 2. 从表 2 中选取最高优先级的限定符 ( 从 MCC 开始, 然后自该列表依次往下 ) 3. 有没有哪个可用的资源目录包含了这个限定符?

40 如果没有, 回到步骤 2 然后查看表 2 中所列的下一个限定符 在我们的例子中, 答案是 没有 直到我们到达语言这一级 If No, return to step 2 and look at the next qualifier listed in Table 2. In our example, the answer is "no" until we reach Language; 如果有, 则跳转到步骤 4 4. 排除不包含这个限定符的资源目录, 在我们的例子中, 我们排除所有不包含语言的目录 MyApp/res/drawable/ MyApp/res/drawable-en/ MyApp/res/drawable-en-port/ MyApp/res/drawable-en-notouch-12key/ MyApp/res/drawable-port-92dpi/ MyApp/res/drawable-port-notouch-12key 例外 : 如果询问中的限定符是屏幕像素密度,Android 会选择最接近匹配于设备的选项, 而且选择过程将会完成 一般而言,Android 会倾向于缩小一个大图片而不是放大一个小图片 5. 回头重复步骤 2,3,4 直到只剩下一个选择 在本例中, 屏幕方向是下一个要比较的限定符, 我们排除没有指定屏幕方向的资源 现在只剩下一个选择, 那就是它了 当 drawables 被这个应用程序调用时,Android 系统会从下面这个目录中加载资源 : MyApp/res/drawable-en-port/ 提示 Tip: 限定符的优先权比匹配的数目要重要得多 比如, 在上面的步骤 4 中, 列表中最后的选项包含三个限定符和设备匹配 ( 方向, 触摸屏类型, 和输入法 ), 而 drawable-en 只有一个参数匹配 ( 语言 ) 但是, 语言拥有更高的优先权, 所以 drawable-port-notouch-12key 被排除出局 下面的流程图总结了 Android 如何选择资源目录来加载的过程 :

41 术语 Terminology 资源系统将一系列分散内容集合在一起形成最终的完整的资源功能, 去帮助我们了解整个系统 这里有一些核心概念以及组件的概要说明, 你在开发中将可能使用到 : 资产 Asset: 应用程序的独立的数据块 这包含所有从 java 程序编译成的目标文件, 图像 ( 例如 PNG 图片 ), XML 文件等等 这些文件以一种特定的方式组织在一起, 在程序最后打包时, 它们被捆绑进一个单独的 ZIP 文件里 aapt::android 最终文件打包工具 这个工具产生最终程序的 ZIP 文件 除了将资产元数据文件收集在一起, 它也把资源定义解析到最终的二进制数据里 资源表 Resource Table: aapt 工具产生的特殊的文件, 描述了所有在程序 / 包里的资源 这个文件可以通过资源类来访问 ; 它不能直接和应用程序接触 资源 Resource: 资源表里一条记录描述的是单一的命名值 大体上, 资源分成两种 : 元资源和包资源. 资源标识符 Resource Identifier: 在资源表里所有的资源都被唯一的整数标识着 所有的代码中 ( 资源描述,XML 文件,Java 源代码 ) 你可以直接使用符号名代替真实的整数数值

42 元资源 Primitive Resource: 所有元资源都可以被写成一个简单的字串, 使用一定的格式可以描述资源系统里各种不同的基本类型 : 整数, 颜色, 字串, 其他资源的引用, 等等 像图片以及 XML 描述文件这些复杂资源, 被以元字串资源储存, 它们的值就是相关最终数据文件的路径 包资源 Bag Resource: 一种特殊类型的资源, 不是简单的字符串, 而是一个容纳名字 / 数值对的任意列表 每个名字本身就是资源标识, 每个值可以容纳相同类型的字符串格式的数据作为一个普通资源 包资源支持继承 : 一个包里的数据能从其他包里继承, 有选择地替换或者扩展能产生它自己的内容 种类 Kind: 资源种类是对于不同需求的资源标识符而言的 例如, 绘制资源类常常实例化绘制类的对象, 所以这些包含颜色以及指向图片或 XML 文件的字符串路径数据是原始数据 其它常见资源类型是字符串 ( 本地化字符串 ), 颜色 ( 基本颜色 ), 布局 ( 一个指向 XML 文件的字串路径, 它描述的是一个用户界面 ) 以及风格 ( 一个描述用户接口属性的包装资源 ) 还有一个标准的 attr 资源类型, 它定义了命名包装数据以及 XML 属性的资源标识符 风格 Style: 包含包装资源类型的名字常常用来描述一系列用户接口属性 例如, 一个 TextView 的类可能会有一个描述界面风格的类来定义文本大小, 颜色以及对齐方式 在一个界面布局的 XML 文件中, 可以使用 风格 属性来确定整体界面风格, 它的值就是风格资源的名字 风格类 Style Class: 这里将详述一些属性资源类 其实数据不会被放在资源表本身, 通常在源代码里它以常量的形式出现, 这也可以使你在风格类或者 XML 的标签属性里方便找到它的值 例如,Android 平台里定义了一个 视图 的风格类, 它包含所有标准视图的属性 : 画图区域, 可视区域, 背景等 这个视图被使用时, 它就会借助风格类去从 XML 文件取得数据并将其载入到实例中 配置 Configuration: 对许多特殊的资源标识符, 根据当前的配置, 可以有多种不同的值 配置包括地区 ( 语言和国家 ), 屏幕方向, 屏幕分辨率, 等等 当前的配置用来选择当资源表载入时哪个资源值生效 主题 Theme: 一个标准类型的资源能为一个特殊的上下文提供全局的属性值 例如, 当应用工程师写一个活动时, 他能选择一个标准的主题去使用, 白色的或者黑色的 ; 这个类型能提供很多信息, 如屏幕背景图片 / 颜色, 默认文本颜色, 按钮类型, 文本编辑框类型, 文本大小, 等 当布置一个资源布局时, 控件 ( 文本颜色, 选中后颜色, 背景 ) 的大部分设置值取自当前主题 ; 如果需要, 布局中的风格以及属性也可以从主题的属性中获得 覆盖层 Overlay: 资源表不能定义新类型的资源, 但是你可以在其他表里替换资源值 就像配置 值, 这可以在装载时候进行 ; 它能加入新的配置值 ( 例如, 改变字串到新的位置 ), 替换现有值 ( 例如, 将标准的白色背景替换成 "Hello Kitty" 的背景图片 ), 修改资源包 ( 例如修改主题的字体大小 白色主题字体大小为 18pt) 这实际上允许用户选择设备不同的外表, 或者下载新的外表文件

43 资源引用 Resource Reference 可用资源 Available Resources 文档提供了一个各种类型资源的详细列表, 并描述了如何在 Java 代码中或其他引用中使用它们 国际化和本地化 Internationalization and Localization 即将完成 : 国际化和本地化是非常关键的, 但现在的 SDK 还没有完全准备好 当 SDK 成熟时, 这个章节会包含 Android 平台国际化和本地化的相关信息 在此期间, 让我们先从把资源外部化以及练习以好的结构创建和使用资源开始做起吧 意图和意图过滤器 Intents and Intent Filters 一个应用程序的三个核心组件 - 活动, 服务和广播接收器是通过消息即意图 (Intents) 来激活的 Intent 息传送是相同或不同应用中组件运行时晚绑定的一种机制 意图本身, 一个意图对象, 是一个包含被执行操作抽象描述的被动的数据结构 - 或者, 对于广播而言, 是某件已经发生并被声明的事情的描述 存在不同的机制来传送意图到每种组件中 : 一个意图对象是传递给 Context.startActivity() 或者 Activity.startActivityForResult() 来启动一个活动或者让一个存在的活动去做某些新的事情 一个意图对象是传递给 Context.startService() 来发起一个服务或者递交新的指令给运行中的服务 类似的, 一个意图能被传递给 Context.bindService() 来在调用组件和一个目标服务之间建立连接 作为一个可选项, 它可以发起这个服务如果还没运行的话 传递给任意广播方法 ( 例如 Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或者 Context.sendStickyBroadcast()) 的意图对象被传递给所有感兴趣的广播接收者 许多种广播产生于系统代码 在每个例子里,Android 系统找到合适的活动, 服务, 或者一组广播接收者来回应这个意图, 必要时实例化它们 这些消息传送系统没有重叠 : 广播意图仅被传递给广播接收者, 永远不会给活动或者服务 一个传送给 startactivity() 的意图是只会被传递给一个活动, 永远不会给一个服务或广播接收者, 如此类推

44 这篇文档以意图对象的描述开始, 然后描述 Android 映射意图到组件的规则 - 如何解决哪个组件应该接收一个意图消息 对于没有显式命名一个目标组件的意图, 这个过程包括对照与潜在目标相关联的意图过滤器来测试这个意图对象 意图对象 Intent Objects 一个意图 Intent 对象是一堆信息 它包含接收这个意图的组件感兴趣的信息 ( 例如将要采取的动作和操作的数据 ) 再加上 Android 系统感兴趣的信息 ( 例如应该处理这个意图的组件类别和如何启动一个目标活动的指令 ): 组件名称 组件名称 Component name 应该处理这个意图的组件名字. 这个字段是一个 ComponentName 对象 - 一个组合物 : 目标组件的完全合格的类名 ( 比如 "com.example.project.app.freneticactivity") 以及应用程序描述文件中设置的组件所在包的名字 ( 比如, "com.example.project"). 这个组件名字的包部分和描述文件中设置的包名字不一定要匹配 组件名字是可选的 如果被设置了, 这个意图对象将被传递到指定的类 如果没有, Android 使用另外的意图对象中的信息去定位一个合适的目标 - 请看本文稍后描述的意图解析 Intent Resolution 组件名字通过如下方法 :setcomponent(),setclass(), 或者 setclassname() 设置并通过 getcomponent() 读取 动作 动作 Action 一个将被执行的动作的字符串命名 - 或者, 对于广播意图而言, 是发生并被报告的动作 这个意图类定义了一些动作常量, 包含下面这些 : 常量 目标组件 Action ACTION_CALL 活动开始一个电话呼叫 ACTION_EDIT 活动显示数据以给用户编辑 ACTION_MAIN 活动 开始任务的初始活动, 没有输入数据也没有输出返回

45 ACTION_SYNC 活动同步服务器与移动设备之间的数据 ACTION_BATTERY_LOW ACTION_HEADSET_PLUG ACTION_SCREEN_ON 广播接收器 广播接收器 广播接收器 电池低电量警告 耳机插拔 屏幕开启 ACTION_TIMEZONE_CHANGED 广播接收器 时区变化 通过查看 Intent 类描述可获得一个通用动作的预定义常量列表 其他动作被定义在 Android API 的其他地方 你也可以自定义动作字符串来激活应用程序中的组件 那些你所创建的动作字符串应该以应用程序包名作为前缀 - 例如 : "com.example.project.show_color". 动作很大程度上决定了意图其他部分如何被组织 - 尤其是数据 data 和附加字段 extras- 很像一个方法名决定了一些参数和返回值. 因此, 一个好的想法是使用尽可能具体的动作名并和意图的其他字段紧密联系起来 换句话说, 为您的组件能处理的意图对象定义一个整体的协议而不是定义一个孤立的动作 一个意图对象里的动作可以通过 setaction() 方法设置和通过 getaction() 方法读取. 数据 数据 Data 想要操作的数据统一资源标识符 (URI) 和那种数据的多用途互联网邮件扩展 (MIME). 不同的动作伴随着不同种类的数据规格 例如, 如果动作是 ACTION_EDIT, 数据字段会包含可编辑文档的 URI; 如果动作是 ACTION_CALL, 数据字段会是一个电话号码 : 含呼叫电话号码的 URI; 类似的, 如果动作是 ACTION_VIEW 而且数据字段是一个 那么接收到的活动将会是下载并显示 URI 所引用数据的请求 当匹配一个意图到一个能处理数据的组件时, 除了它的 URI 外, 通常需要知道数据类型 ( 它的 MIME 类型 ) 比如, 一个能显示图片的组件不应该被要求去播放一个声音文件 在很多情况下, 这个数据类型可以从 URI 里推断出来 - 尤其是 content:uris, 这意味着数据被存放在设备上而且由一个内容提供者控制着 ( 参阅 separate discussion on content providers). 但类型可以在意图对象里显示的设置 setdata() 方法指定数据只能为一个 URI,

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

01_Service

01_Service 移动平台应用软件开发 Service 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年 什么是 Service 与 Activity 一样, 同属 Android 基本组件 后台运行, 不与用户交互, 没有可视化界面 最常见的 Service 如 : 在后台播放歌曲 后台执行文件的下载 同样需在 AndroidManifest.xml

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Microsoft Word - Android开发指南中文版.doc

Microsoft Word - Android开发指南中文版.doc Android 开发指南中文版 - 应用程序框架 iefreer@hotmail.com 2009/9/10 个人主页 : http://blog.csdn.net/iefreer 本文是对 Android SDK1.5 版的英文开发资料 Android Development Guide 一文应用程序框架部分的翻译, 覆盖了 Android 应用开发所有主要的概念 部分内容整理自网络 本文仅用于技

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Microsoft Word - 第1章 Android基本概念.docx

Microsoft Word - 第1章 Android基本概念.docx Android 系 统 下 Java 编 程 详 解 作 者 : 华 清 远 见 第 1 章 Android 基 本 概 念 本 章 简 介 本 章 主 要 介 绍 Android 基 本 概 念 方 面 的 内 容, 包 括 Android 平 台 特 性 Android 系 统 架 构 Android 开 发 框 架 和 Android 开 发 环 境 搭 建 1.1 Android 简 介 Android

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21

Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21 Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21 Outlines for Today Future Planning Review System Architecture Dev. Tools & Making the First App Project Structure & File Details Application

More information

Android Service

Android Service Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了

More information

为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity Service Intent Broadcast R

为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity Service Intent Broadcast R 移动平台应用软件开发 Intent( 意图 ) 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之 臺 北 市 大 安 高 級 工 業 職 業 學 校 資 訊 科 一 百 零 一 學 年 度 專 題 製 作 報 告 ------ 以 Android 製 作 ------ ----- 連 線 塔 防 遊 戲 ------ Tower defense game using Internet technology 班 級 : 資 訊 三 甲 組 別 : A9 組 組 員 : 葉 冠 麟 (9906129)

More information

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

移动终端开发与应用

移动终端开发与应用 移动终端开发与应用 第一节 Android 系统的信使 :Intent 2 Intent 概述 Android 系统从诞生之初就不允许直接访问 4 大组件 (Activity Service Broadcast Receiver 和 Content Provider) 而是通过 Intent 对象来跟各种组件进行交互 Intent 对象被应用于 4 大组件中的 3 个 (Activity Service

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

* r p . 4 6 12 3 5 7 8 9bk bm btbsbrbqbp bo bn bl [ ] [ ] [ ] [ ] [SET] 1 2 3 4 5 6 7. cmcl ck 8 9 0 bk bl bm bn bo 1 2 1 2+ - bp bq 8 2 4 6 br r bs p bt ck cl cm 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

Lecture01_Android介绍

Lecture01_Android介绍 移动平台应用软件开发 Android 介绍 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年秋北京 Android是什么 Android不仅仅是一个操作系统 它更是一个完整的软件框 架 Android基于Linux内核 2005年Google公司收购了Android公司 Google公司选择使用Apache许可证开放Android源码

More information

1. 请描述下Activity的生命周期。

1.    请描述下Activity的生命周期。 1. 请描述下 Activity 的生命周期 必调用的三个方法 :oncreate() --> onstart() --> onresume(), 用 AAA 表示 (1) 父 Activity 启动子 Activity, 子 Actvity 退出, 父 Activity 调用顺序如下 AAA --> onfreeze() --> onpause() --> onstop() --> onrestart()

More information

01

01 ZEBRA 技术白皮书 条码编码 101 相关知识介绍 引言 20 70 数据 80 20 90 (JIT) AIAG EIA HIBCC HAZMAT 条码的优势提高数据准确性 99% 85% / / 提升效率 / 2 Zebra Technologies 保持一致性 ID 改进库存和资产管理 成本 / 效益分析 ID ID ID (ERP) RFID Zebra Technologies 3 ID

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63> 基 于 Android 平 台 的 电 子 拍 卖 系 统 摘 要 本 电 子 拍 卖 系 统 其 实 就 是 一 个 电 子 商 务 平 台, 只 要 将 该 系 统 部 署 到 互 联 网 上, 客 户 都 可 以 在 该 系 统 上 发 布 想 出 售 的 商 品, 也 可 以 对 拍 卖 中 的 商 品 参 与 竞 价 整 个 过 程 无 须 人 工 干 预, 由 系 统 自 动 完 成 本

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品 Autodesk Product Design Suite Standard 20122 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品设计 Autodesk Product Design Suite Standard 版本包包括以下软件产产品

More information

建模与图形思考

建模与图形思考 F06_c 观摩 :ContentProvider 基於軟硬整合觀點 架构與 DB 引擎移植方法 ( c) By 高煥堂 4 通用性基类 ContentProvider 基於軟硬整合觀點 的使用范例 刚才的范例里, 我们直接使用 DataPersist 类的接口来与 SQLite 沟通 本节将替 DataPersist 配上 ContentProvider 基类, 让 Client 能透过 ContentProvider

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

手说TTS开发指南

手说TTS开发指南 手说 TTS 开发指南 v1.3 2011 年 6 月 版权所有 : 手说工作室 shoushuo.com 版本时间作者说明 1.0 2010-11-15 张波 1.1 2010-12-27 在 ondestroy 方法 unbindservice 1.2 2010-12-30 1.3 2011-6-12 去掉 TTS 初始化 ; ttsservice.initialize() 方法调用添加接口方法

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

( 一 ) 外来农民进入城市的主要方式, %,,,,,, :., 1,, 2., ;,,,,,, 3.,,,,,, ;,,, ;.,,,,,,,,,,,,,,,,,,,,,, :,??,?? ( 二 ) 浙江村 概况.,,,,,, 1,, 2,, 3

( 一 ) 外来农民进入城市的主要方式, %,,,,,, :., 1,, 2., ;,,,,,, 3.,,,,,, ;,,, ;.,,,,,,,,,,,,,,,,,,,,,, :,??,?? ( 二 ) 浙江村 概况.,,,,,, 1,, 2,, 3 : 王汉生刘世定孙立平项飚 本文从农村人口进入城市的方式这一新的视角, 对北京著名的外来农村人口聚 居区 浙江村 的形成过程和基本状况进行了生动描述和深入分析 指出 : 浙江村的独特之处在于它不同于一般意义上的 劳动力 的流动, 它是带着综合性资源的 经营者的流动 浙江村村民进入城市的过程是不断寻找市场和开拓市场的过程, 并 在城市中形成了一个以聚居为基础的产业加工基地, 作者将这种类型的流动称为产

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO Car DVD New GUI IR Flow User Manual V0.1 Jan 25, 2008 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com Important Notice SUNPLUS

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

Android 框架虚拟化实战 董福源 360 手机卫士 2017.thegiac.com

Android 框架虚拟化实战 董福源 360 手机卫士 2017.thegiac.com Android 框架虚拟化实战 董福源 360 手机卫士 什么是虚拟化 原生 apk 在封闭系统内 免安装运行 Android 系统的一种沙箱技术 技术架构 Sandbox apps Android OS 目录 Sandbox apps Android OS Activity 插件化 只能启动 Manifest 中声明的 activity 占坑方案 欺骗 AMS Activity 启动过程 ContentImpl

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

IDEO_HCD_0716

IDEO_HCD_0716 IDEO HCD Toolkit Tencent CDC ...? Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC

More information

1

1 内 容 提 要 作 为 Google 开 发 的 全 新 开 源 手 机 平 台,Android 发 展 如 火 如 荼 本 书 通 过 大 量 代 码 秘 诀 全 面 详 尽 地 讲 述 了 Android 开 发 技 术 从 activity 和 intent 基 础 知 识 开 始, 到 线 程 服 务 broadcast receiver 以 及 alert 警 告 框, 再 到 用 户 界

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜

李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜 略论英国移民族群认同的发展和走向 李 琼 李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜 年 外国文学 第 期 这些天来 我觉得来到这个国家 就像是和魔鬼签了协议

More information

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作 * 夏传玲 : 本文简要回顾了国内外定性研究在最近 多年的发展概况, 总结 了定性研究的六个发展趋势和分析策略上的三种流派 在上述两种背景下, 本文探讨了计算机辅助的定性分析给定性研究带来的机遇和挑战, 特别是它和手工操作对比时的优势和劣势, 以及应用这种定性分析技术所可能面临的困难 : 定性研究定性分析 文化差异,, (, ),,,, ( - ) ( - ) ( - ) ( - ) ( - ) (

More information

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1 Chapter 01 Photoshop CS6 的基本操作 本章内容 1.1 Photoshop 的应用领域 1.6 控制面板的显示与隐藏 1.2 位图和矢量图的特性 1.7 新建 打开与保存文件 1.3 像素和分辨率的关系 1.8 图像的缩放 1.4 色彩模式 1.9 屏幕显示模式 1.5 Photoshop CS6 界面 1.10 计算机图形图像常用的色彩模式 Photoshop CS6 艺术设计案例教程

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

Microsoft Word - Broker.doc

Microsoft Word - Broker.doc Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

劳动保护与医疗保健 第 二 章 止标志共 23 个 劳 动 安 全 技 术 22 2 警告标志 由于三角形引人注目 故用作 警告 标志 警告人们注意可能发生的多种危险 三角的背景使用黄色 三角图形和三角内的图像均用黑色描 绘 黄色是有警告含义的颜色 在对比色黑色的衬托下 绘成的 警告标志 就更引人注目 3 指令标志 在圆形内配上指令含义的颜色 蓝 色 并用白色绘制必须执行的图形符号 构成 指令标志

More information

Xcode 4.6 Dmg File. arts related Airway array tiene saison Site mentored

Xcode 4.6 Dmg File. arts related Airway array tiene saison Site mentored Xcode 4.6 Dmg File ->->->-> http://shurll.com/9xx2x 1 / 5 2 / 5 6,,,months,,,ago,,,... xcode4.6,,,-,,,how,,,download,,,xcode,,,dmg,,,file?,,,-,,,stack,,,overflow,,,xcode4. 6,,,-,,,how,,,download,,,xcode,,,dmg,,,file?,,,-,,,Stack,,,Overflow,,,xcode6_beta2.dmg

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

Android Fragment

Android Fragment Android Fragment 建國科技大學資管系饒瑞佶 2017/10 V1 Android 3.0 後才支援 Fragment 解決部分 App 適應螢幕大小的問題 它類似於 Activity, 可以像 Activity 可以擁有自己的版面設計, 也和 Activity 一樣有自己的生命週期 ( 具備 oncreate() oncreateview() 與 onpause() 方法 ) LifeCycle

More information

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 : EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

1. 2. Flex Adobe 3.

1. 2. Flex Adobe 3. 1. 2. Flex Adobe 3. Flex Adobe Flex Flex Web Flex Flex Flex Adobe Flash Player 9 /rich Internet applications/ria Flex 1. 2. 3. 4. 5. 6. SWF Flash Player Flex 1. Flex framework Adobe Flex 2 framework RIA

More information

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M ASP.NET MVC Visual Studio 2017 1 1-4 MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\MvcExamples firstmvc MVC 1-7 ASP.NET MVC 1-9 ASP.NET

More information

DU Ad Platform_SDK 安卓接入指南 DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0 百度在线网络技术 ( 北京 ) 有限公司 百度在线网络技术 ( 北京 ) 有限公司 - 1 -

DU Ad Platform_SDK 安卓接入指南 DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0 百度在线网络技术 ( 北京 ) 有限公司 百度在线网络技术 ( 北京 ) 有限公司 - 1 - DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0-1 - 目录 1. 获取身份... 1 2. 加载与配置... 2 2.1 加载 SDK 文件... 2 2.2 配置 AndroidManifest.xml... 2 2.3 混淆代码... 3 3. 初始化... 4 4. 功能使用... 4 第 1 页共 1

More information

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B, 1 下列类头定义中, 正确的是 A class x B public x extends y C public class x extends y. D class x extends y implements y1 2 现有两个类 A B, 以下描述中表示 B 继承自 A 的是 (D ) A) class A extends B B) class B implements A C) class A

More information

题目

题目 开发 Android 应用 目的 : 帮助大家了解 Android 平台开发 作者 : 王威威 技术爱好 : linux,qt, 嵌入式开发 MSN : wangweiweicdma@hotmail.com Email : wang.weiwei1@ztenc.com.cn wangjiecdma@126.com 下载开发资源 1 下载最新的 Android SDK http://code.google.com/android/download.html

More information

Microsoft Word - 第4章 Android生命周期.docx

Microsoft Word - 第4章 Android生命周期.docx Android 应用程序开发与典型案例 作者 : 华清远见 第 4 章 Android 生命周期 本章简介 经过上一章的学习, 主要了解了 Android 应用程序设计的基础知识, 对 Android 程序的开发有了一定的了解 在此基础上, 本章将对 Android 系统的进程优先级的 变化方式 Android 系统的 4 大基本组件 Activity 的生命周期中各个状态的变化关 系 Android

More information

Lecture01_Android介绍

Lecture01_Android介绍 移动平台应用软件开发 Android 介绍 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一八年秋北京 Android 是什么 Android 不仅仅是一个操作系统, 它更是一个完整的软件框架 Android 基于 Linux 内核 2005 年 Google 公司收购了 Android 公司 Google 公司选择使用 Apache

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 图 1.5 图 三原色光的概念 R Red G Green B Blue RGB RGB R B 3 1 RGB RGB 256 0~ RGB

你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 图 1.5 图 三原色光的概念 R Red G Green B Blue RGB RGB R B 3 1 RGB RGB 256 0~ RGB 第 1 章色彩基础知识 Photoshop Photoshop 1.1 RGB 色彩模式 1.1 1.2 图 1.1 图 1.2 Photoshop sample0101.png 1.3 > CTRL O Windows Photoshop Photoshop Photoshop F8 > 1.4 B R 你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 1.5 1.6 图 1.5

More information

腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2

腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 文档 腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 必读 1. SDK 嵌入 1.1 步骤 1: 添加 SDK 到工程中 1.2 步骤 2: 修改 AndroidManifest.xml 文件 2. 接入代码 2.1 激活事件统计接口 2.1.1 接入代码示例 2.1.2 激活事件主要 API 2.2 更多转化类型统计接口

More information

ii Vue Bootstrap 4 ES 6 Vue Vue Bootstrap 4 ES 6 Vue 2 vue html vue html vue Vue HTML 5 CSS ES 6 HTML 5 CSS Visual Studio Code h

ii Vue Bootstrap 4 ES 6 Vue Vue Bootstrap 4 ES 6 Vue 2 vue html vue html vue Vue HTML 5 CSS ES 6 HTML 5 CSS Visual Studio Code h ii Vue Bootstrap 4 ES 6 Vue Vue Bootstrap 4 ES 6 Vue 2 vue010101.html vue010104.html vue0101 01 04 Vue HTML 5 CSS ES 6 HTML 5 CSS Visual Studio Code https://code.visualstudio.com/ Chrome XAMP Visual Studio

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

骨头的故事

骨头的故事 头 1 图 206 33 7 12 5 5 4 12 2 54 10 200-400 3 500 图 类 图 图 动 节 4 5 图 发 图 节 180 Youtube 180 [1] 7 2 7 6 9 270 6 图 树懒 块颈 13-25 14 17 25 7 图 扭头 头鹰 鹅 8 图 红 为 关节 绿 为 关节 9 图 类 10 图 类 11 图 盘 动 类 图 阴 犸 艺 你可能会以为图

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

片 要求小王等同学对这些文物用两种不同的标准进行分类 说出分类标准和结果 其所考查的目标实则是呼应了一般学习能力中的 整理信息 的要求 即从图片材料 中提取历史信息 对所获材料进行归类 开卷的第三题以 古代少数民族问题 为材料主题 体现交往与融合在文明发展 历程中的地位与作用 以探究性学习为主线 集中考查学生在开展探究性活动中对文 献 实物 口传等不同种类史料 材料 的运用水平 包括对有关史实的再现

More information

國家圖書館典藏電子全文

國家圖書館典藏電子全文 EAI EAI Middleware EAI 3.1 EAI EAI Client/Server Internet,www,Jav a 3.1 EAI Message Brokers -Data Transformation Business Rule XML XML 37 3.1 XML XML XML EAI XML 1. XML XML Java Script VB Script Active

More information

gta 5 serial key number pciker

gta 5 serial key number pciker Gta 5 Serial Key Number Pciker >>> http://shurll.com/7nott 1 / 5 2 / 5 Keep..rea... 2016 年 1 月 3 日 - download..gta..5..serial..number..of..the..most..exclusive..pageviews..selforganizing..ngos,..live..stories..and..easy..policies..regarding..to..containing..my...

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

2017創形パンフ表1_表4

2017創形パンフ表1_表4 2017 SCHOOL GUIDE BOOK 2017 SOKEI ACADEMY OF FINE ART & DESIGN 关于创形美术学校? 创形美术学校是培育专业艺术家的摇篮 大家知道 : 用普通的教育课程来培育专业的艺术家是件困难的事 在我们创形, 从老师到办公人员, 大家全体都是专业的艺术家 在美术界, 设计界当中取得卓越成绩的艺术家们将为大家面对面地传授心得 我们重视的并不是通过指定的教学说明书来指导大家,

More information

( Version 0.4 ) 1

( Version 0.4 ) 1 ( Version 0.4 ) 1 3 3.... 3 3 5.... 9 10 12 Entities-Relationship Model. 13 14 15.. 17 2 ( ) version 0.3 Int TextVarchar byte byte byte 3 Id Int 20 Name Surname Varchar 20 Forename Varchar 20 Alternate

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

ltu

ltu 資 訊 管 理 系 學 齡 前 自 主 學 習 之 行 動 裝 置 輔 助 系 統 指 導 教 授 : 李 靜 怡 教 授 組 員 名 單 : 蔡 承 育 988C012 黃 佳 誼 988C026 鄭 亦 琦 988C060 廖 曼 伶 988C108 中 華 民 國 1 0 2 年 5 月 嶺 東 科 技 大 學 資 訊 管 理 系 學 齡 前 自 主 學 習 之 行 動 裝 置 輔 助 系 統

More information

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

}; P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ,   string imagedata; if(0!= read_image(a.jpg,imagedata)) { return -1; } string rsp; ytopen_sdk m_sd tencentyun-youtu c++ sdk for 腾讯云智能优图服务 & 腾讯优图开放平台 安装 运行环境 Linux 依赖项 - curl-7.40.0, 获取更新版本 https://github.com/bagder/curl - openssl-1.0.1k, 获取更新版本 https://github.com/openssl/openssl 构建工程 工程采用 CMake 构建 1.

More information

Spring3.x开发入门

Spring3.x开发入门 Spring Bean 管理 Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 ) Spring 的工厂类 Spring 的 Bean 管理 (XML 方式 ) 三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数

More information

目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1

目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1 PISOFTTECH 圆周率全景相机 Android SDK 使用指南 版本 :V0.9.0.DOUBLE Louise 本文主要指导用户如何将本公司的 Android SDK 集成到自己的 Android 项目中, 及提供 API 说明 目录 一 功能介绍...3 1. 功能列表...3 2. 使用限制...3 二 Android studio 如何导入 SDK... 3 1. SDK 文件结构...

More information