Android服務之信使

所謂的信使就是Messenger,它的作用是建立不同應用之間客戶端和服務端的連接,並進而實現信息的傳遞。

對於服務端信使的創建:

①創建一個Handler對象handler

②創建一個信使對象Messenger messenger = new  Messenger(handler);

③在onBind方法中通過調用messenger對象的getBinder()方法返回一個IBinder對象

④註冊服務並添加Action

接下來是在第二個Android項目中獲取服務端中創建的信使,並通過該信使給服務端發送消息。

好了,下面我們看代碼吧。

第一個項目中的MyService:

package com.example.text05;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Messenger;
import android.util.Log;

public class MyService extends Service {

	// 創建Handler對象
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			//獲取Message中的值
			int number = msg.arg1;
			Bundle bundle = msg.getData();
			String info = bundle.getString("info");
			Log.i("main", number + "--->" + info);
			
		};
	};
	// 創建一個信使對象
	Messenger messenger = new Messenger(handler);

	@Override
	public IBinder onBind(Intent intent) {

		return messenger.getBinder();
	}

}
在清單文件中註冊:

<service android:name="com.example.text05.MyService" >
            <intent-filter>
                <action android:name="com.example.messenger" />
            </intent-filter>
        </service>
在第二個MainActivity中的實現:

package com.example.text06;

import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

	private MyServiceConn conn;
	//創建信使對象用來接受服務端返回的Bind對象
	private Messenger messenger;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		conn = new MyServiceConn();
		// 聲明Intent
		Intent intent = new Intent("com.example.messenger");
		// 綁定服務
		boolean flag = bindService(intent, conn, BIND_AUTO_CREATE);
		Log.i("main", "綁定是否成功" + flag);
	}

	class MyServiceConn implements ServiceConnection {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 服務端:IBinder binder = messenger.getBinder();
			// 能不能通過參數service創建一個Messenger對象
			messenger = new Messenger(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}

	}

	public void send(View view) {
		//聲明一個Message消息對象
		Message msg = Message.obtain();
		msg.arg1 = 100;
		//這裏是不能直接傳字符串的,因爲字符串String實現的是Serializable接口而不是Parcelable接口
		//所以會出現異常,因爲信使中如果傳遞對象則必須實現Parcelable接口,如果必須傳遞字符串考慮使用Bundle
//		msg.obj = "你好,我來自客戶端";
		Bundle bundle = new Bundle();
		bundle.putString("info", "你好,我來自客戶端");
		msg.setData(bundle);
		try {
			//通過信使傳遞消息
			messenger.send(msg);
		} catch (RemoteException e) {
			
			e.printStackTrace();
		}
	}

}
運行結果:這裏是通過點擊客戶端給服務端發送消息,下面是Log輸出




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