剛剛開始學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裏面的數據了,實現了交互。