刚刚开始学Service,简短的写一点有关创建和进行数据交互的东西,以便自己以后学起来方便。
下面的这个小程序简单的描述了如何进行访问者和服务之间的交互,界面只有一个按钮,点击之后,会以Toast的形式弹出一个数值,表示当前运行在服务里的值(该值每半秒加1)。
步骤开始:
第一步:创建一个Service
public class ServiceTest extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onBind");
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("onCreate");
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
System.out.println("onStart");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("onDestroy");
quitFlag = true;
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onUnbind");
return super.onUnbind(intent);
}
}
需要注意的是,必须要实现的是onBind方法,返回一个IBinder对象(主要是这个对象来进行交互)。
第二布:构造IBinder对象
在Service里构造IBinder对象,是很常见的实现逻辑。把Binder的实现作为Service的内部类。
public class MyBinder extends Binder
{
public long getCount()
{
return count;
}
}
具体应该有些什么方法,完全取决于具体业务。
第三步:在Service的onCreate或onStartCommand方法中,写业务逻辑
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("onCreate");
new Thread(new Runnable(){
public void run()
{
while(!quitFlag)
{
try
{
count++;
Thread.sleep(500);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}).start();
}
这个count的值,通过Binder返回到访问者方。
第四步:在Activity中创建ServiceConnection对象
ServiceConnection用于监听访问者和Service的链接情况,链接成功时执行回调onServiceConnected(ComponentName, IBinder)方法,后面的IBinder方法就是Service中onBind方法返回的对象。断开链接时执行回调onServiceDisconnected方法。
先在Activity中声明Binder对象
ServiceTest.MyBinder binder;
然后声明ServiceConnection对象
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("Service disconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
binder = (ServiceTest.MyBinder)service;
System.out.println("Service & Activity Connected");
}
};
在onServiceConnected方法中,把Activity中的Binder对象赋值成从Service返回的对象。
之后就可以用Binder对象处理数据了。
第五步:绑定Activity和Service
bindService(intent, connection, BIND_AUTO_CREATE);
经过上面五步,就可以通过Binder对象来操作Service里面的数据了,实现了交互。