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

Similar documents
01_Service

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

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

手说TTS开发指南

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

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Android Service

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

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

書面

建模与图形思考

上海市教育委员会文件

<4D F736F F D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

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

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

1

面试题目及其答案

Android线程和进程

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

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

发生在它被销毁或者另一个 activity( 可能是现存 的或者是新的 ) 回到运行状态并覆盖了它 or ondestroy() 如果 activity 再次回到前台跟用户交互则继以 onrestart(), 如果关闭 activity 则继以 ondestroy() 在 activity 销毁前调

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

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

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

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

拦截器(Interceptor)的学习

建模与图形思考

提纲 1 2 OS Examples for 3

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

Microsoft Word - 004_Android線程模式介紹.doc

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

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

无类继承.key

第6讲

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

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

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

TVS厂商接入流程API文档

EJB-Programming-4-cn.doc

智能移动平台应用开发6 Android组件通信2 消息机制

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

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

移动安全

软件工程文档编制

幻灯片 1

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

Android Android Android SDK iv

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

RxJava

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

1. 2. Flex Adobe 3.

INTRODUCTION TO COM.DOC

ShareText

Microsoft Word - A _ doc

Chapter 9: Objects and Classes

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

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

Microsoft Word - AEL Part08

使用MapReduce读取XML文件

mvc

1.5招募说明书(草案)

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

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

新美大酒店开放平台SDK(.NET版)使用说明.pages

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

M24SR M24LR NFC Android


「西醫基層總額支付委員會《第28次委員會議紀錄

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

百度xx SDK用户手册

移动终端开发与应用

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

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

Microsoft Word - ASM SDK 說明文件

试题

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

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

百度xx SDK用户手册

教案模板4-2

Guava学习之Resources

本文档旨在说明如果快速的接入集成推送 SDK, 快速实现小米, 华为, 魅族的推送接入, 有关详细的设计文档参考集成推送设计说明文档 准备工作 编译本项目, 配置完 android sdk 后执行以下命令, 或者你可以将本工程导入到 android studio 中./gradlew clean a

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

untitled

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

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

03 开发入门.key

開發工具下載與安裝

untitled

基于ECO的UML模型驱动的数据库应用开发1.doc

Android + NFC

安卓游戏大全美女车震小说情节 韩国美女车震视频秘密爱 韩国美女车震

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

移动终端开发与应用

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

Chapter #

Transcription:

1. 请描述下 Activity 的生命周期 必调用的三个方法 :oncreate() --> onstart() --> onresume(), 用 AAA 表示 (1) 父 Activity 启动子 Activity, 子 Actvity 退出, 父 Activity 调用顺序如下 AAA --> onfreeze() --> onpause() --> onstop() --> onrestart() --> onstart(),onresume() (2) 用户点击 Home,Actvity 调用顺序如下 AAA --> onfreeze() --> onpause() --> onstop() -- Maybe --> ondestroy() Maybe (3) 调用 finish(), Activity 调用顺序如下 AAA --> onpause() --> onstop() --> ondestroy() (4) 在 Activity 上显示 dialog, Activity 调用顺序如下 AAA (5) 在父 Activity 上显示透明的或非全屏的 activity,activity 调用顺序如下 AAA --> onfreeze() --> onpause() (6) 设备进入睡眠状态,Activity 调用顺序如下 AAA --> onfreeze() --> onpause() 2. 如果后台的 Activity 由于某原因被系统回收了, 如何在被系统回收之前保存当前状态? onsaveinstancestate() 当你的程序中某一个 Activity A 在运行时, 主动或被动地运行另一个新的 Activity B, 这个时候 A 会执行 onsaveinstancestate() B 完成以后又会来找 A, 这个时候就有两种情况 : 一是 A 被回收, 二是 A 没有被回收, 被回收的 A 就要重新调用 oncreate() 方法, 不同于直接启动的是这回 oncreate() 里是带上了参数 savedinstancestate; 而没被收回的就直接执行 onresume(), 跳过 oncreate() 了 3. 如何将一个 Activity 设置成窗口的样式 在 AndroidManifest.xml 中定义 Activity 的地方一句话 android:theme="@android:style/theme.dial og" 或 android:theme="@android:style/theme.translucent" 就变成半透明的 4. 如何退出 Activity? 如何安全退出已调用多个 Activity 的 Application? 对于单一 Activity 的应用来说, 退出很简单, 直接 finish() 即可 当然, 也可以用 killprocess() 和 System.exit() 这样的方法 但是, 对于多 Activity 的应用来说, 在打开多个 Activity 后, 如果想在最后打开的 Activity 直接退出, 上边的方法都是没有用的, 因为上边的方法都是结束一个 Activity 而已 当然, 网上也有人说可以 就好像有人问, 在应用里如何捕获 Home 键, 有人就会说用 keycode 比较 KEYCODE_HOME 即可, 而事实上如果不修改 framework, 根本不可能做到这一点一样 所以, 最好还是自己亲自试一下 那么, 有没有办法直接退出整个应用呢? 在 2.1 之前, 可以使用 ActivityManager 的 restartpackage 方法 它可以直接结束整个应用 在使用时需要权限 android.permission.restart_packages 注意不要被它的名字迷惑 可是, 在 2.2, 这个方法失效了 在 2.2 添加了一个新的方法,killBackgroundProcesses(), 需要权限 android.permission.kill_backgr

