zoukankan      html  css  js  c++  java
  • Android远程服务(AIDL)实现步骤

    AIDL是安卓接口定义语言的缩写

    由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagename目录下,否则无法自动生成接口类文件

    首先,编写我们的AIDL文件,定义接口方法,语法与JAVA略有不同

    其次,我们要在建立的service类中建立实现了该AIDL文件名.stub类的子类,实现继承的方法。

    在onbind方法中返回这个子类的一个实例

    注册该服务,并给其一个ACTION,此ACTION就是以后访问该服务的ID

    在ACTIVITY中,通过INTENT设立ACTION以及bindService的方法来启动该服务,需要注意的是,Android5.0中service的intent一定要显性声明,所以我们要给INTENT设置上我们现在的包名,使用上下文的GETPACKAGENAME即可,并建立一个ServiceConnection实例,实现该实例的方法,在onServiceConnected方法中可以通过其参数service来获得service传回的子类实例。

    通过该实例,我们就可以调用服务中子类实例的方法了。

    上面就是AIDL服务的建立和使用的简易教程

    Activity

    public class aidlactivity extends Activity{
        private IMyAidlInterface mys = null;
    
        public ServiceConnection sc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mys = IMyAidlInterface.Stub.asInterface(service);
                if(mys != null) {
                    try {
                        Toast.makeText(aidlactivity.this, mys.getvalue(), Toast.LENGTH_LONG).show();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    Log.v("sk", "not null");
                }
    
    
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Intent intent = new Intent();
            intent.setAction("com.xl.aild.myaidl");
            intent.setPackage(this.getPackageName());
            bindService(intent, sc, Context.BIND_AUTO_CREATE);
        }
    }

    interface IMyAidlInterface {
        /**
         * Demonstrates some basic types that you can use as parameters
         * and return values in AIDL.
         */
       String getvalue();
    }

    AIDL文件↑

    Servece文件

    public class aidlservice extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            Log.v("sk", "return");
            return new myaidl();
        }
    
        class myaidl extends IMyAidlInterface.Stub {
    
            @Override
            public String getvalue() throws RemoteException {
                return "such a powerful aidl";
            }
        }
    }

    全称是:Android Interface Define Language

    在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。

    AIDL(AndRoid接口描述语言)是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

    AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

    AIDL的创建方法:

    AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

    1. 不需要import声明的简单Java编程语言类型(int,boolean等)

    2. String, CharSequence不需要特殊声明

    3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

    -----人若无名,则可专心练剑
  • 相关阅读:
    web项目优化
    mysql 优化笔记
    Java 调用 google 翻译
    Git回滚merge操作
    mybatis 批量插入 返回主键id
    idea tomcat debug 失效
    mysql 常用语句
    xstream 解析xml报文
    activeMQ 讲解及实战
    linux svn apache
  • 原文地址:https://www.cnblogs.com/u3shadow/p/4271162.html
Copyright © 2011-2022 走看看