1.AIDL机制
AIDL机制,据说是进程之间的通信,这进程之间是指什么?
两个应用程序还是一个应用程序,对于这点先记录在这里。
编写ITest.aidl文件 语法类似接口:基本数据类型 List Map或者实现Parcelable接口的对象
编写服务类TestService 继承android Service,在该服务类里面实现ITest.Stub mBinder = ITest.Stub(){} 实现aidl文件中定义的接口
在onBind方法中返回mBinder对象
在AndroidManifest.xml文件注册服务并加上intent-filter action = "com.kalus.aidl.ITest"
在客户端创建ServiceConnection con = new ServiceConnection(){}实现其中的两个方法
定义一个连接按钮,当点击时利用bindService(new Intent("com.kalus.ITest",con,BIND_AUTO_CREATE);
其他资料中说ITest.aidl文件在两个项目中的包名必须一样。
至此我所写的程序仍然没有跑通,一直报
05-09 09:07:02.451: WARN/ActivityManager(72): Unable to start service Intent { act=com.kalus.aidl.ITest }: not found
不知道什么原因,待我请教大牛在来详细述说。待我明白将补充详细文档。
2.android:export属性
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。
3.startService和bindService的区别
启动的方式不一样,
startService onCreate-onStart -onDestroy
bindService onCreate-onBind -onUnBind-onDestroy
service 的onCreate的方法只会被调用一次,onStart会被多次调用,无论startService 或者bindService多少次,并且只需要调用一次stopService就可以停掉服务
多次调用bindService如果已经绑定过了则不会再次调用onCreate和onBind了
使用startService()方法启用服务,调用者与服务之间没有关连,
即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
4.android:process属性
If the name assigned to this attribute begins with a colon (‘:’), a new process, private to the application, is created when it’s needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage