Android组件间交互

四大组件相信大家都不陌生了吧,今天咱们就组件间通信做个说明:

首先:

  主要今天的目的是为了说明Android 提供的一个ResultReceiver类,这个类相信大家都不陌生吧》?但是你们层深入了解过么,这个类不可谓不强大,辣么,咱们就看看怎么使他吧,

  实例:Activity和service通信,484很屌,我也这么觉得,然并卵。

  这里直接就来源码看看吧!!!!

  牛逼的不行不行,

  1 /*
  2  * Copyright (C) 2009 The Android Open Source Project
  3  *
  4  * Licensed under the Apache License, Version 2.0 (the "License");
  5  * you may not use this file except in compliance with the License.
  6  * You may obtain a copy of the License at
  7  *
  8  *      http://www.apache.org/licenses/LICENSE-2.0
  9  *
 10  * Unless required by applicable law or agreed to in writing, software
 11  * distributed under the License is distributed on an "AS IS" BASIS,
 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  * See the License for the specific language governing permissions and
 14  * limitations under the License.
 15  */
 16 
 17 package android.os;
 18 
 19 import com.android.internal.os.IResultReceiver;
 20 
 21 /**
 22  * Generic interface for receiving a callback result from someone.  Use this
 23  * by creating a subclass and implement {@link #onReceiveResult}, which you can
 24  * then pass to others and send through IPC, and receive results they
 25  * supply with {@link #send}.
 26  */
 27 public class ResultReceiver implements Parcelable {
 28     final boolean mLocal;
 29     final Handler mHandler;
 30     
 31     IResultReceiver mReceiver;
 32     
 33     class MyRunnable implements Runnable {
 34         final int mResultCode;
 35         final Bundle mResultData;
 36         
 37         MyRunnable(int resultCode, Bundle resultData) {
 38             mResultCode = resultCode;
 39             mResultData = resultData;
 40         }
 41         
 42         public void run() {
 43             onReceiveResult(mResultCode, mResultData);
 44         }
 45     }
 46     
 47     class MyResultReceiver extends IResultReceiver.Stub {
 48         public void send(int resultCode, Bundle resultData) {
 49             if (mHandler != null) {
 50                 mHandler.post(new MyRunnable(resultCode, resultData));
 51             } else {
 52                 onReceiveResult(resultCode, resultData);
 53             }
 54         }
 55     }
 56     
 57     /**
 58      * Create a new ResultReceive to receive results.  Your
 59      * {@link #onReceiveResult} method will be called from the thread running
 60      * <var>handler</var> if given, or from an arbitrary thread if null.
 61      */
 62     public ResultReceiver(Handler handler) {
 63         mLocal = true;
 64         mHandler = handler;
 65     }
 66     
 67     /**
 68      * Deliver a result to this receiver.  Will call {@link #onReceiveResult},
 69      * always asynchronously if the receiver has supplied a Handler in which
 70      * to dispatch the result.
 71      * @param resultCode Arbitrary result code to deliver, as defined by you.
 72      * @param resultData Any additional data provided by you.
 73      */
 74     public void send(int resultCode, Bundle resultData) {
 75         if (mLocal) {
 76             if (mHandler != null) {
 77                 mHandler.post(new MyRunnable(resultCode, resultData));
 78             } else {
 79                 onReceiveResult(resultCode, resultData);
 80             }
 81             return;
 82         }
 83         
 84         if (mReceiver != null) {
 85             try {
 86                 mReceiver.send(resultCode, resultData);
 87             } catch (RemoteException e) {
 88             }
 89         }
 90     }
 91     
 92     /**
 93      * Override to receive results delivered to this object.
 94      * 
 95      * @param resultCode Arbitrary result code delivered by the sender, as
 96      * defined by the sender.
 97      * @param resultData Any additional data provided by the sender.
 98      */
 99     protected void onReceiveResult(int resultCode, Bundle resultData) {
100     }
101     
102     public int describeContents() {
103         return 0;
104     }
105 
106     public void writeToParcel(Parcel out, int flags) {
107         synchronized (this) {
108             if (mReceiver == null) {
109                 mReceiver = new MyResultReceiver();
110             }
111             out.writeStrongBinder(mReceiver.asBinder());
112         }
113     }
114 
115     ResultReceiver(Parcel in) {
116         mLocal = false;
117         mHandler = null;
118         mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
119     }
120     
121     public static final Parcelable.Creator<ResultReceiver> CREATOR
122             = new Parcelable.Creator<ResultReceiver>() {
123         public ResultReceiver createFromParcel(Parcel in) {
124             return new ResultReceiver(in);
125         }
126         public ResultReceiver[] newArray(int size) {
127             return new ResultReceiver[size];
128         }
129     };
130 }

  

  Line27:说明该类是Parcelable的SubClass,这就为我们今天Service和Act通信提供的可能

  Bundle是Android通信中参数的载体,同时提供了各种各样的set方法,其中主要的一个set方法,可以接受一个Parcelable子类对象。

  

  不到大家注意了木;

  Line99:protected void onReceiveResult(int resultCode, Bundle resultData)这个方法是个空实现,纳尼问题来了,咱们阔以重载了他么,

  下边是我自己的代码,来看俺的风骚;

 1 import android.os.Bundle;
 2 import android.os.Handler;
 3 import android.os.ResultReceiver;
 4 
 5 /**
 6  * @author ArMn
 7  *    859686819@qq.com
 8  */
 9 public class MyResultReceiver extends ResultReceiver
10 {
11 
12     public MyResultReceiver(Handler handler) {
13         super(handler);
14         // TODO Auto-generated constructor stub
15     }
16     
17     @Override
18     protected void onReceiveResult(int resultCode, Bundle resultData) {
19         // TODO Auto-generated method stub
20         if(null != mActCallBackListener)
21             mActCallBackListener.callBack();
22     }
23     
24     public void setReceiver(ActCallBackListener listener){
25         this.mActCallBackListener = listener;
26     }
27     
28     private ActCallBackListener mActCallBackListener = null;
29     
30     public interface ActCallBackListener{
31         void callBack();
32     }
33 }

  代码实现了ResultRecceview类,然后重载了onReceiveResult方法,同事自定义了内部interface,setReceiver方法用于指定所需要的回调对象,callback就是真正的回调方法了。

  现在是时候说怎么通信了 ,通信的简单代码我就不再复述了,上边说道Bundle可以接受一个Parcelable对象,当然了现在咱们的MyReceiver继承自Receiver,同事Receiver是Parcelable的子类,别的就不用说了,new MyREceiver给Bundle是没问题了,回头继续源码Line74方法send方法;

  核心源码:

 1 public void send(int resultCode, Bundle resultData) {
 2             if (mLocal) {
 3                 if (mHandler != null) {
 4                     mHandler.post(new MyRunnable(resultCode, resultData));
 5                 } else {
 6                     onReceiveResult(resultCode, resultData);
 7                 }
 8                 return;
 9             }
10          .........
11         }

  Line6:大家可以看到这里callback到咱们重载的方法onReceiveResul方法,咱们的callback484真的就完成了回调了哪?????

  饿死人了,粢饭!!!!!!

  有空继续吹,今天先到这<><><><><><><><><>66666666666666666

原文地址:https://www.cnblogs.com/liemng/p/5253433.html