OUND_PROCESSES 可惜的是, 它和 2.2 的 restartpackage 一样, 根本起不到应有的效果 另外还有一个方法, 就是系统自带的应用程序管理里, 强制结束程序的方法,forceStopPackage() 它需要权限 android.permission.force_stop_packages 并且需要添加 android:shareduserid="android.uid.system" 属性同样可惜的是, 该方法是非公开的, 他只能运行在系统进程, 第三方程序无法调用 因为需要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform 而 Android.mk 是用于在 Android 源码下编译程序用的 从以上可以看出, 在 2.2, 没有办法直接结束一个应用, 而只能用自己的办法间接办到 现提供几个方法, 供参考 : 1 抛异常强制退出 : 该方法通过抛异常, 使程序 Force Close 验证可以, 但是, 需要解决的问题是, 如何使程序结束掉, 而不弹出 Force Close 的窗口 2 记录打开的 Activity: 每打开一个 Activity, 就记录下来 在需要退出时, 关闭每一个 Activity 即可 3 发送特定广播 : 在需要结束应用时, 发送一个特定的广播, 每个 Activity 收到广播后, 关闭即可 4 递归退出 在打开新的 Activity 时使用 startactivityforresult, 然后自己加标志, 在 onactivityresult 中处理, 递归关闭 除了第一个, 都是想办法把每一个 Activity 都结束掉, 间接达到目的 但是这样做同样不完美 你会发现, 如果自己的应用程序对每一个 Activity 都设置了 nosensor, 在两个 Activity 结束的间隙,se nsor 可能有效了 但至少, 我们的目的达到了, 而且没有影响用户使用 为了编程方便, 最好定义一个 Activity 基类, 处理这些共通问题 5. 请介绍下 Android 中常用的五种布局 FrameLayout( 框架布局 ),LinearLayout ( 线性布局 ),AbsoluteLayout( 绝对布局 ),Relative Layout( 相对布局 ),TableLayout( 表格布局 ) 6. 请介绍下 Android 的数据存储方式 一.SharedPreferences 方式二. 文件存储方式三.SQLite 数据库方式

