[java]
[java]
最近今天在学习service控件,前面的后台service和绑定本地控件的service的很容易理解,几乎没遇到什么问题,但看到远程调用service的时候模仿书上的例题,结果发现竟然得不到想要的结果,把书上的例子源码弄进去,还是会有问题,于是经过好几天的自己摸索和网上参考一些资料,主要得到帮助的来自http://www.cnblogs.com/TerryBlog/archive/2010/08/24/1807605.html http://ericchan2012.iteye.com/blog/1554197 这2个网址。接下来直接进入正题,对这几天对远程绑定调用service的学习结果。
远程绑定调用service主要是用来不同进程的信息共享。就比如服务器和客户端,在服务器端设置好一个service提供方法或信息,然后客户端可以直接调用服务器端service提供方法或信息。这里有个前提是客户端必须有和服务器端一份一样的AIDL,然后服务器端在客户端使用的系统上有注册过(也就是安装运行过一次),之后客户端就可以远程绑定调用服务器端的service了。
具体的步骤如下:
1.首先,是服务器的
1)创建一个android应用工程
2) 在主Aitivity所在的包里新建个AIDL文件,这是ADT会自动帮你在gen目录下生成一个和AIDL文件同名的JAVA文件(这里的AidlService.java是下一步骤生成的,这里可以先忽略)
3)如上图所示,创建一个用来使用service的类(AidlService.java)
具体每个文件的代码如下:
AidlServerActivity.java
[java]
package com.ds.server;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class AidlServerActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent service = new Intent(AidlServerActivity.this,
AidlService.class);
startService(service);
Toast.makeText(AidlServerActivity.this, "service started",
Toast.LENGTH_LONG).show();
}
});
}
}
IAidlService.aidl
[java]
package com.ds.server;
inte易做图ce IAidlService {
int getType();
}
AidlService.java
[java]
package com.ds.server;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class AidlService extends Service {
private boolean unrunnable;
private int count;
private class MyBinder extends IAidlService.Stub {
@Override
public int getType() throws RemoteException {
// TODO Auto-generated method stub
return 100;
}
}
private void Log(String str) {
Log.d("AidlService", "------ " + str + "------");
}
@Override
public void onCreate() {
super.onCreate();
/*
new Thread(new Runnable(){
@Override
public void run(){
while(!unrunnable){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
}
count++;
Log.v("AidlService","count:"+count);
}
}
}).start();
*/
Log.v("RemoteCountService","onCreate");
Log("service create");
}
/*
@Override
public void onStart(Intent intent, int startId) {
Log("service start id=" + startId);
}
*/
@Override
public IBinder onBind(Intent t) {
Log("service on bind");
return new MyBinder();
}
@Override
public void onDestroy() {
Log("service on destroy");
unrunnable=true;
super.onDestroy();
}