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控制台输出了"我是远程服务的方法"

至此我们就演示了访问本地和远程服务里面的方法.

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-02-10 23:23  johnny901114  阅读(1319)  评论(0编辑  收藏  举报