Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android-Activity與本地Service的交互設計方法,讓這兩個類的代碼條理更清晰

Android-Activity與本地Service的交互設計方法,讓這兩個類的代碼條理更清晰

編輯:關於Android編程

在Android應用程序中,Activity負責界面的顯示,Service負責後台工作,當然後台和界面是需要交互的,所以Activity需要和Service交互.

比較常用的是Activity和本地Service的交互,本文介紹的便是這種,最終實現Activity和Service都能很方便地調用對方的public方法。

 

其實只要讓Activity和Service綁定之後,分別擁有對方的引用就可以了。

 

以MainActivity和MyService為例

 

創建一個服務類MyService.java

 

public class MyService extends Service {

	private MainActivity activity;
	

	@Override
	public IBinder onBind(Intent arg0) {
		return new MyBinder();
	}

	/**
	 * 與activity綁定後返回的Binder
	 */
	public class MyBinder extends Binder {
		// 獲取service對象的引用
		public MyService getService() {
			return MyService.this;
		}
	}
   
	public void setActivity( MainActivity _activity){
		this.activity =  _activity;
	}
	
}

 

讓Service中擁有一個Activity類型的成員,並提供setActivity()方法

 

注意要在androidManifest中聲明該Service

 



 

然後在MainActivity中實現綁定

 

public class MainActivity extends Activity {

// 本地服務
	private MyService mLocalService;

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		bindLocalService();
	}

	/**
	 * 創建並綁定本地Service
	 * */
	private void bindLocalService() {
		Intent bindIntent = new Intent(this, MyService.class);
		bindService(bindIntent, localServiceConnection, BIND_AUTO_CREATE);
	}

/**
	 * 綁定本地服務的ServiceConnection類
	 */
	ServiceConnection localServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			mLocalService = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}
	};

}

 

 

 

要點是這裡

 

@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}

實現綁定之後,MainActivity裡的mLocalService成員指向MyService對象的引用,而MyService裡的activity成員指向MainActivity的引用

 

這樣一來,就可以調用對方裡的public方法了

 

需要注意的是,bindService()方法的執行是用了回調機制的,在Service中獲得Binder後再回到Activity,期間Activity不會停下等待而是執行bindService()後面的,所以在bindService()後面mLocalService可能為null, 不過只要在調用mLocalService的方法前判斷其是否不為null就可以了

 

比如

1. MyService裡有一個方法

 

public void print(String s){
   System.out.println(is in service --> +s);
}

則在MainActivity中可以這樣調用

 

 

if(mLocalServise!=null){
mLocalService.print(call from activity);
}


 


2. MainActivity裡有一個TextView對象textView,並有更新textView內容的方法

 

 

public void updateTextView(String s){
   textView.setText(s);
}

則在MyService中可以這樣調用

 

 

if(activity!=null){
activity.updateTextView(service call the fun in activity);
}


 

 

 

如果在Service裡創建了新線程,則新線程與activity的UI線程的通信用的是異步消息處理機制,可在MainActivity中創建一個public static 的Handler對象

 

	public static Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			System.out.println(handler say something);
		}
	};

然後在MyService中獲得這個handler的引用

 

 

private Handler mHandler = MainActivity.handler;

這樣子,MyService裡就也能方便地用mHandler來更新UI了,或者在定義時就將Handler放在Service中也是可以的

 

 

還有用廣播Broadcast來實現Service通知UI更新的,不過這樣消耗太大,不建議這麼做,除非同時需要通知多個Activity進行更新操作

 

上面的做法,即實現了Service與Activity的交互,也讓這兩個類的盡量獨立,代碼條理清晰,方便類的維護。

 

 

 

 

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