远程服务:调用者和服务在不同的工程代码里面。
本地服务:调用者和服务在同一个工程代码里面。
每一个应用程序都是运行在自己独立的进程里面的。
进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。
aidl:android interface definition language 安卓接口定义语言
aidl文件都是公有的,没有访问权限修饰符
IPC: inter process communication 进程间通讯
绑定本地服务调用方法的步骤:
1. 在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
private class MiddlePerson extends Binder implements IMiddlePerson { }
2. 实现服务的onbind方法,返回的就是中间人 MiddlePerson
3. 在activity 绑定服务。bindService();
4. 在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个
IBinder对象
5. 强制类型转化 调用接口里面的方法。
-------------------------------------------
绑定远程服务调用方法的步骤:
1. 在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2. 把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 public
private class MiddlePerson extends IMiddlePerson .Stub { } IPC的
子类,代理人 必须要实现一个方法,这个方法可以调用于服务的方法
3. 实现服务的onbind方法,返回的就是中间人 IMiddlePerson
4. 在activity 绑定服务。bindService();
5. 在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
6. IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。
==================绑定远程服务的流程=========================
1. 在 activity 调用 bindService() 去绑定服务, bindService(inten,new myCon(),BIND_AUTO_CREATE);
需要传递一个叫 ServiceConntion的接口参数,用来返回两个回调 当服务被成功
绑定, 当服务失去联系
2. 在服务里面 需要重写方法, onbind() 在服务被绑定的时侯 调用 返回一个
IBinder接口 对象(代理人) 接口定义,需要改成 aidl 用自动生成的IService.stub
代理人 必须要实现一个方法,这个方法可以调用到服务的方法
3. 在activity 的onServiceConneted 得到中间人,使用aidl 自动生成
IService.stub.asInterFace()
4. 调用中间人的方法
5. 中间人调用服务的方法
远程的服务:
public class RemoteService extends Service {
@Override
public void onCreate() {
System.out.println("远程服务被创建了。。。" );
super .onCreate();
}
@Override
public void onDestroy() {
System.out.println("远程服务被销毁了。" );
super .onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return new MiddlePerson();
}
private void methodInService(){
System.out.println("我是远程服务的方法,我被调用了。。。。" );
}
private class MiddlePerson extends IMiddlePerson .Stub {
@Override
public void callMethodInService() {
methodInService();
}
}
}
<service android:name="com.itheima.remoteservice.RemoteService" >
<intent-filter >
<action android:name="com.itheima.remoteservice" />
</intent-filter>
</service>
aidl文件
package com.itheima.remoteservice;
interface IMiddlePerson {
/**
* 调用服务里面的方法
*/
void callMethodInService();
}
public class MainActivity extends Activity {
private MyConn conn;
private IMiddlePerson iMp;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 绑定远程服务
* @param view
*/
public void bind (View view){
Intent intent = new Intent();
intent.setAction("com.itheima.remoteservice" );
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected (ComponentName name, IBinder service) {
iMp = IMiddlePerson.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected (ComponentName name) {
}
}
public void call (View view){
try {
iMp.callMethodInService();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy () {
unbindService(conn);
super .onDestroy();
}
}