本地服務和Activity交互的示例

具體做法是,服務類需要增加接口,比如ICountService,另外,服務類需要有一個內部類,這樣可以方便訪問外部類的封裝數據,這個內部類 需要繼承Binder類並實現ICountService接口。還有,就是要實現Service的onBind方法,不能只傳回一個null了。

這是新建立的接口代碼:

public interface ICountService {
    public abstract int getCount();
}
 
修改後的CountService代碼:
package com.easymorse;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class CountService extends Service implements ICountService {

    private boolean threadDisable;

    private int count;

    private ServiceBinder serviceBinder = new ServiceBinder();

    public class ServiceBinder extends Binder implements ICountService{
        @Override
        public int getCount() {
            return count;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return serviceBinder;
    }

    @Override
    public void onCreate() {
        super .onCreate();
        new Thread( new Runnable() {

            @Override
            public void run() {
                while ( ! threadDisable) {
                    try {
                        Thread.sleep( 1000 );
                    } catch (InterruptedException e) {
                    }
                    count ++ ;
                    Log.v( " CountService " , " Count is " + count);
                }
            }
        }).start();
    }

    @Override
    public void onDestroy() {
        super .onDestroy();
        this .threadDisable = true ;
        Log.v( " CountService " , " on destroy " );
    }

    /* (non-Javadoc)
     * @see com.easymorse.ICountService#getCount()
     */ 
    public int getCount() {
        return count;
    }

}

需要通過ServiceConnection的內部類實現來連接Service和Activity。


public class LocalServiceDemoActivity extends Activity {

    private ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            countService = (ICountService) service;
            Log.v( " CountService " , " on serivce connected, count is " 
                    + countService.getCount());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            countService = null ;
        }

    };

    private ICountService countService;

    /** Called when the activity is first created. */ 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super .onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this .bindService( new Intent( " com.easymorse.CountService " ),
                this .serviceConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
          this .unbindService(serviceConnection);        
          super .onDestroy();       //注意先後 
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章