android中访问本地服务和远程服务的方法
我们知道要访问服务里的方法必须要是绑定服务,bindService,而不是startService,他们俩的区别在这里就不赘述了.
1,怎么访问本地服务里面的方法:
首先我们来定义一个Service
public class LocalService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void serviceMethod() {
Log.i("LocalService", "我是服务里面的方法");
}
private class MyBinder extends Binder implements IService {
@Override
public void sayHello() {
serviceMethod();
}
}
}
现在调用者怎么访问服务里的serviceMethod呢?
我们可以通过接口.可以看到上面的MyBinder实现了该接口,那么为什么要实现该接口呢?后面会说.
public interface IService {
public void sayHello();
}
现在我们可以在Activity绑定服务.
public class MainActivity extends Activity {
IService mService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent(this, LocalService.class);
bindService(intent, new MyServiceConn(), BIND_AUTO_CREATE);
}
//按钮的点击事件
public void start(View view) {
mService.sayHello();
}
private class MyServiceConn implements ServiceConnection {
/**
* 当连接已经建立成功,将被调用.通过IBinder和服务通信.
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("MainActivity", "连接成功");
mService = (IService) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
我想你应该明白为什么要实现IService接口了把,因为Activity和Service通信就是靠IBinder,当服务绑定成功,那么就会把IBinder返回给Activity,又因为我们定义的Binder实现
IService接口,那么我们就可以通过IService来引用返回回来的IBinder,当然要强制转换.
然后我们可以看到logcat输出了"我是服务里面的方法".
2,访问远程服务里面的方法.
既然是远程服务,顾名思义就是访问不能程序的服务里面的方法.这就需要用到aidl了.
首先我们新建一个工程remoteServiceDemo
在工程里创建一个服务:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void method(){
Log.i("MyService", "我是远程服务的方法");
}
private class MyBinder extends IService.Stub{
@Override
public void serviceMethod() throws RemoteException {
method();
}
}
}
我们通过查看IService.Stub,可以看到他继承了IBinder实现了IService接口.
显示是aidl文件:
package com.itheima.remoteServiceDemo;
interface IService{
void serviceMethod();
}
然后我们在清单文件里面配置服务:
<service android:name=".MyService" >
<intent-filter>
<action android:name="com.itheima.remoteServiceDemo"></action>//在绑定的服务的时候设置action用到
</intent-filter>
</service>
最后再新建一个工程callRemoteService
把上面的aidl复制到该工程,包名一定要一样.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent service = new Intent();
service.setAction("com.itheima.remoteServiceDemo");
startService(service);
bindService(service, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = IService.Stub.asInterface(service);
}
}, BIND_AUTO_CREATE);
}
//按钮单击事件
public void call(View view) {
try {
iService.serviceMethod();
} catch (RemoteException e) {
e.printStackTrace();
}
}
然后单击按钮logcat控制台输出了"我是远程服务的方法"
至此我们就演示了访问本地和远程服务里面的方法.
浙公网安备 33010602011771号