在Android中通常服务都是给当前应用程序去使用的。但也有特殊情况,那就是在手机厂商中,预装的软件中往往会用到其他软件的服务,所以就需要用到远程访问这个知识点了。
一般步骤:
1.定义一个远程的服务类和远程接口,并在服务类中定义内部类。继承Binder和该接口。
2.在接口中调用业务逻辑方法。
3.创建本地的应用程序,设计界面和处理activity。
4.到远程接口所在的文件夹,将远程接口的扩展名修改为aidl。则该文件就成为对外开放的文件。
删除该文件中的public,重新编译远程接口。
5.在本地应用程序中创建一个和远程接口相同的包名,把修改后的aidl文件复制一份到本地应用中。
6.修改远程服务中的方法。
public class TestService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void methodInService(){
System.out.println("----------methodInService----------");
}
private class MyBinder extends Stub{
@Override
public void callMethodInService() {
//调用了服务的业务逻辑方法
methodInService();
}
}
}
本地应用程序代码:
public class MainActivity extends Activity {
private Intent intent;
private MyConn conn;
private IService myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view) {
intent = new Intent();
intent.setAction("com.itheima.remoteservice.REMOTESERVICE");
startService(intent);
}
public void bind(View view) {
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
public void call(View view){
try {
//调用接口的方法,间接地调用服务的业务逻辑方法
myBinder.callMethodInService();
} catch (RemoteException e) {
e.printStackTrace();
}
}
private class MyConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//得到IService接口类型的对象
myBinder = Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}