您的位置:首页 > 移动开发 > Android开发

android callRemoteService 调用其他进程的service

2012-10-25 15:53 465 查看
创建一个进程服务.程序第一次运行的时候就创建.不需要界面

要想其他进程能够跨进程的调用本进程的方法.就得使用跨进程访问的接口类型.只需将接口中类和方法的修饰符去掉就行.然后把接口类编程aidl类型

服务也业务代码:

package com.example.remoteservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

/**
* 跨进程访问的接口类型:将接口和接口中方法的修饰类型去掉,
* android生成aidl文件步骤:找到编写的java源文件,将其扩展名该为aidl.然后回到项目
* ,刷新项目,该类就会变为源文件名.aidl的文件,并且系统会自动在gen
* .工程目录下生成原java文件的名的java文件.可以打开看下内容与之前不一样了.到此就完成了aidl的创建
*
* @author Administrator
*
*/
public class RemoteService extends Service {

@Override
public IBinder onBind(Intent arg0) {
return new Mybinder();
}

/**
* 可以继承系统根据自己定义的iservice接口生成iservice.adil之后的IServcice.Stub类,
* Stub是系统自己家上的.该类是个抽象类,继承了binder类也实现了iservice<br>
*
* @author Administrator
*
*/
public class Mybinder extends IServcice.Stub {

@Override
public void callMethodInService() throws RemoteException {
sayHelloInService();
}

}

/**
* 服务中的方法
*/
public void sayHelloInService() {
System.out.println("hello in service");
}

@Override
public void onCreate() {
System.out.println("remote service create");
}

}
服务进程对外提供调用的接口,将该接口转成aidl文件,
aidl文件的创建:找到编写的java源文件,将其扩展名该为aidl.然后回到项目,刷新项目,该类就会变为源文件名.aidl的文件,并且系统会自动在gen .工程目录下生成原java文件的名的java文件.可以打开看下内容与之前不一样了.到此就完成了aidl的创建

package com.example.remoteservice;

interface IServcice {
void callMethodInService();
}


在配置文件application中注册该服务
<service android:name=".RemoteService" >
<intent-filter>
<action android:name="com.example.remoteservice" /> <!-- 指定action,可方便别的程序调用 -->

</intent-filter>
</service>

到此被调用的服务就创建好了.如果想对外使用.必须启动该进程.和服务.所以.为配合下面调用的例子(调用外部进程的服务)必须保证该进程的正常运行.
总结以上调用本进程中服务的方法:

 1创建一个服务,该服务中要有能被调用的方法;

 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法 ;

 3:定义一个MyBinder对象.继承binder类,并实现IService接口,在onBind方法中返回MyBinder对象;

 4:在activity中通过bindService ()绑定一个服务;

 5:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的onServiceConnected()方法;

 6:onServiceConnected ()方法的IBinder参数就是IService类型的,强制转换为IService;

 7:调用ISservice中方法


调用外部进程中服务(上面的进程) 

访问其他进程中服务的步骤:

 访问外部服务.要知道对方服务的action,和可以调用服务接口的adil文件以及adil文件的包名.在本地程序创建调用服务的aidl文件的包,并添加(copy)外部服务的aidl文件,系统会自动在gen目录下创建该adil文件接口java文件


 1创建一个服务,该服务中要有能被调用的方法;

 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法,去掉定义接口和接口中方法的修饰符,把这个接口的扩展名该为.aidl,;

 3:定义一个MyBinder对象,继承编译器根据IService.aidl在gen中创建的IService类中的Sutb类,

 在onBind方法中返回MyBinder对象

 4:在调用服务的工程中创建包,包名要与被调用服务工程中对应aidl文件所在的包名一样.并复制被调用工程对应的aidl文件到本地对应aidl文件包中

 5:在activity中通过bindService ()绑定一个服务;

 6:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的方法;

 7:在实现接口中的onServiceConnected()方法调用IServcice.Stub.asInterface()方法.将onServiceConnected的IBinder参数转换成IService类型;

 8:调用IService中的方法(调用服务中的方法),


按照上面步骤创建了同样的包和copy了被调用的aidl文件之后,创建调用外部进程页面的布局.本例只以一个button为例

<Button
android:id="@+id/call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="调用外部服务" />

调用外部服务的代码实现
package com.example.callremoteservice;

import com.example.remoteservice.IServcice;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;

/**
* 访问外部服务.要知道对方服务的action,和可以调用服务接口的adil文件以及adil文件的包名<br>
* 在本地程序创建调用服务的adil文件的包,并添加外部服务的adil文件,系统会自动在gen目录下创建该adil文件接口java文件<br>
* 总结:<br>
* 访问本进程中的service,需要用到bindService()方法.(cz23_serverlifecycle)<br>
*
* 1创建一个服务,该服务中要有能被调用的方法;<br>
* 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法 ;<br>
* 3:定义一个MyBinder对象.继承binder类,并实现IService接口,在onBind方法中返回MyBinder对象;<br>
* 4:在activity中通过bindService ()绑定一个服务;<br>
* 5:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的onServiceConnected()方法;<br>
* 6:onServiceConnected ()方法的IBinder参数就是IService类型的,强制转换为IService;<br>
* 7:调用ISservice中方法<br>
* <br>
* 访问 外部进程中的service,需要用到aidl(android interface definition language)(在编号24的两个例子)<br>
* 1创建一个服务,该服务中要有能被调用的方法;<br>
* 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法,去掉定义接口和接口中方法的修饰符,把这个接口的扩展名该为.aidl,;<br>
* 3:定义一个MyBinder对象,继承编译器根据IService.aidl在gen中创建的IService类中的Sutb类,
* 在onBind方法中返回MyBinder对象<br>
* 4:在调用服务的工程中创建包,包名要与被调用服务工程中对应aidl文件所在的包名一样.并复制被调用工程对应的aidl文件到本地对应aidl文件包中<br>
* 5:在activity中通过bindService ()绑定一个服务;<br>
* 6:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的方法;<br>
* 7:在实现接口中的onServiceConnected()方法调用IServcice.Stub.asInterface()方法.
* 将onServiceConnected的IBinder参数转换成IService类型<br>
* 8:调用IService中的方法(调用服务中的方法),
*
* @author Administrator
*
*/
public class MainActivity extends Activity {
private IServcice iServcice;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.example.remoteservice");// 隐式意图,指定访问服务的action,就是被调用服务进程值注册服务的时候指定的action的值
bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);// 通过隐式意图绑定到外部服务.参数2是服务绑定成功后的一个回调类.通过他可以获取外部服务对外提供数据的对象
}

public void click(View view) {
try {
iServcice.callMethodInService();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

class MyConn implements ServiceConnection {

@Override
/**
* 参数IBinder就是绑定被调用的服务执行onBind的返回值
*/
public void onServiceConnected(ComponentName arg0, IBinder service) {
iServcice = IServcice.Stub.asInterface(service);// 调用外部进程中service的转换方法
}

@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: