设为首页 加入收藏

TOP

Binder中的asInterface解析(一)
2017-10-13 10:35:55 】 浏览:664
Tags:Binder asInterface 解析

在使用AIDL通信的时候,在Stub类中都会生成一个asInterface函数,以《Android开发艺术探索》中的例子来分析,其生成的asInterface函数源码为:

 1         /**
 2          * Cast an IBinder object into an com.willhua.demoaidl.aidl.IBookManager
 3          * interface, generating a proxy if needed.
 4          */
 5         public static com.willhua.demoaidl.aidl.IBookManager asInterface(
 6                 android.os.IBinder obj) {
 7             if ((obj == null)) {
 8                 return null;
 9             }
10             android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
11             if (((iin != null) && (iin instanceof com.willhua.demoaidl.aidl.IBookManager))) {
12                 return ((com.willhua.demoaidl.aidl.IBookManager) iin);
13             }
14             return new com.willhua.demoaidl.aidl.IBookManager.Stub.Proxy(obj);
15         }

 

我们知道asInterface的作用是根据调用是否属于同进程而返回不同的实例对象,但是对于该过程是怎么进行的,返回的到底是什么东西,可能很多童鞋不是很清楚,就这个问题分享一点我的理解。显然,通过代码可知,决定返回何种对象的关键在obj.queryLocalInterface(DESCRIPTOR)的返回结果。

下面我们通过实际DEMO来了解其过程。代码基于《Android开发艺术探索》中的例子。

DEMO中有主要有两个东西,一个就是MainActivity,一个就是BookService,MainActivity会去bind BookService,而BookService通过在Manifest中设置android:process而使之分别与MainActivity运行在同进程和异进程。

主要代码:

public class BookService extends Service {

    private Binder mBinder = new IBookManager.Stub() {
    ...
    };
    

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        LOG("BookService onBind mBinder:" +mBinder.getClass().getName() + " Process:" + Process.myPid());
        return mBinder;
    }

}
public class MainActivity extends Activity{

    private IBookManager mService;
    private Button mQuery;
    private TextView mOutInfo;
    
    ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connectService();
    }
    
    private void connectService(){
        Intent intent = new Intent(getApplicationContext(), BookService.class);
        bindService(intent, new ServiceConnection() {
            
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                LOG("onServiceConnected " + service);
                mService = IBookManager.Stub.asInterface(service);
            }
        }, BIND_AUTO_CREATE);
        
    }
    ...

}

    public static abstract class Stub extends android.os.Binder implements
            com.willhua.demoaidl.aidl.IBookManager {
        private static final java.lang.String DESCRIPTOR = "com.willhua.demoaidl.aidl.IBookManager";

        /** Construct the stub at attach it to the interface. */
        public Stub() {
            this.attachInterface(this, DESCRIPTOR);
        }

        /**
         * Cast an IBinder object into an com.willhua.demoaidl.aidl.IBookManager
         * interface, generating a proxy if needed.
         */
        public static com.willhua.demoaidl.aidl.IBookManager asInterface(
                android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.willhua.demoaidl.aidl.IBookManager))) {
                return ((com.willhua.demoaidl.aidl.IBookManager) iin);
            }
            return new com.willhua.demoaidl.aidl.IBookManager.Stub.Proxy(obj);
        }
...
}

androd.os.Binder部分源码:

public class Binder implements IBinder {

    //...

    /**
     * Convenie
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇懒人学习心得 下一篇universal image loader自己使用..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目