《Android平台开发之旅》第三章 Android应用程序组件

Size: px
Start display at page:

Download "《Android平台开发之旅》第三章 Android应用程序组件"

Transcription

1 第 3 章 Android 应用程序组件 在进行深入开发之前, 本章对开发的基本单元 ( 程序组件 ) 进行了详细而深入的介绍, 包括各组件的使用方式 框架及配置, 希望读者能够真切地了解各组件的特征和适用性, 并在此基础上, 能够就具体应用策划各组件的集成应用 此外, 本章还对组件之间的一些交互机制和方式进行了实例说明, 通过这些实例希望读者能够深刻掌握这些机制的用法, 为后面的应用集成奠定基础 3.1 应用程序组件有过软件项目开发经历的读者应该很了解, 一个成型的项目往往需要由多个程序组件构成 一般软件项目中, 比较常见的应用程序组件有 : 可执行文件 (Windows 平台中以 exe 为后缀,Linux 平台中无后缀 ) 和动态链接库 (Windows 平台中以 dll 为后缀,Linux 平台中以 so 为后缀 ) 同为可执行程序, 在用途表现方面可能存在较大的差异 : 有的可执行程序提供可视界面, 与用户进行交互 ; 有的不提供界面, 而是作为后台服务 而对于动态链接库文件, 有的仅包含资源定义, 有的仅包含共享代码 其区分也是主要体现在功用方面 应用程序组件的多样化, 其目的就是为了适应各种不同场合的应用 例如 : 在 J2EE 平台, 应用程序有 Applet JSP Servlet 等多种类型, 各种应用程序有各自的适用场合 3.2 Android 应用程序组件 同样的, 在 Android 平台也存在多种类型的应用程序 通过第 1 章对平台的介绍以及第 2 章中对第一个应用程序开发过程的讲解, 相信读者应该可以列举出 Android 平台的应用程序组件 :Activity Service Broadcast Receiver 和 Content Provider, 如图 3-1 是这些重要的组件的类结构层次 Context ContextWrapper Application ContextThemeWrapper ContextThemeWrapper Activity Service BroadcastReceiver ContentProvider 图 3-1 Android 平台应用程序组件类结构层次 表 3-1 是图 3-1 中应用程序组件的说明 类 / 接口 android.app.activity android.app.service android.content.context android.content.contentresolver android.content.broadcastreceiver android.content.intent 表 3-1 应用程序组件类 / 接口说明 Activity, 关注于用户的行为 服务, 关注与后台事务的操作 说明 代表了应用程序所在环境的全局信息的接口 用于访问应用程序的内容模型 广播接收器, 用于接收广播消息 意图对象, 用于描述将要执行的操作

