Activity與Service的交互二

在上一篇文章中講解了如何利用Messenger和Binder類來實現與Activity的通信,這次就講解下其他的兩種通訊方式。不管是哪一種通訊,我們首先需要創建一個Service,下面就先創建一個Service,看過上一篇文章的就可以直接跳過這裏。

Service的創建

1.創建MySerVice類繼承Service並重寫相關方法

    public class MyService extends Service {  
        public MyService() {  
        }  
      
        @Override  
        public IBinder onBind(Intent intent) {  
            // TODO Auto-generated method stub  
            return null;  
        }  
          
    }  

2.註冊清單配置文件

    <application>  
    ...  
    <service android:name=".MyService" />  
    </application>

一、使用廣播通訊

在Android的系統中,廣播是大家經常用到的組件,比如我們希望一個軟件在開機的時候就自動重啓,其實就是利用了系統啓動時發出的廣播,我們接受到這個廣播就開始運行我們的程序。這裏只會簡單使用廣播機制,不會過多的闡述廣播的實現,有需要的話我會在以後另外貼出。下面就開始使用它來完成我們的通訊:

1.activity_main.xml

添加兩個按鈕便於測試

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick01"
        android:text="啓動" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick02"
        android:text="停止" />

</LinearLayout>

2.MainActivity.java

創建內部類繼承BroadcastReceiver來實現廣播消息的處理,並在Activity加載時註冊廣播

public class MainActivity extends Activity {
	//用於測試數據
	private int count;
	//Service的Intent對象
	private Intent intent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intent=new Intent(this, MyService.class);
		//註冊廣播
		MyReceiver receiver=new MyReceiver();
		IntentFilter filter=new IntentFilter();
		filter.addAction("com.receiver");
		registerReceiver(receiver, filter);
	}
	/**
	 * 啓動服務
	 * @param v
	 */
	public void onClick01(View v){
		startService(intent);
	}
	/**
	 * 停止服務
	 * @param v
	 */
	public void onClick02(View v){
		stopService(intent);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		stopService(intent);
	}
	/**
	 * 內部內實現廣播接口
	 * @author mm
	 *
	 */
	class MyReceiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			Log.i("Tag","count="+count++);
		}
	}
}

2.MyService.java

在service啓動時,利用定時器不停的給Activity發送廣播

public class MyService extends Service {
	private Intent intent;
	// 創建定時器對象
	private Timer mTimer;
	public MyService() {
	}
	/**
	 * 指定時間執行的任務類
	 * 
	 * @author mm
	 *
	 */
	class MyTimerTask extends TimerTask {
		@Override
		public void run() {
			Log.i("Tag", "sendBroadcast");
			// 發送廣播
			sendBroadcast(intent);
		}
	}
	@Override
	public void onCreate() {
		super.onCreate();
		// 關聯廣播的Action
		intent = new Intent("com.receiver");
		mTimer = new Timer();
		// 每隔一秒發送一次廣播
		mTimer.schedule(new MyTimerTask(), 0, 1000);
	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	/**
	 * service銷燬時,關閉定時器mTimer
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		mTimer.cancel();
	}
}

程序運行結果圖:

二、使用AIDL交互

  AIDL是Android Interface Definition Language的首字母縮寫, 也就是Android接口定義語言。AIDL屬於Android的IPC機制,常用於跨進程通信,主要實現原理基於底層Binder機制。

1、創建AIDLService端

1.1IDataService.aidl

在指定包中,創建文件IDataService.aidl文件,內容如下:

package com.example.adilservice;//包名

interface IDataService{
//自定義方法
 String getData();
}
保存後會在gen目錄下生成IDataService.java文件,如下圖所示

1.2ADILService.java

創建ADILService,返回綁定參數

public class ADILService extends Service {

	class AIDLServerBinder extends IDataService.Stub {

		@Override
		public String getData() throws RemoteException {
			return "data on service";
		}
	}

	@Override
	public IBinder onBind(Intent intent) {
		return new AIDLServerBinder();
	}
}
運行程序,使該Service駐留在手機內

2、創建ADILClient端

在使用前需要將aidl文件文件拿過來,如下圖所示


2.1.activity_main.xml

在佈局文件中加入一個按鈕。便於測試

 <Button 
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="talk"
       android:onClick="onClick"/>

2.2.MainActivity.java

public class MainActivity extends Activity {
	private IDataService iDataService;
	private ServiceConnection conn = new ServiceConnection() {
		//綁定異常執行
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
		//綁定成功執行
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			iDataService=IDataService.Stub.asInterface(service);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void onClick(View v){
		String data=null;
		try {
			data=iDataService.getData();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		Log.i("Tag", "data="+data);
	}
	@Override
	protected void onStart() {
		super.onStart();
		bindService(new Intent("com.example.adilservice"), conn,
				BIND_AUTO_CREATE);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(conn);
	}
}

小結

service的數據交互到這就告一段落了,以後要有其他新的方法還會再次給出。如果有問題請幫忙指出 :)




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