四. 内容提供器 (Content provider) 方式五. 网络存储方式 7. 请介绍下 ContentProvider 是如何实现数据共享的 创建一个属于你自己的 Content provider 或者将你的数据添加到一个已经存在的 Content provider 中, 前提是有相同数据类型并且有写入 Content provider 的权限 8. 如何启用 Service, 如何停用 Service Android 中的 service 类似于 windows 中的 service,service 一般没有用户操作界面, 它运行于系统中不 容易被用户发觉, 可以使用它开发如监控之类的程序 一 步骤 第一步 : 继承 Service 类 public class SMSService extends Service { 第二步 : 在 AndroidManifest.xml 文件中的 <application> 节点里对服务进行配置 : <service android:name=".demoservice" /> 二 Context.startService() 和 Context.bindService 服务不能自己运行, 需要通过调用 Context.startService() 或 Context.bindService() 方法启动服务 这 两个方法都可 以启动 Service, 但是它们的使用场合有所不同 1. 使用 startservice() 方法启用服务, 调用者与服务之间没有关连, 即使调用者退出了, 服务仍然运行 使用 bindservice() 方法启用服务, 调用者与服务绑定在了一起, 调用者一旦退出, 服务也就终止 2. 采用 Context.startService() 方法启动服务, 在服务未被创建时, 系统会先调用服务的 oncreate() 方法, 接着调用 onstart() 方法 如果调用 startservice() 方法前服务已经被创建, 多次调用 startservice() 方 法并 不会导致多次创建服务, 但会导致多次调用 onstart() 方法 采用 startservice() 方法启动的服务, 只能调用 Context.stopService() 方法结束服务, 服务结束时会调 用 ondestroy() 方法 3. 采用 Context.bindService() 方法启动服务, 在服务未被创建时, 系统会先调用服务的 oncreate() 方法, 接着调用 onbind() 方法 这个时候调用者和服务绑定在一起, 调用者退出了, 系统就会先调用服务的

onunbind() 方法, 接着调用 ondestroy() 方法 如果调用 bindservice() 方法前服务已经被绑定, 多次调用 bindservice() 方法并不会 导致多次创建服务及绑定 ( 也就是说 oncreate() 和 onbind() 方法并不会被多次调用 ) 如果调用者希望与正在绑定的服务解除绑定, 可以调用 unbindservice() 方法, 调用该方法也会导致系统调用服务的 onunbind()-->ondestroy() 方法 三 Service 的生命周期 1.Service 常用生命周期回调方法如下 : oncreate() 该方法在服务被创建时调用, 该方法只会被调用一次, 无论调用多少次 startservice() 或 bindservice() 方法, 服务也只被创建一次 ondestroy() 该方法在服务被终止时调用 2. Context.startService() 启动 Service 有关的生命周期方法 onstart() 只有采用 Context.startService() 方法启动服务时才会回调该方法 该方法在服务开始运行时 被调用 多次调用 startservice() 方法尽管不会多次创建服务, 但 onstart() 方法会被多次调用 3. Context.bindService() 启动 Service 有关的生命周期方法 onbind() 只有采用 Context.bindService() 方法启动服务时才会回调该方法 该方法在调用者与服务绑定 时被调用, 当调用者与服务已经绑定, 多次调用 Context.bindService() 方法并不会导致该方法被多次调用 onunbind() 只有采用 Context.bindService() 方法启动服务时才会回调该方法 该方法在调用者与服务解 除绑定时被调用 备注 : 1. 采用 startservice() 启动服务 Intent intent = new Intent(DemoActivity.this, DemoService.class); startservice(intent); 2.Context.bindService() 启动 Intent intent = new Intent(DemoActivity.this, DemoService.class);

bindservice(intent, conn, Context.BIND_AUTO_CREATE); //unbindservice(conn);// 解除绑定 9. 注册广播有几种方式, 这些方式有何优缺点? 请谈谈 Android 引入广播机制的用意 Android 广播机制 ( 两种注册方法 ) 在 android 下, 要想接受广播信息, 那么这个广播接收器就得我们自己来实现了, 我们可以继承 B roadcastreceiver, 就可以有一个广播接受器了 有个接受器还不够, 我们还得重写 BroadcastRec eiver 里面的 onreceiver 方法, 当来广播的时候我们要干什么, 这就要我们自己来实现, 不过我们可以搞一个信息防火墙 具体的代码 : public class SmsBroadCastReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Bundle bundle = intent.getextras(); Object[] object = (Object[])bundle.get("pdus"); SmsMessage sms[]=new SmsMessage[object.length]; for(int i=0;i<object.length;i++) { sms[0] = SmsMessage.createFromPdu((byte[])object[i]); Toast.makeText(context, " 来自 "+sms[i].getdisplayoriginatingaddr ess()+" 的消息是 :"+sms[i].getdisplaymessagebody(), Toast.LENGTH_SHORT).show(); // 终止广播, 在这里我们可以稍微处理, 根据用户输入的号码可以实现短信防火墙 abortbroadcast(); 当实现了广播接收器, 还要设置广播接收器接收广播信息的类型, 这里是信息 :android.provi der.telephony.sms_received

我们就可以把广播接收器注册到系统里面, 可以让系统知道我们有个广播接收器 这里有两种, 一 种是代码动态注册 : // 生成广播处理 smsbroadcastreceiver = new SmsBroadCastReceiver(); // 实例化过滤器并设置要过滤的广播 IntentFilter intentfilter = new IntentFilter("android.provider.Telephony. SMS_RECEIVED"); // 注册广播 BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, int entfilter); 一种是在 AndroidManifest.xml 中配置广播 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="spl.broadcastreceiver" android:versioncode="1" android:versionname="1.0"> name"> <application android:icon="@drawable/icon" android:label="@string/app_ <activity android:name=".broadcastreceiveractivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <!-- 广播注册 --> <receiver android:name=".smsbroadcastreceiver"> <intent-filter android:priority="20">

ED"/> <action android:name="android.provider.telephony.sms_receiv </intent-filter> </receiver> </application> <uses-sdk android:minsdkversion="7" /> -permission> <!-- 权限申请 --> <uses-permission android:name="android.permission.receive_sms"></uses </manifest> 两种注册类型的区别是 : 1) 第一种不是常驻型广播, 也就是说广播跟随程序的生命周期 动运行 2) 第二种是常驻型, 也就是说当应用程序关闭后, 如果有信息广播来, 程序也会被系统调用自 10. 请解释下在单线程模型中 Message Handler Message Queue Looper 之间的关系 Handler 简介 : 一个 Handler 允许你发送和处理 Message 和 Runable 对象, 这些对象和一个线程的 MessageQueue 相关 联 每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联 当你创建一个新的 Handler 时, 它就和创建它的线程绑定在一起了 这里, 线程我们也可以理解为线程的 MessageQueue 从这一点 上来看,Handler 把 Message 和 Runable 对象传递给 MessageQueue, 而且在这些对象离开 MessageQueue 时,Handler 负责执行他们 Handler 有两个主要的用途 :(1) 确定在将来的某个时间点执行一个或者一些 Message 和 Runnable 对象 (2) 在其他线程 ( 不是 Handler 绑定线程 ) 中排入一些要执行的动作