2 2 Android 平台开发之旅 Activity( 活动 ) 形象大使 Activity 程序提供一组可视界面来与用户进行交互, 主要用于处理前端事务, 就像 Applet 程序或者 J2SE 平台中的 Swing 程序 作者将 Activity 组件定义为形象大使的角色, 因为一款工具 游戏或者系统的用户界面的体验效果将会直接影响到该软件的形象 如果读者的程序中有很多 漂亮 的 形象大使, 那么一定会得到更多的关注 图 3-2 是一个 Activity 程序运行的实例界面, 如同其名字一样, 只是一个简单的 Activity 程序 图 3-2 Activity 程序实例界面代码 3-1 是图 3-1 所示的程序中主 Activity 的定义代码 代码 3-1 Activity 定义代码文件名 :SimpleActivity.java 1 public class SimpleActivity extends Activity { //android.app.activity 2 private static final String TAG = "SIMPLE_ACT"; 3 4 //Activity 创建时回调 6 public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // 设置内容视图 9 setcontentview(r.layout.main); 11 Log.i(TAG, "Activity creating..."); //Activity 启动时回调 16 public void onstart() { 1 super.onstart(); 1 19 Log.i(TAG, "Activity starting..."); showinfo(); //Activity 停止时回调 26 public void onstop() { 2 super.onstop(); 2

3 第 3 章 Android 应用程序组件 3 代码 3-1 Activity 定义代码文件名 :SimpleActivity.java 29 Log.i(TAG, "Activity stopping..."); //Activity 销毁时回调 34 public void ondestroy() { 35 super.ondestroy(); 36 3 Log.i(TAG, "Activity destroying..."); // 显示 Activity 组件关联组件信息 41 private void showinfo() { 42 Log.i(TAG, "Title: " + this.gettitle().tostring() ); 43 Log.i(TAG, "Calling activity: " + this.getcallingpackage() ); 44 // 获取应用程序实例 45 Application app = this.getapplication(); 46 Log.i(TAG, "Package:" + app.getpackagename() ); 4 // 获取应用程序上下文实例 4 Context appcontext = this.getapplicationcontext(); 49 Log.i(TAG, "AppContext: " + appcontext.tostring() ); 50 // 获取资产管理器 51 AssetManager am = this.getassets(); 52 Log.i(TAG, "AssetManager: " + am.getlocales()[1]); 53 // 获取基础上下文 54 Context basecontext = this.getbasecontext(); 55 Log.i(TAG, "BaseContext: " + basecontext.tostring() ); 56 // 内容解决者 5 ContentResolver resolver = this.getcontentresolver(); 5 Log.i(TAG, "Resolver: " + resolver.tostring() ); 59 // 布局填充器 60 LayoutInflater inflater = this.getlayoutinflater(); 61 Log.i(TAG, "LayoutInflater: " + inflater.tostring() ); 62 // 菜单填充器 63 MenuInflater inflater2 = this.getmenuinflater(); 64 Log.i(TAG, "MenuInflater: " + inflater2.tostring() ); 65 // 资源管理器 66 Resources resources = this.getresources(); 6 Log.i(TAG, "Resources: " + resources.tostring() ); 6 // 墙纸 69 Drawable wallpaper = this.getwallpaper(); 0 Log.i(TAG, "Wallpaper: " + wallpaper.tostring() );

4 4 Android 平台开发之旅 代码 3-1 Activity 定义代码 文件名 :SimpleActivity.java 1 // 获取窗体实例 2 Window window = this.getwindow(); 3 LayoutParams layoutparams = window.getattributes(); 4 Log.i(TAG, "Layout height: " + layoutparams.height + 5 ", width: " + layoutparams.width); 6 // 获取窗体管理器 WindowManager wm = this.getwindowmanager(); Display display = wm.getdefaultdisplay(); 9 Log.i(TAG, "Window height: " + display.getheight() + 0 ", width: " + display.getwidth() ); 1 2 ; 对于代码 3-1, 从结构上来分析 :SimpleActivity 继承于父类 Activity( 第 1 行 ), 并重载了父类的 oncreate onstart onstop 和 ondestroy 方法, 在 onstart 方法中输出了该 Activity 的有关信息 ( 第 21 行中调用 showinfo 方法 ) 这种使用模式和 Java Applet 程序是一样的 : 读者所编写的 Applet 组件必须继承于父类 Applet 或 JApplet, 并重载父类的部分方法, 例如 : init start stop destroy 和 paint 方法, 在这些继承方法中进行当前 Applet 组件的初始 绘制和善后工作 1. Activity 组件框架简而言之, 在 Android 平台, 所有的 Activity 组件必须继承于其父类 Activity( 在 android.app 包中 ), 这一规则由 Android 平台的应用程序框架来约定, 读者可以从 Applet 的程序框架获得启发 提示 :Activity 实际上和 Java Applet 一样都是一种程序框架, 初学者没有必要一开始就深究它的由来 日志 3-1 该 Activity 程序运行过程中在日志收集器 (LogCat) 中输出的内容 日志 3-1 Activity 程序输出日志文件名 :LogCat 1 Activity creating... 2 Activity starting... 3 Title: Simple Activity 4 Calling activity: null 5 Package:foolstudio.demo 6 AppContext: android.app.application@ AssetManager: ja BaseContext: android.app.applicationcontext@ Resolver: android.app.applicationcontext$applicationcontentresolver@4339 LayoutInflater: com.android.internal.policy.impl.phonelayoutinflater@4359cf20 11 MenuInflater: android.view.menuinflater@435a1cc0 12 Resources: android.content.res.resources@43592c 13 Wallpaper: android.graphics.drawable.bitmapdrawable@43599f 14 Layout height: -1, width: -1

5 第 3 章 Android 应用程序组件 5 日志 3-1 Activity 程序输出日志 文件名 :LogCat Window height: 40, width: 320 Activity stopping... Activity destroying Activity 程序生命周期通过日志 3-1 读者可以看出,Activity 程序的生命周期是 : 创建 启动 停止 销毁, 有关 Activity 程序生命周期的详细说明请参见 Android SDK 附带的文档, 在此不在赘述 3. Activity 程序界面资源绑定在创建阶段,Activity 通过 setcontentview 方法来设置可视界面 ( 代码 3-1 第 行 ) 需要注意的是, setcontentview 方法的参数是一个资源 ID, 对应布局资源文件夹中的 main.xml 文件, 该文件中定义了一个布局资源, 其内容如代码 3-2 所示 代码 3-2 Activity 布局资源定义文件名 :main.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <LinearLayout xmlns:android=" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent"> 6 <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" 9 android:text="@string/hello"/> </LinearLayout> 对布局的概念和布局资源的定义将在第 4 章中进行详细说明, 这里只是让读者从框架上了解 Activity 程序与可视组件的绑定机制 4. Activity 程序清单通过日志 3-1 的第 3 行, 读者可以知道该 Activity 程序的抬头是 Simple Activity 但是, 无论从代码 3-1 还是代码 3-2, 读者都无法获知程序的抬头信息 实际上, 当读者在 Eclipse 中通过 ADT 插件建一个 Android 程序时, 该程序所有的相关信息都保存到一个名为 AndroidManifest.xml 的文件中 代码 3-3 是该文件的完整内容 代码 3-3 程序清单文件定义文件名 :AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <manifest xmlns:android=" 3 package="foolstudio.demo" 4 android:versioncode="1" 5 android:versionname="1.0"> 6 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".simpleactivity" android:label="@string/app_name"> <intent-filter> 9 <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" />

6 6 Android 平台开发之旅 代码 3-3 程序清单文件定义 文件名 :AndroidManifest.xml 11 </intent-filter> 12 </activity> 13 </application> 14 <uses-sdk android:minsdkversion="3" /> 15 </manifest> 通过代码 3-3, 读者可以获知该 Activity 程序的包名 Android 版本代码 版本名称和 SDK 版本等与安装有关的信息 该应用程序的组成在 <application> 节点中进行描述, 通过代码 3-3 读者可以了解, 该应用程序中只包含一个 Activity 提示 : 一个 Android 应用程序可以包含多个 Activity, 但只能有一个 Activity 用于启动, 多个 Activity 之间可以进行相互调用, 形成一个 Activity 栈,Android 平台对 Activity 栈进行管理 5. Activity 关联组件从表现形式上,Activity 程序用来提供可视界面, 但是在后台方面,Activity 几乎关联了 Android 应用程序框架中的大部分组件 从代码 3-1 中的 showinfo 方法 ( 第 41 行 ) 读者可以看出,Activity 的关联组件有 : 应用程序 应用程序上下文 资产管理器 基础上下文 内容解决者 布局填充器 菜单填充器 资源管理器 墙纸 窗体布局和窗体管理器, 如图 3-3 所示 应用程序上下文基础上下文资产管理器 窗体管理器 Activity 资源管理器 窗体布局 墙纸 菜单填充器 布局填充器 图 3-3 Activity 关联组件图 3-3 中所反应的是大多数与 Activity 存在关联的组件, 完整的内容请参考 Android SDK 参考文档 Service( 服务 ) 老黄牛 Android 平台对 Service 的定义和读者熟知的平台所描述的基本是一致的,Android 平台中的 Service 组件不提供可视界面, 主要用于后台处理, 例如 : 下载 Internet 文件 播放背景音乐等, 其与用户的交互一般通过 Activity 组件进行桥接 作者将服务定义为老黄牛的角色, 不言而喻, 老黄牛勤勤恳恳, 埋头苦干, 总是很少抛头露面 图 3-4 和图 3-5 分别是通过 Activity 的界面按钮启动和停止后台服务的运行界面

7 第 3 章 Android 应用程序组件 图 3-4 启动服务 图 3-5 停止服务 1. 服务组件的使用方式代码 3-4 是图 3-4 所示的用户界面对应的 Activity 的关键定义 代码中, 服务组件是在 Activity 中进行启动和停止 代码 3-4 启动服务的 Activity 关键代码文件名 :ServiceDemoAct.java 1 public class ServiceDemoAct extends Activity implements OnClickListener { 2 3 // 按钮被点击时回调 5 public void onclick(view v) { 6 switch(v.getid() ) { case R.id.BTN_START: { // 点击启动服务按钮 9 dostart(); break; case R.id.BTN_STOP: { // 点击停止服务按钮 13 dostop(); 14 break; // 启动服务操作 20 private void dostart() { 21 Intent startservice = new Intent(this, DummyService.class); 22 this.startservice(startservice); // 停止服务操作 26 private void dostop() { 2 Intent startservice = new Intent(this, DummyService.class); 2 this.stopservice(startservice); 29

8 Android 平台开发之旅 代码 3-4 启动服务的 Activity 关键代码 文件名 :ServiceDemoAct.java 30 ; 代码 3-4 中, 通过 2 个按钮来分别开始和停止服务 ( 第 行和第 12 行 ) Activity 与服务通过 Intent 机制 ( 在本章 节中作者将介绍该机制 ) 来打交道, 通过指定服务类名即可启动相关服务实例 2. 服务组件框架代码 3-5 是代码 3-4 中所参考的服务类 ( DummyService ) 的定义 代码 3-5 服务类的定义文件名 :DummyService.java 1 public class DummyService extends Service { 2 // 当 ( 客户端 ) 连接服务时回调 4 public IBinder onbind(intent intent) { 5 6 return null; 9 // 11 public void oncreate() { super.oncreate(); Log.d(getClass().getName(), "Service created."); // 服务启动时回调 20 public void onstart(intent intent, int startid) { super.onstart(intent, startid); Toast.makeText(this, "I'm a service!", Toast.LENGTH_LONG).show(); Log.d(getClass().getName(), "Service starting..."); // 服务实例销毁时回调 31 public void ondestroy() { super.ondestroy(); 34

9 第 3 章 Android 应用程序组件 9 代码 3-5 服务类的定义 文件名 :DummyService.java 35 Log.d(getClass().getName(), "Service destroyed."); 36 3 ; 和 Activity 一样, 服务组件的定义也要遵循既定框架 : 所有的服务组件必须继承于其父类 Service( 在 android.app 包中 ), 子类服务通过在重载的方法 ( 例如 : 代码 3-5 中 onbind oncreate onstart 和 ondestroy 方法 ) 中实现其特定的任务 代码 3-5 中的服务组件只做了一件事情 : 弹出一个提示文本, 告诉用户它是服务 ( 第 24 行 ) 3. 服务程序清单代码 3-6 是该服务程序的清单文件内容 代码 3-6 服务程序清单文件名 :AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <manifest xmlns:android=" 3 package="foolstudio.demo" 4 android:versioncode="1" 5 android:versionname="1.0"> 6 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".servicedemoact" android:label="@string/app_name"> 9 </activity> 11 <service android:label="dummyservice" android:name=".dummyservice"> 12 <intent-filter> 13 <action android:name="foolstudio.demo.dummyservice" /> 14 </intent-filter> 15 </service> 16 </application> 1 <uses-sdk android:minsdkversion="3" /> 1 </manifest> 4. 服务程序界面资源绑定代码 3-6 中表明, 该服务程序由 1 个 Activity 和 1 个服务组件构成 服务组件不提供可视界面, 所以它无需与界面资源 ( 例如 : 布局 菜单等 ) 进行绑定, 但 Activity 还是需要定义布局资源 代码 3- 是该服务程序中的 Activity 所用到的布局资源定义 代码 3- 服务示程序布局资源定义文件名 :main.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <LinearLayout xmlns:android=" 3 > 4 <TextView 5 /> 6 <Button android:id="@+id/btn_start"

10 Android 平台开发之旅 代码 3- 服务示程序布局资源定义 文件名 :main.xml android:text="start service" /> <Button android:id="@+id/btn_stop" android:text="stop service" /> </LinearLayout> Broadcast Receiver( 广播接收器 ) 倾听者如果说 Activity 和服务都是实干派, 那么将广播接收器组件定义为倾听者的角色是再恰当不过了 在 Android 平台, 广播接收器组件用于接收和响应系统广播的消息 和 Service 一样, 广播接收器也需要通过 Activity 与用户交互进行桥接 图 3-6 是注册广播接收器的执行界面, 图 3- 是广播接收器接收到消息并弹出的界面 图 3-6 注册广播接收器组件 图 3- 接收广播消息并弹出 1. 广播接收器的使用方式代码 3- 是图 3-6 所示的用户界面对应的 Activity 的关键定义 在 Activity 的定义中, 首先对广播接收器实例进行注册, 并向该广播接收器发送消息 代码 3- 广播接收器程序中 Activity 关键代码文件名 :BroadcastReceiverDemoAct.java 1 public class BroadcastReceiverDemoAct extends Activity implements OnClickListener { 2 // 意图数据键值 3 public static final String INTENT_EXTRAS_NAME = "BroadcastReciverDemoAct"; 4 // 广播接收器实例 5 private DummyBroadcastReceiver mreceiver = null; 6 // 意图过滤器 private IntentFilter mintentfilter = null; 9 //Activity 11 public void oncreate(bundle savedinstancestate) { // 初始化广播接收器 14 mreceiver = new DummyBroadcastReceiver(); 15 // 使用广播接收器类名初始化意向过滤器

11 第 3 章 Android 应用程序组件 11 代码 3- 广播接收器程序中 Activity 关键代码文件名 :BroadcastReceiverDemoAct.java 16 mintentfilter = new IntentFilter(DummyBroadcastReceiver.class.getName() ); //Activity 组件销毁时回调 21 protected void ondestroy() { if(mreceiver!= null) { // 注销接收器 24 this.unregisterreceiver(mreceiver); super.ondestroy(); // 注册接收器 31 private void doregister() { 32 this.registerreceiver(mreceiver, mintentfilter); // 发送消息 36 private void dosend() { 3 // 为消息创建容器 ( 意图对象实例 ) 3 Intent sendintent = new Intent(DummyBroadcastReceiver.class.getName() ); 39 // 向意图附加容器中添加数据项 40 sendintent.putextra(intent_extras_name, INTENT_EXTRAS_NAME); 41 // 发送消息 包裹 42 this.sendbroadcast(sendintent); ; 代码 3- 中, 首先分别定义了 1 个广播接收器实例 ( 第 5 行 ) 和 1 个过滤器 ( 第 行 ), 然后在第 14 行和第 16 行分别对广播接收器和过滤器进行初始化, 其中, 过滤器的初始化需要提供广播接收器的类名称 初始化完毕之后, 在第 32 行, 对广播接收器进行注册, 让之开始 倾听 广播消息, 而至于关注哪些消息, 是由过滤器来 告诉 它 并非只有 Android 平台才能进行 广播,Activity 组件也可以发送广播消息, 该过程也需要通过意向组件来实施 ( 从第 3 行到第 42 行 ) 2. 广播接收器组件框架代码 3-9 是代码 3- 中所参考的广播接收器对象的定义代码 代码 3-9 广播接收器定义文件名 :DummyBroadcastReceiver.java 1 public class DummyBroadcastReceiver extends BroadcastReceiver { 2 // 当接收消息时回调

12 12 Android 平台开发之旅 代码 3-9 广播接收器定义文件名 :DummyBroadcastReceiver.java 4 public void onreceive(context context, Intent intent) { 5 6 String msg = intent.getstringextra(broadcastreceiverdemoact.intent_extras_name); // 弹出消息 9 Toast.makeText(context, "Get message: " + msg, Toast.LENGTH_LONG).show(); 11 ; 与 Activity 和服务组件一样, 所有广播接收器的定义必须继承父类 BroadcastReceiver ( 在 android.content 包中 ), 在所重载的消息接收方法 ( 代码 3-9 中第 4 行 onreceive 方法 ) 中实现对消息的过滤判断和接收 3. 广播接收器程序清单在广播接收器示例程序中, 广播接收器是在代码中进行注册, 所以在程序清单中无需指明广播接收器, 只需包含 1 个界面 Activity 组件即可, 其内容结构和代码 3-3 是相同的 实际上, 在程序清单中也可以定义广播接收器, 而且这种方式下, 无需再在代码中进行定义广播接收器和注册操作 代码 3- 是将广播接收器示例程序中的广播接收器定义在程序清单中的举例 代码 3- 广播接收器程序清单文件名 :AndroidManifest.xml 1 <application android:icon="@drawable/icon" android:label="@string/app_name"> 2 <activity> 3 4 </activity> 5 <receiver android:label="alarmlistener" android:name=".alarmlistener"/> 6 </application> 提示 : 在代码中注册广播接收器和在程序清单中定义广播接收器这两种方式都可以实现接收广播消息 这两种使用方式的最大区别在于广播接收器的初始化方式 : 对于在代码中注册广播接收器的方式, 用户可以定制该接收器的初始化方式 ( 例如 : 传递初始化参数等, 典型的是传递主线程消息队列处理器实例, 由此实现将接收器接收内容传递到主线程界面中 ), 而通过程序清单定义广播接收器的初始化过程由平台自动完成, 用户无法干预, 但是该方式无需显式地对广播接收器进行注册或注销 4. 广播接收器程序界面资源绑定和服务程序一样, 虽然广播接收器组件不提供可视界面, 所以其无需与界面资源进行绑定 但是广播接收器组件与用户的交互需要通过 Activity 来桥接, 所以 Activity 的界面资源还是需要定义的 代码 3-11 是广播接收器示例程序中 Activity 的布局资源定义代码 代码 3-11 广播接收器程序布局资源定义文件名 :main_view.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <LinearLayout xmlns:android=" 3 >

13 第 3 章 Android 应用程序组件 13 代码 3-11 广播接收器程序布局资源定义 文件名 :main_view.xml <TextView android:text="@string/app_name"/> <Button android:id="@+id/btn_register" android:text="register receiver" /> <Button android:id="@+id/btn_send" android:text="send message" /> </LinearLayout> Content Provider( 内容提供者 ) 对内容提供者, 通过名字就可以很好地理解该组件的角色 在 Android 平台, 内容提供者用于将一个程序的数据通过约定手段提供给其他程序 内容提供者组件不提供可视组件, 也无需直接与用户进行交互 通常情况下, 需要数据的程序或组件按照约定方式从内容提供者那里获取数据, 再通过可视界面显示数据 图 3- 是一个从内容提供者读取并显示记录的程序界面 图 3- 内容提供者示例程序界面 1. 内容提供者的使用方式代码 3-12 是图 3- 所示的用户界面对应的 Activity 的关键定义 在 Activity 的定义中, Activity 实例利用其关联组件 ContentResolver( 内容解决者 ), 通过对内容提供者约定的资源标识执行查询请求, 进而得到数据记录 代码 3-12 内容提供者程序 Activity 定义文件名 :ContentProviderDemoAct.java 1 public class ContentProviderDemoAct extends Activity implements OnClickListener{ 2 // 内容解决者实例 3 private ContentResolver mcr = null; 4 6 public void oncreate(bundle savedinstancestate) { // 获取 Activity 组件的内容解决器对象实例

14 14 Android 平台开发之旅 代码 3-12 内容提供者程序 Activity 定义文件名 :ContentProviderDemoAct.java 9 mcr = this.getcontentresolver(); // 执行查询 13 private void doquery() { 14 // 生成资源全路径 15 Uri recuri = ContentUris.withAppendedId(MyDB.CONTENT_URI, 16 MyDB.ALL_ROWS); 1 // 不能进行类型转换, 否则会抛出类转换异常 1 Cursor mc = mcr.query(recuri, null, null, null, null); if(mc == null) { 21 Toast.makeText(this, " 获取游标失败!", Toast.LENGTH_LONG).show(); 22 return; // 游标复位 25 mc.movetofirst(); 26 // 遍历游标 2 while(!mc.isafterlast()) { 2 printtext("_id: " + mc.getint(0) ); 29 printtext("name: " + mc.getstring(1) ); 30 printtext("sex: " + mc.getstring(2) ); 31 // 移动到下一条记录 32 mc.movetonext(); mc.close(); ; 在代码 3-12 中,Activity 首先是通过其 getcontentresolver 方法获取内容解决者组件 ( 第 9 行 ), 在通过内容解决者组件的查询方法 query 执行记录查询操作, 并获取数据记录游标 ( 第 1 行 ), 最后通过游标的移动, 获取所有记录集中的记录内容 ( 第 32 行 ) 读者需要注意的是, 查询方法 query 所需的参数 resuri 描述的就是数据资源的 URI(Uniform Resource Identifier, 统一资源标识 ),URI 的构成部分参考到数据提供者的定义属性 ( 第 15 行和第 16 行 ) 提示 :URI 的规范定义于 RFC 2396:Uniform Resource Identifiers(URI), 其定义语法为 :[ 模式 :] 模式规范部分 [# 片段 ], 形如 : 有关 URI 的详细介绍请参见 RFC 2396 规范 2. 内容提供者组件框架代码 3-13 是代码 3-12 中所参考的内容提供者的定义 代码 3-13 定制内容提供者定义

15 第 3 章 Android 应用程序组件 15 文件名 :MyDB.java 1 public class MyDB extends ContentProvider { 2 //URI 组成部分定义 3 public static final String URI_AUTHORITY = "foolstudio.demo.mydb"; 4 public static final String URI_PATH = "RecordSet"; 5 public static final String URI_PATH2 = "RecordSet/#"; 6 public static final int ALL_ROWS = 1; public static final int SINGLE_ROW = 2; // 该 URI 的授权部分必须为有效类的全名 9 public static final Uri CONTENT_URI = Uri.parse("content://foolstudio.demo.MyDB/RecordSet"); 11 public static final UriMatcher urimatcher; 12 // 列名 13 public static final String _ID = "_id"; 14 public static final String FIELD_NAME = "name"; 15 public static final String FIELD_SEX = "sex"; 16 // 列名数组 1 public static final String COLUMN_NAMES[] = new String[] { 1 _ID, FIELD_NAME, FIELD_SEX 19 ; 20 // 初始化矩阵游标 21 public static MatrixCursor mcursor = new MatrixCursor(COLUMN_NAMES); 22 // 定义列索引 23 public static final int INDEX_ID = 0; 24 public static final int INDEX_NAME = 1; 25 public static final int INDEX_SEX = 2; 26 // 初始化 URL 匹配器 2 static { 2 urimatcher = new UriMatcher(UriMatcher.NO_MATCH); 29 // 添加授权 路径和片段部分 30 urimatcher.adduri(uri_authority, URI_PATH, ALL_ROWS); 31 urimatcher.adduri(uri_authority, URI_PATH2, SINGLE_ROW); // 接收删除请求时回调 36 public int delete(uri uri, String selection, String[] selectionargs) { 3 // 先进行 URL 匹配判断 3 switch(urimatcher.match(uri) ) { 39 case ALL_ROWS: { // 执行删除所有行的操作 40 break; case SINGLE_ROW: { // 执行删除指定行的操作 43 break;

16 16 Android 平台开发之旅 代码 3-13 定制内容提供者定义文件名 :MyDB.java return 0; 4 4 // 接收查询请求时回调 50 public String gettype(uri uri) { 51 switch(urimatcher.match(uri) ) { // 先进行 URL 匹配判断 52 case ALL_ROWS: { 53 return ("vnd.android.cursor.dir/vnd.foolstudio.mydb"); 54 //break; case SINGLE_ROW: { 5 return ("vnd.android.cursor.item/vnd.foolstudio.mydb"); 5 //break; return null; // 接收记录插入请求时回调 66 public Uri insert(uri uri, ContentValues values) { 6 6 return null; // 初始化游标 3 public boolean oncreate() { 4 mcursor.addrow(new String[] {"1", "Paul", "Female" ); 5 mcursor.addrow(new String[] {"2", "Leo", "Male" ); 6 return true; 9 0 // 接收查询请求时回调 2 public Cursor query(uri uri, String[] projection, String selection, 3 String[] selectionargs, String sortorder) { 4 5 return (mcursor);

17 第 3 章 Android 应用程序组件 1 代码 3-13 定制内容提供者定义 文件名 :MyDB.java 6 // 接收更新请求时回调 90 public int update(uri uri, ContentValues values, String selection, String[] selectionargs) { return 0; ; 代码 3-13 中, 与 Activity 和服务组件一样, 所有内容提供者的定义必须继承父类 ContentProvider(android.content 包中 ), 在所重载的方法中实现对数据记录的删除 ( 第 36 行 ) 插入( 第 66 行 ) 创建( 第 3 行 ) 更新( 第 90 行 ) 和查询 ( 第 2 行 ) 等操作 其中代码中所定义的一些静态成员都是内容提供者程序框架所要求定义的, 更为详细约定请参考 Android SDK 文档 3. 内容提供者程序清单代码 3-14 是数据提供者示例程序的清单文件内容, 其中 <provider> 标记 ( 第 行 ) 就是内容提供者组件的定义开始 代码 3-14 数据提供者示例程序清单文件名 :AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <manifest xmlns:android=" 3 package="foolstudio.demo" 4 > 5 <application android:icon="@drawable/icon" android:label="@string/app_name"> 6 <activity android:name=".contentproviderdemoact" android:label="@string/app_name"> 9 </activity> <provider android:name=".mydb" android:label="mydb" 11 android:authorities="foolstudio.demo.mydb"/> 12 </application> 13 <uses-sdk android:minsdkversion="3" /> 14 </manifest> 4. 内容提供者程序界面资源绑定从代码 3-14 中读者可以看到, 该服务程序由 1 个 Activity 和 1 个内容提供者组件构成 内容提供者组件不提供可视界面, 所以它也无需与界面资源进行绑定, 而其中 Activity 还是需要定义布局资源 代码 3-15 是该内容提供者示例程序中的 Activity 所用到的布局资源定义 代码 3-15 内容提供者示例程序界面资源定义文件名 :main.xml 1 <?xml version="1.0" encoding="utf-"?>

18 1 Android 平台开发之旅 代码 3-15 内容提供者示例程序界面资源定义 文件名 :main.xml <LinearLayout xmlns:android=" > <TextView /> <Button android:id="@+id/btn_query" android:text="query"/> <EditText android:id="@+id/txt_contents" /> </LinearLayout> Android 应用程序组件小结多种不同类型的应用程序造就了丰富多彩的 Android 平台, 这些程序中, 既有热衷于表现的 形象大使 (Activity), 也有习惯于埋头苦干的 老黄牛 ( 服务 ); 有冷静的 倾听者 ( 广播接收者 ), 也有热情的 奉献者 ( 内容提供者 ) 各种程序各有所长, 能够满足 Android 平台所有的应用场合 3.3 组件应用机制在对 Android 平台 4 种应用程序组件的介绍中, 作者提到了有关组件之间的相互调用 发送广播消息等应用 而这些应用机制正是关联所有应用程序的强韧纽带, 有了这些纽带, 就能够把各种不同类型 不同功能的应用程序 团结 在一起, 从而帮助用户完成各种复合的应用 在 Android 平台中, 比较常用的应用机制有, 组件与组件 组件与线程和组件与服务之间的交互机制 组件与组件间的交互机制在 Android 平台, 组件与组件之间的交互通过 Intent( 意向 ) 组件来实现 在 SDK 的参考中,Android 平台把意向归纳为激活组件, 就是用于激活其他组件的组件 作者在这里把它归纳到应用机制进行讲解, 其主要目的是为了读者区分地理解应用程序组件特性和这些组件的使用方法, 从程序框架的角度来理解 Android 平台中应用程序的使用模式 图 3-9 和图 3- 所示的应用程序中, 主 Activity 启动一个新的 Activity, 并将数据记录传递给该 Activity 组件进行显示 图 3-9 启动新的 Activity 图 3- Activity 组件间数据传递

19 第 3 章 Android 应用程序组件 19 代码 3-16 是图 3-9 所对应的程序的主 Activity 定义代码, 其主要功能是提供程序主界面, 通过按钮启动创建意向对象, 并启动另外一个 Activity(DataViewerAct) 代码 3-16 意图示例程序主 Activity 定义文件名 :IntentDataTestAct.java 1 public class IntentDataTestAct extends Activity implements OnClickListener { 2 // 请求识别码 3 public static final int REQ_CODE = 2012; 4 // 附加数据键值 5 public static final String EXTRAS_KEY = "EXTRAS_DATA"; 6 // 数据记录容器 private ArrayList<Kid> mkids = new ArrayList<Kid>(); 9 /*Andoid 平台禁止访问 Activity 的构造函数, 否则抛出异常 public static IntentDataTestAct minstance = new IntentDataTestAct(); 11 private IntentDataTestAct() { // 单例模式, 构造函数无需向外部提供 // 单例模式获取 Activity 类实例 14 public static IntentDataTestAct getinstance() { 15 return (minstance); 16 1 */ 1 20 public void oncreate(bundle savedinstancestate) { public void onclick(view v) { // 启动新的活动 30 private void dostart() { 31 // 通过 Activity 类名创建意向对象实例 32 Intent startnew = new Intent(this, DataViewerAct.class); 33 // 初始化数据集 34 ArrayList<Kid> kids = initarraylist(); 35 // 将数据集加入到意向对象的附加容器中 36 startnew.putparcelablearraylistextra(extras_key, kids); 3 // 通过意向参数启动新的 Activity 组件 3 this.startactivity(startnew); 39 // 以要求反馈结果的方式启动新的 Activity 组件 40 //this.startactivityforresult(startnew, REQ_CODE);

20 20 Android 平台开发之旅 代码 3-16 意图示例程序主 Activity 定义文件名 :IntentDataTestAct.java // 当接收调用 Activity 反馈结果时回调 45 protected void onactivityresult(int requestcode, int resultcode, Intent data) { 46 if(requestcode == REQ_CODE) { // 判断是否合法的请求代码 4 // 获取反馈结果数据包 4 Bundle bundle = data.getextras(); 49 // 从包中获取消息内容并显示 50 String msg = bundle.getstring("msg"); 51 Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); super.onactivityresult(requestcode, resultcode, data); // 初始化数据记录列表 5 private ArrayList<Kid> initarraylist() { 59 addkid(mkids, "Jim", Kid.SEX_FEMALE, " "); return mkids; // 获取数据记录列表 65 public ArrayList<Kid> getarraylist() { 66 return (mkids); ; 在代码 3-16 中有一段注释了的代码 ( 第 9 行到第 1 行 ), 其本意是 : 主 Activity 以单例 (Singleton) 的形式向外部组件提供获取类实例对象的接口 ( 第 14 行 ), 在显示数据的 Activity 组件中通过主 Activity 提供的接口获取主 Activity 类实例, 继而通过其数据访问接口 ( 第 65 行 ) 获取数据并显示 但是, 通过单例模式来实现 Activity 之间的数据共享的想法在 Android 平台行不通, 因为 Android 平台禁止应用程序访问 Activity 组件的构造函数, 其异常输出如下所示 java.lang.runtimeexception: Unable to instantiate activity ComponentInfo java.lang.illegalaccessexception: access to constructor not allowed 实际上,Android 平台的这一禁止规则, 正是用来规范应用程序组件之间的数据传递机制, 保证组件的数据安全 1. Activity 组件调用 Activity 组件的方式在 Android 平台,Activity 组件可以通过 startactivity 方法来调用其他 Activity 组件,

21 第 3 章 Android 应用程序组件 21 该方法有且仅有的一个参数就是意向对象 ( 代码 3-16 第 3 行 ), 需要传递的数据存放到意向对象的附加容器中 ( 代码 3-16 第 36 行 ) 在使用 startactivity 方法调用新的 Activity 组件的方式中, 新的 Activity 将不会反馈执行结果给调用它的 Activity 组件 而如果既需要调用新的 Activity 组件, 而且还需要该组件将结果反馈给调用方 Activity, 那么需要使用 startactivityforresult 方法 ( 代码 3-16 第 40 行 ), 该方法的第 1 个参数还是意向对象实例, 第 2 个参数是请求代码, 用来识别反馈结果是否为预期 2. 意向对象的内涵既然其他 Activity 组件通过意向对象来调用, 那么在意向对象中, 需要包含哪些内容 : (1) 目标组件或者选择条件, 告诉平台指定或者判断由哪个 Activity 组件来执行任务 ; (2) 行为方式, 指明任务的行为方式 例如, 对于记录工具, 是执行增加还是删除操作 (3) 资源标识或数据, 指明需要处理的内容 有关意向对象的详细说明请参见 Android SDK 参考文档 3. 意向对象的附加容器在代码 3-16 的第 3 行, 意图对象通过 putparcelablearraylistextra 方法将包含多条小孩 (Kid) 记录的一个 ArrayList 对象添加到该意图对象的附加容器中, 该数据项有一个字符串 ( 常量 EXTRAS_KEY ) 作为键, 类似于 Map 容器操作 所以, 读者可以初步推断出意向对象的附加容器 Bundle, 类似于 Map, 只是其键的类型是字符串 4. 意向对象的附加容器中的记录既然 Activity 与 Activity 之间的数据无法通过简单地内存共享来实现, 只能通过意向对象的附加容器进行传递, 那么意向对象的附加容器中的记录又是一种什么结构呢 代码 3-1 是代码 3-16 中数据记录 ( 小孩信息 ) 的定义 代码 3-1 意图对象附加容器中记录的定义文件名 :Kid.java 1 public class Kid implements Parcelable { 2 public static final int SEX_FEMALE = 1; 3 public static final int SEX_MALE = 0; 4 // 属性字段 5 private String name = null; 6 private int sex = 1; private String birthday = null; 9 // 必须要有一个名为 CREATOR 的成员对象, 否则无法进行 Parcelable 对象通信 public static final Parcelable.Creator<Kid> CREATOR = new Parcelable.Creator<Kid>() { 11 public Kid createfromparcel(parcel in) { 12 return new Kid(in); public Kid[] newarray(int size) { 15 return new Kid[size]; 16 1 ; 1 public Kid(String _name, int _sex, String _birthday) { 19 this.birthday = _birthday;

22 22 Android 平台开发之旅 代码 3-1 意图对象附加容器中记录的定义文件名 :Kid.java 20 this.sex = _sex; 21 this.name = _name; // 设置和获取姓名信息 24 public void setname(string name) { 25 this.name = name; 26 2 public String getname() { 2 return name; // 设置和获取生日信息 31 public void setbirthday(string birthday) { 32 this.birthday = birthday; public String getbirthday() { 35 return birthday; 36 3 // 设置和获取性别信息 3 public void setsex(int sex) { 39 this.sex = sex; public int getsex() { 42 return sex; // 实现 Parcelable 接口 ( 从包裹中构造对象实例 ) 46 public Kid(Parcel in) { 4 this.name = in.readstring(); 4 this.sex = in.readint(); 49 this.birthday = in.readstring(); public int describecontents() { 54 return 0; // 用于定义写对象到包裹中的方法 59 public void writetoparcel(parcel dest, int flags) { 60 dest.writestring(this.name); 61 dest.writeint(this.sex);

23 第 3 章 Android 应用程序组件 23 代码 3-1 意图对象附加容器中记录的定义 文件名 :Kid.java 62 dest.writestring(this.birthday); ; 与通常类的定义代码相比, 读者也许觉得代码 3-1 过于复杂, 可能对属性 CREATOR 和方法 writetoparcel 的定义不知所云 这些 莫名其妙 属性和方法, 却正是 Android 平台对于可以通过 IPC(Inter-process Communication, 进程间通信 ) 机制进行传递的数据类的定义进行的约定,Activity 与 Activity 之间可以传递的数据类必须满足该约定 否者将会抛出如下的异常 : android.os.badparcelableexception: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class foolstudio.demo.kid 代码中第 2 行的 Parcelable 接口就是代表了可以通过 Parcel( 包裹 ) 进行数据传递的功能特性 只有实现了 Parcelable 接口的类对象才能通过意向对象的附加空间进行传递, 实际上, 意图类 (Intent) 本身也实现了 Parcelable 接口 实现于 Parcelable 接口的 CREATOR 属性用于 告诉 平台如何创建该类的实例 ( 第 行 ); 而 writetoparcel 方法用于 告诉 平台如何将该类的数据存储到 包裹 中 ( 第 59 行 ) 通过对属性名和方法名进行约定, 平台可以获知该对象的数据的读取和写入的接口, 从而可以进行对象的实例化 ( 从包裹中创建类实例 ) 和持久化 ( 将类实例存储到包裹中 ) 5. 被调用方 Activity 接收传递数据在代码 3-16 中, 主 Activity 将小孩记录数组通过意向对象的附加容器传递给了数据显示 Activity, 代码 3-1 是显示数据的 Activity 组件的定义 代码 3-1 记录显示 Activity 组件的定义文件名 :DataViewerAct.java 1 public class DataViewerAct extends Activity { 3 public void oncreate(bundle savedinstancestate) { 4 5 // 获取父 Activity 所传递的附加数据 6 Intent intent = this.getintent(); ArrayList<Kid> kids = intent.getparcelablearraylistextra(intentdatatestact.extras_key); for(int i = 0; i < kids.size(); ++i) { 9 Kid kid = kids.get(i); // 通过意向组件将结果发送到调用方 Activity 14 Intent result = new Intent(); 15 // 填充结果数据包 16 result.putextra("msg", "Get " + kids.size() + " record(s)."); 1 // 设置返回结果

24 24 Android 平台开发之旅 代码 3-1 记录显示 Activity 组件的定义 文件名 :DataViewerAct.java 1 this.setresult(intentdatatestact.req_code, result); ; 在代码 3-1 中,Activity 组件通过 getintent 方法获取到与当前 Activity 组件关联的意向对象实例 ( 第 6 行 ), 然后通过意向对象实例的 getparcelablearraylistextra 方法从意向对象实例的附加空间按照指定的键进行检索, 获取到之前存储的 包含小孩记录的记录数组对象 ( 第 行 ), 然后再遍历数据, 输出记录内容 ( 第 行 ) 6. 被调用方 Activity 反馈结果在 Activity 组件调用 Activity 组件的方式介绍时, 作者提到, 通过 startactivityforresult 方法调用 Activity 组件, 被调用的 Activity 还可以将结果反馈给调用方 Activity 组件 如图 3-11 所示, 在被调用 Activity 组件关闭时, 在主 Activity 中接收到被调用 Activity 组件反馈的结果信息 图 3-11 获取被调用 Activity 的返回结果代码 3-1 中, 从第 14 行到第 1 行就是被调用方将结果反馈给调用方 Activity 组件的核心代码 读者可以看出, 被调用方组件反馈结果给调用方也需要使用意向组件 ( 第 14 行 ), 被调用方将需要反馈的数据项以 键 值 的方式添加到该意向对象的附加容器中 ( 第 16 行 ), 然后通过 setresult 方法反馈给调用方组件 ( 第 1 行 ) 调用方 Activity( 主 Activity 组件 ) 通过重载父类的 onactivityresult 方法来获取所收到的反馈结果 ( 代码 3-16 中第 45 行 ) 注意 : 调用方组件对结果的读取与被调用方发送结果的过程是逆向的, 而且被调用方反馈结果时还附带了一个请求识别码 (IntentDataTestAct.REQ_CODE, 代码 3-1 中第 1 行 ), 而该识别码正是调用方用于判断其所接收的结果是否为预期的判别码 ( 代码 3-16 中第 54 行 ). 程序清单通过意向组件, 读者可以轻松地实现在一个 Activity 组件中调用另外一个组件 而实际上, 被调用的 Activity 要事先 告诉 应用平台, 否则运行时将会抛出目标 Activity 组件没有找到的异常, 如下所示 android.content.activitynotfoundexception: Unable to find explicit activity class have you declared this activity in your AndroidManifest.xml? 异常输出中提示, 所有的 Activity 组件都必须在清单文件中进行声明 代码 3-19 是该

25 第 3 章 Android 应用程序组件 25 意向示例程序的清单文件内容 代码 3-19 包含多个 Activity 组件的程序清单文件名 :AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <manifest xmlns:android=" 3 package="foolstudio.demo" 4 android:versioncode="1" 5 android:versionname="1.0"> 6 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".intentdatatestact" android:label="@string/app_name"> 9 <intent-filter> <action android:name="android.intent.action.main" /> 11 <category android:name="android.intent.category.launcher" /> 12 </intent-filter> 13 </activity> 14 <activity android:name=".datavieweract"/> 15 </application> 16 <uses-sdk android:minsdkversion="3" /> 1 </manifest> 代码 3-19 中, 第 行和第 14 行分别声明了 1 个 Activity 组件, 但是通过 <intent-filter> 标记读者可以看出, 第 行定义的 Activity 组件是整个程序的主组件 ( 第 行 ), 且作为启动用 ( 第 11 行 ) 需要补充的是, 无论是主 Activity 组件还是从 Activity, 都需要绑定可视界面的 ( 即图 3-9 和图 3- 所示 ), 那么还必须为这两个 Activity 组件分别定义界面布局资源 有关界面布局资源的定义将在第 4 章中进行说明 未决意向对象如果说意向对象所描述的是即将执行的动作 ( 该动作会马上被执行 ), 那么未决意向对象 (PendingIntent) 描述的却是稍后将要执行的动作 ( 该动作可能会被取消 ), 例如 : 闹钟设定 短信发送 任务通知等 读者可以把未决意向理解为带有条件的意向 (Intent), 这样未决意向对象实例还需要依据意向对象来获取 通过 PendingIntent 类的静态方法 getactivity getbroadcast 和 getservice 可以分别获取用于启动 Activity 执行广播和启动服务的未决意向实例 未决对象实例不能用来执行操作, 所以, 还必须由操作主体通过指定未决对象实例来启动操作, Android 平台会从未决对象实例中获取该操作不是立即执行, 而是需要满足某种条件 ( 在指定时刻或超过延迟时段等 ) 在通过未决意向对象启动 Activity 组件的过程中, 还必须通过意向对象 告诉 Activity 管理器新 Activity 与调用方没有关系, 新 Activity 是新任务 (FLAG_ACTIVITY_NEW_TASK) 有关未决意向对象的使用实例, 可以参考短信发送 ( 第.2.2 节 ) 系统通知( 第 节 ) 和闹钟设置 ( 第 节 ) 应用 组件与线程间的交互机制有些读者可能以这样的方式使用线程 : 通过用户界面 ( 例如 : 按钮 ) 启动线程, 然后在线程的执行代码中将状态信息输出到用户界面 ( 例如 : 文本框 ) 在 J2SE 平台, 这样的使

26 26 Android 平台开发之旅 用方式可能不会遇到什么问题 ; 但是在 Android 平台, 将会抛出以下的异常信息 : android.view.viewroot$calledfromwrongthreadexception: Only the original thread that created a view hierarchy can touch its views. 该异常的意思是, 只有最初创建视图层次结构的线程才能接触该结构中的视图, 其言外之意就是, 不是最初创建界面的线程是不能接触界面元素的 那么, 在不是创建界面的线程中, 如何将内容输出到界面元素中呢? 1. 线程消息队列 Android 平台提供了一种称为线程消息队列 (Message Queue) 的机制来解决上述使用中遇到的问题 首先在界面线程中创建一个可以与界面线程的消息队列进行关联的接口实例, 其它的线程通过这个接口实例就可以将消息发送到界面线程的消息队列中, 最后由界面线程将消息内容输出到界面容器中, 这个接口实例就是一个 Handler( 处理者 ) 类实例 图 3-12 是一个 Activity 组件与外部线程交互的示例程序的运行界面 图 3-12 Activity 组件与外部线程交互的示例程序界面代码 3-20 是图 3-11 所对应的 Activity 的定义代码 代码 3-20 调用线程的 Activity 定义文件名 :HandlerDemoAct.java 1 public class HandlerDemoAct extends Activity implements OnClickListener { 2 4 public void oncreate(bundle savedinstancestate) { 5 6 // 初始化线程消息队列接口实例 mhandler = new Handler() { // 处理消息时回调 public void handlemessage(message msg) { 11 // 获取消息数据 12 Bundle bundle = msg.getdata(); 13 // 从消息数据集中获取数据项 14 String sender = bundle.getcharsequence("sender").tostring(); 15 String data = bundle.getstring("msg"); 16 // 将消息输出到可视界面

27 第 3 章 Android 应用程序组件 2 代码 3-20 调用线程的 Activity 定义 文件名 :HandlerDemoAct.java 1 addmsg(sender+" "+data); 1 19 super.handlemessage(msg); ; // 启动线程 25 private void dostart() { 26 // 创建外部线程并启动 2 LocalThread t = new LocalThread(this, mhandler); 2 t.start(); // 将指定文本输出到可视组件中该方法不能被其他本 View 之外的线程调用 32 public void addmsg(string msg) { 33 mtxtmsg.append(msg+"\n"); ; 代码 3-20 中, 从第 行到第 21 行, 定义了一个线程消息队列处理器实例, 该实例将会与主线程的消息队列进行绑定 在该实例的定义体中, handlemessage 方法是通过重载而来, 用于处理消息队列中的消息 2. 线程消息队列的消息读取每条消息所包含的数据被存放在一个 Bundle 类实例中 ( 第 12 行 ),Bundle 类实例似于 Map 容器, 该容器中的数据项目必须通过指定的键来进行获取 ( 第 14 行中通过 Sender 来获取发送者的信息 ; 第 15 行中通过 Msg 来获取发送信息的内容 ) 3. 线程消息队列的消息添加在代码 3-20 中第 2 行, 创建了一个外部线程, 并将处理器实例传递给该线程 代码 3-21 是该线程的定义代码 代码 3-21 访问消息队列的线程的定义文件名 :LocalThread.java 1 public class LocalThread extends Thread { 2 // 主线程消息队列接口实例 3 private Handler mhandler = null; 4 private HandlerDemoAct mcontext = null; 5 6 public LocalThread(HandlerDemoAct handlerdemoact) { // 传递主 Activity 接口 this.mcontext = handlerdemoact; 9

28 2 Android 平台开发之旅 代码 3-21 访问消息队列的线程的定义 文件名 :LocalThread.java 11 public LocalThread(HandlerDemoAct handlerdemoact, Handler handler) { 12 // 传递主线程消息队列处理器接口和主 Activity 接口 13 this.mhandler = handler; 14 this.mcontext = handlerdemoact; public void run() { 19 // 创建消息传递容器 20 Bundle bundle = new Bundle(); 21 // 添加数据项 22 bundle.putcharsequence("sender", mcontext.gettitle() ); 23 bundle.putstring("msg", "Hi, Paul!"); 24 // 创建消息实例 25 Message msg = new Message(); 26 // 设置消息数据 2 msg.setdata(bundle); 2 // 发送消息 29 mhandler.sendmessage(msg); super.run(); ; 在外部线程的执行函数 run 中, 需要先创建一个 Bundle 对象实例 ( 第 20 行 ), 然后将消息内容以 键 值 的形式添加到该实例中 ( 第 22 行和第 23 行 ) 再创建一个消息对象实例 ( 第 25 行 ), 然后将前面已经填充好的 Bundle 实例设置为该消息实例的数据内容 ( 第 2 行 ) 最后通过处理器将消息发送到主线程的消息队列中( 第 29 行 ) 组件与服务间的交互机制在 小节中, 作者对服务组件的使用方式进行了简要地说明, 并列举了如何在 Activity 组件中启动或关闭服务组件 但这种应用方式存在一定的问题, 对服务组件的控制只有开始和结束两种, 如果还有其他的控制则无法做到 例如 : 作为一个播放音乐文件的服务组件, 除了开始和结束控制, 还应该有播放下一首或者播放上一首的功能 1. AIDL IPC 机制在 Android 平台, 提供了一套称为 AIDL IPC 的机制, 可以解决客户端组件与服务组件的接口访问 AIDL(Android Interface Definition Language,Android 接口定义语言 ) 是经过扩展, 适应 Android 平台的一种对接口定义语言 (IDL), 通过 AIDL ADT 插件可以自动生成对应的 Java 代码 AIDL IPC 机制是一种基于接口 轻量级的, 类似于 COM 或 Croba 机制 服务组件通过 Android 接口定义语言定义其需要向外界提供的接口, 客户端可以通过连接到服务组件来获取这些服务接口, 从而实现与服务组件进行交互的目的

29 第 3 章 Android 应用程序组件 29 提示 :Android 平台底层提供了一种轻量级的 用于 RPC(Remote Procedure Calls, 远程过程调用 ) 的机制 客户端组件在本地调用接口方法, 但是该方法在远程组件中执行, 并且将结果返回到客户端 详细的解释请参考 SDK 文档 Processes and Threads 章节 实际上,Android 平台的这一机制与 J2SE 平台中的 RMI(Remote Method Invoke, 远程方法调用 ) 机制类似, 读者可以结合 RMI 机制来了解 Android 平台的 RPC 应用模式 图 3-13 和图 3-14 分别是是客户端组件与服务组件进行连接和断开的界面, 而图 3-15 是客户端组件调用服务组件所提供的接口进行交互的界面 图 3-13 服务连接 图 3-14 断开服务连接 图 3-15 通过服务接口进行通信代码 3-22 是客户端组件 (Activity) 的定义代码 代码 3-22 客户端组件的定义代码文件名 :ServiceDemoAct.java 1 public class ServiceDemoAct extends Activity implements OnClickListener { 2 3 // 服务接口实例 4 private IEchoService mservice = null;

30 30 Android 平台开发之旅 代码 3-22 客户端组件的定义代码文件名 :ServiceDemoAct.java 5 // 服务连接接口实例 6 private ServiceConnection mconnection = new ServiceConnection() { // 9 public void onserviceconnected(componentname name, IBinder service) { // 通过存根获取服务接口实例 11 mservice = IEchoService.Stub.asInterface(service); // 当连接断开时回调 15 public void onservicedisconnected(componentname name) { 16 // 销毁服务接口实例 1 mservice = null; 1 19 ; // 连接到服务组件 22 private void dobind() { 23 // 连接到指定服务组件 ( 如果不存在则自动创建 ) 24 bindservice(new Intent(EchoService.class.getName() ), 25 mconnection, 26 Context.BIND_AUTO_CREATE); 2 setbuttons(true); // 开始通信 31 private void dotrasaction() { 32 String echo = null; try { 35 // 通过服务接口调用远程方法 36 echo = mservice.getecho(mtxtname.gettext().tostring().trim() ); 3 catch (RemoteException e) { 3 // TODO Auto-generated catch block 39 e.printstacktrace(); // 本地显示远程服务返回的结果 42 Toast.makeText(this, echo, Toast.LENGTH_LONG).show(); // 断开连接 46 private void dounbind() {

31 第 3 章 Android 应用程序组件 31 代码 3-22 客户端组件的定义代码 文件名 :ServiceDemoAct.java 4 // 断开与远程服务的连接 4 unbindservice(mconnection); 49 setbuttons(false); ; 代码 3-22 中, ServiceConnection 成员用来管理客户端组件与服务组件的连接 ( 第 6 行 ), 在其定义体中重载了 onserviceconnected ( 第 9 行 ) 和 onservicedisconnected 方法 ( 第 15 行 ), 用于连接服务和断开连接的回调 在 onserviceconnected 方法中, 通过服务接口存根的 asinterface 方法获取到 代表 服务实例的接口实例 ( 第 11 行 ), 通过该接口实例就可以在客户端组件 (Activity) 中使用服务组件所 暴露 的方法 ( 第 36 行就是通过服务接口实例 mservice 来调用服务组件所提供的 getecho 方法 ) 提示 : 有关存根 (Stub) 的定义, 在 J2SE 平台的 RMI 机制中也有说明 存根是一种中间接口, 用于客户端和服务端的通信数据解释 这就必须要求客户端和服务端的数据内容是可以通过 包裹 来传递的, 即这些数据类都必须实现 Parcelable 接口 在 J2SE RMI 机制中, 远程接口定义中返回值的类型必须为支持序列化 (Serializable) 的实体类, 用户自定义类型如果需要通过 RMI 机制进行传递, 那么该类也必须实现 Serializable 接口 从通信的角度而言, 无论是 Parcelable 还是 Serialization 接口, 都是视为一种协议规范, 通过这种协议规范, 客户端才能与远程服务端进行信息交换, 如此而已 Android 平台提供了 Activity 组件与服务组件进行连接或断开的接口, 在代码 3-22 第 24 行, 通过 bindservice 方法将服务连接接口 (mconnection) 与服务组件进行绑定, 其中的 Context.BIND_AUTO_CREATE 标志 ( 第 26 行 ) 用于指示自动创建服务组件并绑定 在第 4 行, 通过 unbindservice 方法来断开与服务组件的连接 2. 服务接口的定义代码 3-23 使用 AIDL 语言定义的服务组件的接口, 该接口中只定义一个方法 ( getecho ), 该方法用于获取对指定呼叫者的 回话 代码 3-23 回声服务接口定义文件名 :IEchoService.aidl 1 package foolstudio.demo.service; 2 3 interface IEchoService { 4 String getecho(string call); 5 ADT 插件会自动解释 aidl 文件, 并生成一个接口定义的 Java 文件 ( 在工程文件结构的 gen 目录中, 如图 3-15 所示的 IEchoService.java 文件 )

32 32 Android 平台开发之旅 图 3-15 aidl 文件与自动生成文件路径对于 AIDL 的详细语法, 请参考有关 IDL 资料和 Android SDK 文档 Designing a Remote Interface Using AIDL 章节 3. 服务组件的定义服务接口定义好了, 还要由服务组件来实施才行, 代码 3-24 是服务组件的定义 代码 3-24 远程服务组件的定义文件名 :EchoService.java 1 public class EchoService extends Service { 2 // 服务接口存根对象实例 3 private final IEchoService.Stub mbinder = new IEchoService.Stub() { 5 public String getecho(string call) throws RemoteException { 6 // 返回结果给客户端 return ("Hi, " + call + "!"); 9 ; 11 // 存在服务连接时回调 13 public IBinder onbind(intent intent) { 14 // 判断请求的客户端是否为预期对象, 如果是则返回服务接口存根对象实例 15 if(echoservice.class.getname().equals(intent.getaction())) { 16 return (mbinder); return null; ; 在服务组件定义体中, 首先定义了一个服务接口存根 (Stub)( 第 3 行 ), 该存根类的定义在由 aidl 文件自动生成的接口文件定义中 该存根实例用于服务组件与客户端进行通信, 将服务组件的输出内容通过协议规定的形式发送给客户端存根对象 ( 第 行 ) 服务组件的 onbind 方法 ( 第 13 行 ) 重载于系统服务组件框架 ( 第 1 行 ), 用于向客户端提供服务接口存根对象

33 第 3 章 Android 应用程序组件 33 提示 : 代码 3-24 中 onbind 方法的返回值是一个 IBinder 实例,IBinder 接口是一个远程对象的基本接口, 描述了与远程对象进行交互的基本协议 但是 Android 平台建议不通过直接实现该接口来定义远程对象, 而是通过继承 Binder 类 Binder 类是对 IBinder 接口的实现, 是远程对象的基类, 该类是轻量级远程过程调用 (RPC) 机制的核心部分 大多数情况下, 开发人员通过 aidl 来定义服务接口, 然后由 aidl 工具生成对应的 Binder 子类 4. 程序清单代码 3-25 是该服务演示程序的清单文件内容, 该程序包含 1 个 Activity 组件 ( 第 行 ) 和 1 个服务组件 ( 第 行 ) 代码 3-25 回声服务程序的工程清单文件文件名 :AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-"?> 2 <manifest xmlns:android=" 3 package="foolstudio.demo" 4 android:versioncode="1" 5 android:versionname="1.0"> 6 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".servicedemoact" android:label="@string/app_name"> 9 </activity> <service android:name=".service.echoservice" android:label="echoservice"> 11 <intent-filter> 12 <action android:name="foolstudio.demo.service.echoservice" /> 13 </intent-filter> 14 </service> 15 </application> 16 <uses-sdk android:minsdkversion="3" /> 1 </manifest> 3.4 Android 平台应用程序组件小结 Android 平台中定义了 4 种重要的应用程序组件 :Activity( 活动 ) 服务 广播接收器和内容提供者 这些应用程序组件根据其适用场合的不同被作者赋予不同的角色 :Activity 组件主要应用于提供用户界面, 是非常注重界面表现的 形象大使 ; 而服务组件主要用于后台业务处理, 不习惯表现的 老黄牛 ; 广播接收器主要用于接收系统或用户程序所发送的广播消息并做出响应, 是一个积极的 倾听者 ; 内容提供者组件主要用于通过约定的方式将本组件的数据共享给外部组件 通过这 4 种基本组件的组合和集成, 开发人员就可以开发出满足各种应用的程序 Android 平台还为 4 种组件之间的过程调用 数据共享提供了一些辅助的机制 通过意图组件桥接机制, 可以实现 Activity 组件与 Activity 组件以及 Activity 组件与服务组件之间的数据交互 ; 通过线程消息队列的机制,Activity 组件可以与外部线程进行消息传递 ; AIDL IPC 和 RPC 机制, 是 Android 平台的核心机制, 用于提供对远程对象的访问 Activity 组件可以在本地调用远程服务组件所 暴露 的接口, 该方法在远程对象中进行执行, 通过 PRC 机制进行过程参数和执行结果的传递

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

Android Service

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

More information

01_Service

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

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

手说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

建模与图形思考

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

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

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

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系 教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 (s11639104@stu.edu.tw) 學校系所 : 樹德科技大學資訊工程學系 實驗目的 本實驗的目的在於讓同學們可以了解 Android 系統核心內部的行程通訊的原理, 透過呼叫系統提供的其中一樣服務

More information

建模与图形思考

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

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

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

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

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

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

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

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

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

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

Android 编程基础 Android 开发教程 & 笔记 1

Android 编程基础 Android 开发教程 & 笔记 1 Android 开发教程 & 笔记 1 多式样 ProgressBar 撰写 : 地狱怒兽 联系 :zyf19870302@126.com 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了

More information

Guava学习之Resources

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

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

Dynamic Layout in Android

Dynamic Layout in Android Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中

More information

Lecture01_Android介绍

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

More information

软件工程文档编制

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

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

使用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

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

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

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

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

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

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

Lecture01_Android介绍

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

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

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

ShareText

ShareText 作者 : 林致宇 日期 :2012/1/23 問題 : 如何分享分享文字資訊給其它的應用程式? 解答 : 有時候我們可能會希望 我們的應用程式的資訊 能夠讓使用者分享出去, 讓使用者能夠將此資訊傳送簡訊給其好友或寄電子郵件的方式寄給其好友, 這份文件將示範如何寫出這樣的應用程式 本文件將產出兩個 App, 第一個 App 是 分享資料的來源, 名為 CopyPaste_Source, 功能非常簡單,

More information

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)

More information

建立Android新專案

建立Android新專案 Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立

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

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

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

Android线程和进程

Android线程和进程 Android 进程和线程 版权声明 华清远见教育集团版权所有 ; 未经华清远见明确许可, 不得为任何目的以任何形式复制或传播此文档的任何部分 ; 本文档包含的信息如有更改, 恕不另行通知 ; 华清远见教育集团保留所有权利 Android 进程和线程 在安装 Android 应用程序的时候,Android 会为每个程序分配一个 Linux 用户 ID, 并设置相应的权限, 这样其它应用程序就不能访问此应用程序所拥有的数据和资源了

More information

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

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

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

云数据库 RDS SDK

云数据库 RDS SDK 云数据库 RDS SDK SDK SDK 下载 SDK 下载 最新版本 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip 历史版本 2015-11-3 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip JAVA 教程 JAVA 创建 Access Key 登陆阿里云账号 打开 我的 Access

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

腾讯社交广告转化追踪 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

Android Fragment

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

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

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 70-536Chinese(C++) Title : TS:MS.NET Framework 2.0-Application Develop Foundation Version : DEMO 1 / 10 1. Exception A. Data B. Message C.

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

Android 开发教程

Android 开发教程 封面 1 文件存取编程基础 文件 文件可以用来存储比使用引用更大数量的数据 Android 提供方法来读 写文件 只有本地文件可以被访问 优点 : 可以存储大容量的数据 缺点 : 文件更新或是格式改变可能会导致巨大的编程工作 文件操作 读文件 Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出 FileNotFoundException

More information

Microsoft Word - A201103-528_1299547322.doc

Microsoft Word - A201103-528_1299547322.doc 5 10 15 20 25 30 基 于 Android 平 台 的 人 机 交 互 的 研 究 与 实 现 郁 亚 男 ( 北 京 邮 电 大 学 软 件 学 院, 北 京 100876) 摘 要 : 随 着 计 算 的 发 展, 计 算 变 得 越 来 越 自 由, 在 资 源 使 用 方 面 也 越 来 越 灵 活 移 动 终 端 由 于 无 线 通 信 网 络 传 输 速 率 的 提 高,

More information

Struts2自定义类型转换.doc

Struts2自定义类型转换.doc Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter,

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

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

在Spring中使用Kafka:Producer篇

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

More information

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech - OfficeCoder 1 2 3 4 1,2,3,4 xingjiarong@mail.sdu.edu.cn 1 xuchongyang@mail.sdu.edu.cn 2 sun.mc@outlook.com 3 luoyuanhang@mail.sdu.edu.cn 4 Abstract. Microsoft Word 2013 Word 2013 Office Keywords:,, HTML5,

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

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

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

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

第一章 Android 简介与开发环境搭建

第一章 Android 简介与开发环境搭建 安卓开发环境与常用布局 第一章 Android 简介与开发环境搭建 本章目标 3G 的概念 Android 的改变 Android 开发环境的搭建编写第一个 Android 程序 Android 程序的目录结构 手机发展史 1. 3G 的概念 3G 全称为 :3rd Generation, 中文含义即为第三代数字通信, 是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统 2. 符合 3G

More information

Android + NFC

Android + NFC Android + NFC 建國科技大學資管系饒瑞佶 2017/3 v1 讀取 Tag UUID Android 2.3.3 (API Level 10) 才有支援完整的 NFC 功能 只要 NFC 相容都讀的到 (NFC 或 Mifare) 建立新專案修改 AndroidManifest.xml 加入 , 如果有 NFC Tag 進入感測範圍, 本 App 也會變成可處理的

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

掌盟 SoEasy SDK 开发者帮助文档 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion="19" b) 如果 AndroidManifest.xml 有 insta

掌盟 SoEasy SDK 开发者帮助文档 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion=19 b) 如果 AndroidManifest.xml 有 insta 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion="19" b) 如果 AndroidManifest.xml 有 installlocation 选项时, 参数设置为 auto c) AndroidManifest.xml 中的 Activity 需要进行如下配置 android:configchanges="keyboardhidden

More information

第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并

第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并 第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并接收广播中的消息就需要使用 BroadcastReceiver( 广播接收者 ), 广播接收者是 Android

More information

_banneradview.settest(true); _banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanner

_banneradview.settest(true); _banneradview.setuserkeywords(swimming); _banneradview.setusercategories(1,3,4); _banneradview.setusergender(jdbanner 京东 APP 联盟 SDK Android 版接口说明文档 1.0 1. 嵌入 SDK 1.1 添加 SDK Android Studio 环境 : 菜单 New->New Module->Import.jar or.aar package, 然后选中 App 联盟 SDK 所带的 jar 文件 Eclipse+ADT 环境 : 将 App 联盟 SDK 所带的 jar 文件拷贝到 libs/ 目录下

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat 本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用 2. AOP 底层技术实现 小风 Java 实战系列教程

More information

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难 第 1 章 Java 概 述 Java 的 诞 生 Java 的 特 点 Java 开 发 环 境 安 装 与 配 置 创 建 并 运 行 一 个 简 单 的 Java 程 序 Java 语 言 是 当 今 计 算 机 软 件 行 业 中 最 热 门 的 网 络 编 程 语 言, 以 Java 为 核 心 的 芯 片 技 术 编 译 技 术 数 据 库 连 接 技 术, 以 及 基 于 企 业 级

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

拦截器(Interceptor)的学习

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

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

0511-Android程式之GPS應用_專題週記4

0511-Android程式之GPS應用_專題週記4 逢甲大學通訊工程學系專題研究 Android 程式之 GPS 應用 專題週記 0511 學生姓名 陳彥儒 D0035131 廖元譽 D0077791 指導老師 楊豐瑞老師繳交日期 2014.05.11 1 匯入 GoogleMap 1.1 取得授權步驟 目前進度 取得 Google 授權鑰匙 實作程式尚未成功 1.1.1 建立個人的 keystore 1.1.2 由個人的 keystore 查詢 SHA1

More information

untitled

untitled How to using M-Power Report API M-Power Report API 力 了 M-Power Report -- Java (Library) M-Power Report API 行 Java M-Power Report M-Power Report API ( 30 ) PDF/HTML/CSV/XLS JPEG/PNG/SVG 料 料 OutputStream

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

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

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

北京方研矩行科技有限公司 Android SDK 快速接入文档

北京方研矩行科技有限公司 Android SDK 快速接入文档 Android SDK 快速接入文档 目录 概要... 3 1 SDK 介绍... 3 2 AndroidMinfest.xml 配置... 4 3 SDK 初始化... 6 4 发送手机验证码... 10 5 注册... 11 6 登录... 11 7 获取产品列表... 12 8 获取设备列表... 13 9 发现设备... 14 10 绑定设备... 15 11 控制设备... 15 12 接收设备上报消息...

More information

書面

書面 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 5.4 互動功能畫面 程式碼請參考附件-程式三 在進入互動頁面時 會執行setAllText()依寵物狀態數值來 設定狀態文字與頭像 並且依心情決定是否要不要播放音效 觸摸的區域 由於是自己寫的 view 所以並未透過xml來設置 而是透過Layut.addview()來動態新增

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

Microsoft Word - ASM SDK 說明文件

Microsoft Word - ASM SDK 說明文件 System Monitor SDK (for Android) 開發者指南說明書 1. 技術項目簡介 經由簡化的應用程式介面 (Application Programming Interface), 可 提供給 Android 應用程式開發者開發基於 System monitor 的應用程式 2. 應用範圍說明 本技術可應用於具備 Android 系統 2.3.3 以上版本的 Android 嵌入式裝

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

INTRODUCTION TO COM.DOC

INTRODUCTION TO COM.DOC How About COM & ActiveX Control With Visual C++ 6.0 Author: Curtis CHOU mahler@ms16.hinet.net This document can be freely release and distribute without modify. ACTIVEX CONTROLS... 3 ACTIVEX... 3 MFC ACTIVEX

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

1

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

More information

RecyclerView and CardVew

RecyclerView and CardVew RecyclerView and CardView 建國科技大學資管系饒瑞佶 2017/10 V1 CardView CardView A CardView is a ViewGroup. Like any other ViewGroup, it can be added to youractivity or Fragment using a layout XML file. To create an

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

03 开发入门.key

03 开发入门.key #3 手机应用开发入门 刘宁 Email:liuning2@mail.sysu.edu.cn 大纲» Android 基本概念» 开发包及 工具安装» 创建 HelloWorld» Android 程序设计基础 2 Android 开发基本概念» Activities» Intents» 视图与控件 ( 界 面元素 )» 异步调 用 ( 多线程 支持 )» 后台服务 3 Activities Android

More information

第6讲

第6讲 移 动 终 端 开 发 平 台 介 绍 (Android) 哈 尔 滨 工 业 大 学 软 件 学 院 唐 好 选 Email:tanghx@hit.edu.cn 主 要 内 容 Android 的 技 术 架 构 Android 开 发 环 境 的 建 立 Android 的 基 本 组 件 Android 程 序 的 基 本 结 构 什 么 是 Android Android 本 义 指 机 器

More information