2) 以bindService()方式启动服务。调用方式如下:
onCreate()->onBind() 此时服务绑定。再次绑定则无响应。解除绑定:onUnbind()->onDestroy()。生命周期完成。如图所示:
13, 启动service的两种方法?有什么区别?
一种是startService(),另一种是bindService()。这两者的区别是第一种方式调用者开启了服务,即会与服务失去联系,两者没有关联。即使访问者退出了,服务仍在运行。如需解除服务必须显式的调用stopService方法。主要用于调用者与服务没有交互的情况下,也就是调用者不需要获取服务里的业务方法。比如电话录音。而后者调用者与服务绑定在一起的。当调用者退出的时候,服务也随之退出。用于需要与服务交互。
14, 实现进程内与进程间通信是怎么实现的?
在linux中进程通信机制有很多种,比如:消息队列(message queue),socket,共享内存(share mermory)等等。但是在Android中,无论是进程内还是进程间,所采用的通信机制,主要是以Binder为核心。Android之所以选择是Binder作为进程的通信机制,主要是Binder与其他通信方式相比更加快速和简洁,所消耗的内存也是相对较少。当然也有其他方面的原因,比如传统进程通信有可能会增加进程开销,也有安全方面的风险。Binder能解决这些问题。故成为首选的通信方式。
1) 进程内的通信,与进程间的通信相比,相对容易些。进程内通信肯定要采用绑定的方式开启服务。这样才能与服务进行交互。绑定服务的方法:
bindService(Intent service, ServiceConnection conn, int flags)
这个方法的第一个参数很好理解。用于激活哪个服务,第二个参数是关键,服务的连接,这是一个接口,用于接收服务开启或者关闭时返回的数据。实现这个接口要重写两个方法:
onServiceConnected(ComponentName name, IBinder service):一旦客户端与服务端绑定成功,将有这个方法的第二个参数接收服务端返回的IBinder对象。得到服务端的引用就可以在客户端调用服务里的一些业务方法。这也是进程内通信的主要部分。
onServiceDisconnected(ComponentName name):这个方法在服务断开是调用,服务被销毁或者被干掉时调用。附件处有例子。
2) 进程之间的通信,其主要的核心机制同样是Binder。其实Binder底层就是通过Parcel(邮包)来完成数据传输的。进程内通信可以通过IBinder对象来实现业务共享的,但是进程间的通信这种方式就肯定不行了。这时就用到了AIDL。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC).AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象.由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的.
使用方式如下:
定义AIDL. //XXXService.aidl,注意扩展名
package com.iteye.androidtoast;
interface XXXService {
void sayHello(in/out/inout String name);//in|out|inout是参数的方向
}
ide会自动在gen包下生成对应的java类,接口文件中生成一个Stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助方法.值得关注的是asInterface(IBinder iBinder),它返回接口类型的实例,对于远程服务调用,远程服务返回给客户端的对象为代理对象,客户端onServiceConnected(ComponentName name, IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行类型转换.
AIDL定义注意事项:
(1)接口名和aidl文件名相同.
(2)接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static.
(3)AIDL默认支持的类型包话java基本类型(int,long,boolean等)和(String,List,Map,
CharSequence),使用这些类型时不需要import声明.对于List和Map中的元素类型必须是AIDL支持的类型.如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口.
(4)自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中.
(5)在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数.
(6)Java原始类型默认的标记为in,不能为其它标记.
具体步骤:
1.创建服务器android项目(server)
2.创建服务类.CustomerService
/**
* 服务类
*/
public class CustomerService extends Service {
...
}
3.配置清单注册服务类
<!-- 注册服务 -->
<service android:name=". CustomerService " />
4.定义aidl文件.
ICustomerService.aidl
package com.iteye.androidtoast.aidl;
interface ICustomerService {
String sayHello(String name);
}
5.ide在gen目录下自动生成java接口.
6.需要实现CustomerService.onBind()方法的返回值.
public IBinder onBind(Intent intent) {
return new ICustomerService.Stub() {
public String sayHello(String name) throws RemoteException {
return "hello " + name;
}
};
}
7.创建客户端项目(android项目)
8.复制服务端项目aidl文件到客户端(连同包结构一同复制),同样在客户端项目中
也会生成对应的接口类.同步骤(5).
9.绑定服务.
class CustomerConnection implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
is = ICustomerService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName name) {
}
}
10.绑定服务
Intent i = new Intent();
i.setAction(“”)
this.bindService(i, conn, BIND_AUTO_CREATE);
11,调用远程服务方法
相关推荐
2018年Android面试系列文章
Android面试宝典包含两个宝典: 1【黑马项目宝典】虐面试官神器之必备黑马程序员项目宝典V1.1 内容包括:(1)电子商城(2)ListView系列(3)图像处理(4)动画效果(5)控件大全(6)新闻资讯(7)生活相关(8)...
"2018Android面试系列文章" 这个标题表明这是一个关于2018年针对Android开发者的面试准备资料集合。在这个系列中,我们可以期待找到当时Android开发者在面试过程中可能会遇到的核心技术和问题。这可能涵盖从基础到...
2. RuntimeException异常: - RuntimeException是Java中的一个运行时异常类,它的子类异常通常是由程序逻辑错误引起的。 - 选项A(ArithmeticException)不是RuntimeException的子类,它通常由算术错误引起,比如...
在准备Android面试的过程中,了解和掌握一系列核心知识点是至关重要的。以下是一些基于"Android面试题整理"的详细知识点解析: 1. **Android基础知识** - **Activity生命周期**:理解并能熟练绘制各个状态,包括...
### Android面试总结精华 在本篇文章中,我们将深入探讨一份由网络搜集整理的Android面试题集,这份资料不仅包含了常见的面试题目,还针对部分题目提供了详细的解答,旨在帮助准备参加Android开发岗位面试的朋友更...
### Android面试知识点详解 #### 1. 对Activity的理解 - **定义**:Activity是Android四大组件之一,代表了用户界面的一个屏幕。每个Activity都负责显示一个独立的屏幕,并且能够与其他Activity进行交互。 - **作用...
Android面试题大全 Android 基础知识 1. 自学 Android 的方式:通过看书、视频、敲代码、博客、项目、Github提交代码等方式自学 Android,掌握 API 后学习设计模式、架构、重构等。 2. 遇到不会的问题的处理方法...
### Android面试核心知识点详解 #### 一、Android系统的架构 Android系统采用了分层设计,从高层到底层可以分为以下几个层次: 1. **应用程序层(Application Layer)**:这一层由多个应用程序组成,比如联系人管理...
【标题】"Java面试宝典Android版源码"是一份专为Java开发者和Android开发者准备的面试准备资源,其中包含了Android开发的基本技术和相关联的Web技术。这份源码旨在帮助开发者提升对Android平台的理解,同时熟悉Java...
《Android面试题大全(中高级)》涵盖了一系列深度的技术问题,这些问题旨在考察面试者在Android开发、网络通信、数据结构与算法、Java编程等关键领域的专业能力和实践经验。 在第一章网络面试题中,从HTTP协议到...
【Android面试题详解】 在Android开发领域,面试中对技术的考察至关重要。许多企业在招聘Android工程师时,除了书面测试,还会在面试过程中深入探讨技术问题,覆盖从基础到项目的广泛内容,这无疑对求职者的技术...
### 某课XXX面试之谈解密Android 在当今高度发展的移动互联网时代,Android作为全球最广泛使用的移动操作系统之一,对于IT领域的求职者来说掌握其核心技术与面试技巧显得尤为重要。本文将根据“某课XXX面试之谈解密...
### Android面试基础题详解 #### ANR(Application Not Responding) ANR是Android系统为了确保用户体验而设置的一种机制,当应用程序在主线程(main thread)中执行时间过长,导致无法响应用户的输入事件时,系统会...
根据提供的文件信息,我们可以归纳出一系列与Android开发相关的知识点,主要涵盖Android应用程序的基本结构、资源管理等内容。下面将对这些知识点进行详细的阐述。 ### 一、Android 应用程序的基本结构 1. **src/...