MessagerService总结

一、整体工程图

MessagerService总结_第1张图片


二、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显示如下:

        

         运行结果如下:

         MessagerService总结_第2张图片

        代码地址:https://github.com/jltxgcy/Demo

           获取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);  

你可能感兴趣的:(MessagerService总结)