Android後臺服務---交互時的Service

   與用戶交互的Service須要的是處理用戶的操做,完成相應的功能。java

   一:生命週期
ide

   與用戶交互時用到了綁定方式,觸發了onBind方法一次,在其中能夠進行用戶的操做,取消綁定後觸發的是unBind方法,若是此時用的是startService啓動的Service,若取消綁定以後,再次綁定時,觸發的是onRebind方法,終止Service時觸發的是onDestory方法。
this

   二:建立及方法
spa

  使用Service時,必須繼承自Service抽象類,實現其中的方法。經常使用的方法有:線程

   (1)onCreate:啓動Service時觸發的方法,完成Service的建立及初始化工做
對象

   (2)onBind:綁定Service,以完成某些操做
繼承

   (3)onUnbind:取消綁定
接口

   (4)onRebind:從新綁定
生命週期

   (5)onDestory:關閉Service時觸發的方法
資源

   三:啓動、中止方式

   啓動方式:bindService(intent對象,當前Activity對象this,BIND_AUTO_CREATE自動建立Service常量)

   終止方式:unbindService(當前Activity對象this)

   四:與用戶交互時的Service的實現

   (1)建立類,繼承自Service,由於onBind方法返回的是一個IBinder對象,因此咱們在類中建立一個內部類,讓他在外部經過這個IBinder對象,得到Service的方法

   (2)實現上述的幾個方法,並添加計時輸出的功能

public class MyService extends Service {
    private Timer timer;
    private TimerTask task;
    private int i = 0;
    // 提供Binder對象,對外提供得到Service的方法
    private MyBinder biner = new MyBinder();
    // 注意返回的方式
    class MyBinder extends Binder {
        public MyService getMyService() {
            return MyService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("onBind-----");
        startTimer();// 注意開啓的位置****,放在這裏的話,只有綁定的時候纔會運行線程timer
        return biner;// 記住必定要返回binder
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand------");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onCreate() {
        System.out.println("onCreate----");
        // startTimer();放在這裏的話, 以start的話,就在運行
        super.onCreate();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("onUnbind------");
        // stopTimer();放在這裡的話ReBinder則不能繼續執行了,應該放在Destory中
        // return super.onUnbind(intent);這種狀況下沒法觸發ReBinder
        return true;// 這時才能夠觸發ReBinder
    }
    @Override
    public void onRebind(Intent intent) {
        System.out.println("onRebind------");
        super.onRebind(intent);
    }
    @Override
    public void onDestroy() {
        System.out.println("onDestory------");
        stopTimer();// 中止計時器方法的調用
        super.onDestroy();
    }
    // 啓動計時器
    public void startTimer() {
        timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {
                i++;
                                                                                                                                                                               
                System.out.println(i);
            }
        };
        timer.schedule(task, 1000, 1000);
    }
    // 中止計時器
    public void stopTimer() {
        timer.cancel();
    }
    public int getI() {
        return i;
    }
    public void setI(int i) {
        this.i = i;
    }
}


   (3)主界面添加3個按鈕,分別完成綁定,取消綁定,終止三個功能。主類需實現ServiceConnection接口及其中的方法

   ◆onServiceConnected:綁定Service時用到的方法,在其中建立IBinder對象,得到Service對象

   ◆onServiceDisconnected:是系統自動調用的方法

public class MainActivity extends Activity implements OnClickListener,
        ServiceConnection {
    private Button bindBtn, unbindBtn, getServiceBtn,startBtn,stopBtn;//聲明界面上的5個按鈕
    private Intent intent;//INtent對象
    private MyService myService;//Service對象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //查找資源
        bindBtn = (Button) findViewById(R.id.bind);
        unbindBtn = (Button) findViewById(R.id.unbind);
        getServiceBtn = (Button) findViewById(R.id.getService);
        startBtn =(Button) findViewById(R.id.start);
        stopBtn = (Button) findViewById(R.id.stop);
               
        //添加監聽
        bindBtn.setOnClickListener(this);
        unbindBtn.setOnClickListener(this);
        getServiceBtn.setOnClickListener(this);
        startBtn.setOnClickListener(this);
        stopBtn.setOnClickListener(this);
//Intent對象的實例化
        intent = new Intent(this, MyService.class);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bind:
            bindService(intent, this, BIND_AUTO_CREATE);//綁定Service
            break;
        case R.id.unbind:
            unbindService(this);//取消綁定
            break;
                       
        case R.id.getService:
            Toast.makeText(MainActivity.this, "當前的I值爲"+myService.getI(), Toast.LENGTH_SHORT).show();//得到後臺信息
            break;
                       
        case R.id.start:
            startService(intent);//啓動Service
            break;
                       
        case R.id.stop:
            stopService(intent);//終止Service
            break;
        }
    }
    //在這裏寫一個取消綁定的方法,是爲了保證主界面退出的同時也要終止Serivce
    @Override
    protected void onDestroy() {
        unbindService(this);
        super.onDestroy();
    }
               
//重寫接口ServiceConnection中的方法,實現一鏈接,就得到Service的對象
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.MyBinder binder = (MyBinder) service;
        myService = binder.getMyService();
    }
//重寫接口ServiceConnection中的方法,系統自動調用的方法
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
}


   (4)結果

   這裏只列出幾種狀況,要知道根據在Service張方法調用位置的不一樣,將會產生不一樣的效果。這裏只針對例子中的狀況進行分析

   ◆直接單擊Bind按鈕,會觸發onCreate和onBind方法,因爲把啓動計時器的方法放在了onBind方法中,因此直接計時器輸出

   ◆這時在點擊getService按鈕時,能夠得到當前的I值

   ◆此時點擊onUnbind方法,會觸發onUnbind和onDestory方法,因爲把中止計時器的操做放在了onunbind方法中,因此此時中止了計時器的輸出

   ◆若直接點擊Start按鈕,則能夠看到,他只觸發了onCreate和onStartCommand方法,並無觸發計時器的操做

   ◆在單擊onBind方法,能夠看到這是隻觸發了onBind方法,並開始了計時器的輸出

   ◆在點擊getService按鈕時,能夠得到當前的I值

   ◆這時只能先單擊onUnbind按鈕,在單機Stop按鈕,纔會終止Service(由於此時咱們在Service中並無終止語句)這時觸發的方法有onUnbind和onDestory兩個方法

   

   還有不少種狀況,咱們還得自行研究啊。。。

相關文章
相關標籤/搜索