Scheduling Message, 即 (1), 可以通过以下方法完成 : post(runnable):runnable 在 handler 绑定的线程上执行, 也就是说不创建新线程 postattime(runnable,long): postdelayed(runnable,long): sendemptymessage(int): sendmessage(message): sendmessageattime(message,long): sendmessagedelayed(message,long): post 这个动作让你把 Runnable 对象排入 MessageQueue,MessageQueue 受到这些消息的时候执行他们, 当然以一定的排序 sendmessage 这个动作允许你把 Message 对象排成队列, 这些 Message 对象包含一 些信息,Handler 的 hanlermessage(message) 会处理这些 Message. 当然,handlerMessage(Message) 必 须由 Handler 的子类来重写 这是编程人员需要作的事 当 posting 或者 sending 到一个 Hanler 时, 你可以有三种行为 : 当 MessageQueue 准备好就处理, 定义 一个延迟时间, 定义一个精确的时间去处理 后两者允许你实现 timeout,tick, 和基于时间的行为 当你的应用创建一个新的进程时, 主线程 ( 也就是 UI 线程 ) 自带一个 MessageQueue, 这个 MessageQueue 管理顶层的应用对象 ( 像 activities,broadcast receivers 等 ) 和主线程创建的窗体 你可以创建自己的线程, 并通过一个 Handler 和主线程进行通信 这和之前一样, 通过 post 和 sendmessage 来完成, 差别在于在 哪一个线程中执行这么方法 在恰当的时候, 给定的 Runnable 和 Message 将在 Handler 的 MessageQueue 中被 Scheduled Message 简介 : Message 类就是定义了一个信息, 这个信息中包含一个描述符和任意的数据对象, 这个信息被用来传递给 Handler.Message 对象提供额外的两个 int 域和一个 Object 域, 这可以让你在大多数情况下不用作分配的 动作

尽管 Message 的构造函数是 public 的, 但是获取 Message 实例的最好方法是调用 Message.obtain(), 或者 Handler.obtainMessage() 方法, 这些方法会从回收对象池中获取一个 MessageQueue 简介 : 这是一个包含 message 列表的底层类 Looper 负责分发这些 message Messages 并不是直接加到一个 MessageQueue 中, 而是通过 MessageQueue.IdleHandler 关联到 Looper 你可以通过 Looper.myQueue() 从当前线程中获取 MessageQueue Looper 简介 : Looper 类被用来执行一个线程中的 message 循环 默认情况, 没有一个消息循环关联到线程 在线程中 调用 prepare() 创建一个 Looper, 然后用 loop() 来处理 messages, 直到循环终止 大多数和 message loop 的交互是通过 Handler 下面是一个典型的带有 Looper 的线程实现 class LooperThread extends Thread { public Handler mhandler; public void run() { Looper.prepare(); mhandler = new Handler() { public void handlemessage(message msg) { // process incoming messages here ;

Looper.loop(); 11. AIDL 的全称是什么? 如何工作? 能处理哪些类型的数据? AIDL 的英文全称是 Android Interface Define Language 当 A 进程要去调用 B 进程中的 service 时, 并实现通信, 我们通常都是通过 AIDL 来操作的 A 工程 : 首先我们在 net.blogjava.mobile.aidlservice 包中创建一个 RemoteService.aidl 文件, 在里面我 们自定义一个接口, 含有方法 get ADT 插件会在 gen 目录下自动生成一个 RemoteService.java 文件, 该 类中含有一个名为 RemoteService.stub 的内部类, 该内部类中含有 aidl 文件接口的 get 方法 说明一 :aidl 文件的位置不固定, 可以任意 然后定义自己的 MyService 类, 在 MyService 类中自定义一个内部类去继承 RemoteService.stub 这 个内部类, 实现 get 方法 在 onbind 方法中返回这个内部类的对象, 系统会自动将这个对象封装成 IBinder 对象, 传递给他的调用者 其次需要在 AndroidManifest.xml 文件中配置 MyService 类, 代码如下 : <!-- 注册服务 --> <service android:name=".myservice"> <intent-filter> <!-- 指定调用 AIDL 服务的 ID --> <action android:name="net.blogjava.mobile.aidlservice.remoteservice" /> </intent-filter> </service> 为什么要指定调用 AIDL 服务的 ID, 就是要告诉外界 MyService 这个类能够被别的进程访问, 只要别的 进程知道这个 ID, 正是有了这个 ID,B 工程才能找到 A 工程实现通信 说明 :AIDL 并不需要权限

B 工程 : 法中绑定 aidl 服务 首先我们要将 A 工程中生成的 RemoteService.java 文件拷贝到 B 工程中, 在 bindservice 方 绑定 AIDL 服务就是将 RemoteService 的 ID 作为 intent 的 action 参数 说明 : 如果我们单独将 RemoteService.aidl 文件放在一个包里, 那个在我们将 gen 目录下的该包拷贝到 B 工程中 如果我们将 RemoteService.aidl 文件和我们的其他类存放在一起, 那么我们在 B 工程中就要建立相应的包, 以保证 RmoteService.java 文件的报名正确, 我们不能修改 RemoteService.java 文件 bindservice(new Inten("net.blogjava.mobile.aidlservice.RemoteService"), serviceconnection, Context.BIND_AUTO_CREATE); ServiceConnection 的 onserviceconnected(componentname name, IBinder service) 方法中 的 service 参数就是 A 工程中 MyService 类中继承了 RemoteService.stub 类的内部类的对象