Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 服務(service)的生命周期以及利用bindservice調用服務裡面的方法

Android 服務(service)的生命周期以及利用bindservice調用服務裡面的方法

編輯:關於Android編程

服務的生命周期

服務的生命周期跟啟動服務的方法有關:
當采用Context.startService()方法啟動服務,與之有關的生命周期方法
onCreate() onStart()  onDestroy()
onCreate()該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。
onStart() 只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法盡管不會多次創建服務,但onStart() 方法會被多次調用。
onDestroy()該方法在服務被終止時調用。
當采用Context.bindService()方法啟動服務,與之有關的生命周期方法
onCreate() onBind()  onUnbind()  onDestroy()
onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。
onUnbind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用。
如果先采用startService()方法啟動服務,然後調用bindService()方法綁定到服務,再調用unbindService()方法解除綁定,最後調用bindService()方法再次綁定到服務,觸發的生命周期方法如下:
onCreate()onStart()onBind()onUnbind()[重載後的方法需返回true]onRebind()

利用bindservice()調用服務裡面的方法:

開啟服務 (startservice)
服務一旦開啟與調用者沒有任何的關系 , 調用著的activity 即便是退出了 不會影響。後台的service的運行.在activity裡面 不能去調用服務裡面的方法 .

通過綁定方式開啟服務(bindservice)

服務跟調用者不求同生 ,但求同死.如果調用者(activity)退出了 那他綁定的服務呢 也會跟著退出.我們可以在activity裡面調用服務裡面的方法.利用 serviceSonnection 接口 返回一個ibinder對象 , 拿著ibinder對象獲取到服務裡面方法的引用(自定義了一個接口信息) ,調用服務裡面的方法 。

\

代碼示例:

自定義接口IService.java:

package cn.itcast.servicelife;

public interface IService {
	public void callMethodInService();
}
MyService.java:

package cn.itcast.servicelife;

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

public class MyService extends Service {
	// 初始化服務時運行
	@Override
	public IBinder onBind(Intent intent) {

		System.out.println("on bind");
		return new MyBinder();
	}

	public class MyBinder extends Binder implements IService {

		@Override
		public void callMethodInService() {
			sayHelloInService();
		}
	}

	/**
	 * 服務裡面的一個方法
	 */
	public void sayHelloInService() {
		System.out.println("hello in service");
	}

	@Override
	public boolean onUnbind(Intent intent) {
		System.out.println("on  unbind");
		return super.onUnbind(intent);
	}

	@Override
	public void onCreate() {
		System.out.println("oncreate");
		super.onCreate();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		System.out.println("onstart");

		super.onStart(intent, startId);
	}

	@Override
	public void onDestroy() {
		System.out.println("ondestroy");
		super.onDestroy();
	}
}
DemoActivity.java:

package cn.itcast.servicelife;

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

public class DemoActivity extends Activity implements OnClickListener {

	Button bt_start;
	Button bt_stop;
	Button bt_bind_service; // 綁定服務
	Button bt_unbind_service; // 解除綁定服務
	Button bt_call_service;
	Intent intent;
	MyConn conn;
	IService iService;
	int flag = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		bt_start = (Button) this.findViewById(R.id.button1);
		bt_stop = (Button) this.findViewById(R.id.button2);
		bt_bind_service = (Button) this.findViewById(R.id.button3);
		bt_unbind_service = (Button) this.findViewById(R.id.button4);
		bt_call_service = (Button) this.findViewById(R.id.button5);
		bt_start.setOnClickListener(this);
		bt_stop.setOnClickListener(this);
		bt_bind_service.setOnClickListener(this);
		bt_unbind_service.setOnClickListener(this);
		bt_call_service.setOnClickListener(this);
		intent = new Intent(this, MyService.class);
		conn = new MyConn();

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1: // 開啟服務
			startService(intent);
			break;
		case R.id.button2: // 停止服務
			stopService(intent);
			break;
		case R.id.button3: // 綁定服務
			bindService(intent, conn, Context.BIND_AUTO_CREATE);
			break;
		case R.id.button4: // 解除綁定服務
			if (flag == 0) {
				Toast.makeText(getBaseContext(), "還沒有綁定服務,無需解綁", 0).show();
			} else {
				unbindService(conn);
				flag = 0;
			}
			break;
		// 綁定開啟
		case R.id.button5: // 調用服務裡面的方法
			iService.callMethodInService();
			break;
		}
	}

	private class MyConn implements ServiceConnection {

		// 綁定一個服務成功的時候 調用 onServiceConnected
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			flag = 1;
			iService = (IService) service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}
	}

	// DemoActivity的銷毀方法
	@Override
	protected void onDestroy() {
		if (flag == 1) {
			unbindService(conn);
		}
		super.onDestroy();
	}
}
清單文件:




    

    
        
            
                

                
            
        

        
        
    

問題 ????????????

1.通過實驗證明在bindService之後在模擬器的設置中的“正在運行的服務”中找不到相應的服務,是因為和activity綁定的所以不顯示嗎?

2.在unbindService之後還可以調用服務裡面的方法,為什麼?服務不是已經被銷毀了嗎?

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved