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控制台输出了"我是远程服务的方法"
至此我们就演示了访问本地和远程服务里面的方法.