MessagerService总结
一、整体工程图
二、messenger_service_binding.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:paddingBottom="4dip" android:text="@string/messenger_service_binding"/> <Button android:id="@+id/bind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bind_service"> <requestFocus /> </Button> <Button android:id="@+id/unbind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/unbind_service"> </Button> <TextView android:id="@+id/callback" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:gravity="center_horizontal" android:paddingTop="4dip"/> </LinearLayout>
三、AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jltxgcy.messengerservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MessengerServiceActivities" android:label="@string/title_activity_messenger_service" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MessengerService"> </service> </application> </manifest>
四、MessengerServiceActivities.java
package com.jltxgcy.messengerservice; 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.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MessengerServiceActivities extends Activity{ Messenger mServiceMessage = null; boolean mIsBound; TextView mCallbackText; class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MessengerService.MSG_SET_VALUE: mCallbackText.setText("Received from service: " + msg.arg1); break; default: super.handleMessage(msg); } } } final Messenger mMessenger = new Messenger(new IncomingHandler()); private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mServiceMessage = new Messenger(service); mCallbackText.setText("Attached."); try { Message msg = Message.obtain(null, MessengerService.MSG_REGISTER_CLIENT); msg.replyTo = mMessenger; mServiceMessage.send(msg); msg = Message.obtain(null, MessengerService.MSG_SET_VALUE, this.hashCode(), 0); mServiceMessage.send(msg); } catch (RemoteException e) { } } public void onServiceDisconnected(ComponentName className) { mServiceMessage = null; Log.d("jltxgcy", "onServiceDisconnected"); } }; void doBindService() { bindService(new Intent(MessengerServiceActivities.this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; } void doUnbindService() { if (mIsBound) { if (mServiceMessage != null) { try { Message msg = Message.obtain(null, MessengerService.MSG_UNREGISTER_CLIENT); msg.replyTo = mMessenger; mServiceMessage.send(msg); } catch (RemoteException e) { } } unbindService(mConnection); mIsBound = false; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.messenger_service_binding); Button button = (Button)findViewById(R.id.bind); button.setOnClickListener(mBindListener); button = (Button)findViewById(R.id.unbind); button.setOnClickListener(mUnbindListener); mCallbackText = (TextView)findViewById(R.id.callback); } private OnClickListener mBindListener = new OnClickListener() { public void onClick(View v) { doBindService(); } }; private OnClickListener mUnbindListener = new OnClickListener() { public void onClick(View v) { doUnbindService(); } }; }
五、MessengerService.java
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jltxgcy.messengerservice; import java.util.ArrayList; import android.app.NotificationManager; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.util.Log; import android.widget.Toast; public class MessengerService extends Service { private ArrayList<Messenger> mClients = new ArrayList<Messenger>(); private int mValue = 0; public static final String TAG = "jltxgcy"; public static final int MSG_REGISTER_CLIENT = 1; public static final int MSG_UNREGISTER_CLIENT = 2; public static final int MSG_SET_VALUE = 3; class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_REGISTER_CLIENT: mClients.add(msg.replyTo); break; case MSG_UNREGISTER_CLIENT: mClients.remove(msg.replyTo); break; case MSG_SET_VALUE: mValue = msg.arg1; for (int i=mClients.size()-1; i>=0; i--) { try { mClients.get(i).send(Message.obtain(null, MSG_SET_VALUE, mValue, 0)); } catch (RemoteException e) { mClients.remove(i); } } break; default: super.handleMessage(msg); } } } final Messenger mMessenger = new Messenger(new IncomingHandler()); @Override public void onCreate() { Log.d(TAG, "onCreate"); } @Override public void onDestroy() { Log.d(TAG, "onDestroy"); } @Override public IBinder onBind(Intent intent) { Log.d(TAG, "onBind"); return mMessenger.getBinder(); } @Override public boolean onUnbind(Intent intent) { Log.d(TAG, "onUnbind"); return super.onUnbind(intent); } }
六、详解
点击Bind Service,Logcat显示如下:
Service中:final Messenger mMessenger = new Messenger(new IncomingHandler()); onBind方法中mMessenger.getBinder()
Activity中, final Messenger mMessenger = new Messenger(new IncomingHandler()); onServiceConnected中mServiceMessage = new Messenger(service);
onBind方法中返回一个IBinder对象,onServiceConnected中,通过IBinder对象获取到了Messager对象。再通过msg.replyTo建立通信。
点击Unbind Service,Logcat显示如下:
运行结果如下:
获取message的方法:
1、Message msg =new Message(); msg.arg1=x; msg.arg2=x; msg.obj=x; msg.replyTo=x; msg.what=x; msg.setData(Bundle bundle); 2、Message msg =Messge.obtain(Handler h, int what, int arg1, int arg2, Object obj); msg.replyTo=x; msg.setData(Bundle bundle);