android callRemoteService 调用其他进程的service
创建一个进程服务.程序第一次运行的时候就创建.不需要界面
要想其他进程能够跨进程的调用本进程的方法.就得使用跨进程访问的接口类型.只需将接口中类和方法的修饰符去掉就行.然后把接口类编程aidl类型
服务也业务代码:
[java]
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的创建
[html]
package com.example.remoteservice;
inte易做图ce IServcice {
void callMethodInService();
}
在配置文件application中注册该服务
[html]
<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.asInte易做图ce()方法.将onServiceConnected的IBinder参数转换成IService类型;
8:调用IService中的方法(调用服务中的方法),
按照上面步骤创建了同样的包和copy了被调用的aidl文件之后,创建调用外部进程页面的布局.本例只以一个button为例
[html]
<Button
android:id="@+id/call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="调用外部服务" />
调用外部服务的代码实现
[java]
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 inte易做图ce definition language)(在编号24的两个例子)<br>
* 1创建一个服务,该服务中要有能被调用的方法;<br>
* 2:定义一个借口ISe
补充:移动开发 , Android ,