[Android學習]Android服務之Service(2)–綁定本地Service

再上一篇博客中,簡單的介紹瞭Service的用法,也就是Service的啟動與關閉。不過,當程序通過startService()和stopService()啟動、關閉Service時,Service與訪問者之間基本上不存在太多的關聯,因此Service與訪問者之間無法進行通信、數據交換。就如同平時我們寄信,當信寄出去後,我們無法得到信是否送達、在送信過程中的狀況等等,當我們想得到這些信息時,也就是當我們想Service與訪問者之間進行方法調用以及數據交換時,就應該用到bindService()和unbindService()方法來啟動、關閉Service。

 

Context的bindService()方法的完整命名為:bindService(Intent service,ServiceConnection conn,int flags)

service:該參數通過Intent指定要啟動的Service

conn:該參數是一個ServiceConnection對象,該對象用於監聽訪問者與Service之間的連接狀態。當訪問者訪問者與Service之間連接成功時將回調該ServiceConnection對象的onServiceConnected(ComponentName name,Ibinder service)方法;當Service所在的宿主進程由於異常中止或其他原因終止,導致該Service與訪問者之間斷開連接時回調該ServiceConnection對象的onServiceDisconnected(ComponentName name)方法。

flags:指定綁定時是否主動創建Service(如果Service還未創建)。該參數可以是0(不自動創建)或BIND_AUTO_CREATE(自動創建).

——當調用者主動通過unBindService方法斷開與Service的連接時,ServiceConnection對象的onServiceDisconnected(ComponentName name)方法不會被調用。

 

在ServiceConnection對象的onServiceConnected方法中有一個Ibinder對象,該對象即可實現與被綁定Service之間的通信。

 

下面的例子示范瞭如何在Activity中綁定本地Service,並獲取Service的運行的狀態,即與Service通信。

BinderService.java:

 

package com.ye_yun_lin.binderserviceactivity;

import android.R.integer;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class BinderService extends Service{
	private int count;
	private boolean quit;
	private MyBinder myBinder=new MyBinder();
	
	public class MyBinder extends Binder{
		public int getcount(){
			return count;
		}
	}

	@Override
	public IBinder onBind(Intent intent) {
		System.out.println("Service is binded");
		return myBinder;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("Service is created");
		new Thread(){

			@Override
			public void run() {
				while (!quit) {
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						
					}
					count++;
				}
			}
			
		}.start();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		this.quit=true;
		System.out.println("Service is Destroyed");
	}

	@Override
	public boolean onUnbind(Intent intent) {
		System.out.println("Service is unbinded");
		return super.onUnbind(intent);
	}

}

配置Service:

 

 

        
            
                
            
        

MainActivity.java:

 

 

package com.ye_yun_lin.binderserviceactivity;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	private Button bindButton,unbindButton,buttonStatusButton;
	BinderService.MyBinder binder;
	
	private ServiceConnection conn=new ServiceConnection() {
		
		//當該Activity與Service斷開連接時回調該方法
		@Override
		public void onServiceDisconnected(ComponentName name) {
			System.out.println("--Service Didconnected--");
		}
		//當該Activity與Service連接成功時回調該方法
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			System.out.println("--Service Connected--");
			binder=(BinderService.MyBinder) service;
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		bindButton=(Button)findViewById(R.id.bindservice);
		unbindButton=(Button)findViewById(R.id.unbindservice);
		buttonStatusButton=(Button)findViewById(R.id.servicestatus);
		
		final Intent intent=new Intent();
		intent.setAction("com.ye_yun_lin.binderserviceactivity.BinderService.local");
		
		bindButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				bindService(intent, conn, Service.BIND_AUTO_CREATE);
			}
		});
		
		unbindButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				unbindService(conn);
			}
		});
		
		buttonStatusButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, "Service的count值為:"+binder.getcount(), Toast.LENGTH_SHORT).show();
			}
		});
	}
}

結果:

 

通過上面兩個例子,我們可以得到Service的生命周期:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *