• android aidl 简单使用


    aidl 全称  android interface definition language( 接口定义语言 )

    aidl的写法跟javainterface的写法基本一致,不同的是,aidl不能用public修饰,源代码要以.aidl结束.

    aidl的包名跟我们java源代码的包名是一样的.

    android studio建立aidl文件:

    鼠标在java文件是上右键选择aidl,AS会自动给你创建一个aidl文件.

    aidl:

    // IService.aidl
    package com.lss.alipay;
    
    // Declare any non-default types here with import statements
    
    //不能加public修饰interface,因为其本身就是public的
    
    interface IService {
        void callALiPayService();
    }
    

     service:

    public class ALiPayService extends Service {
        private static final String TAG = "ALiPayService";
    
        private class MyBinder extends IService.Stub{
    
            @Override
            public void callALiPayService() throws RemoteException {
                methodInService();
            }
        }
        private void methodInService(){
            Log.d(TAG, "开始付费,购买装备");
        }
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            Log.d(TAG, "绑定支付宝,准备付费");
            return new MyBinder();
        }
    
        @Override
        public void onCreate() {
            Log.d(TAG, "调用支付宝成功");
            super.onCreate();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "关闭支付宝");
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            Log.d(TAG, "取消付费");
            return super.onUnbind(intent);
        }
    }
    

    注意:在服务中写aidl时可能会找不到,这时你需要clean以下代码.

    另一个应用调用aidl.

    首先把你想调用的那个应用程序的aidl文件拷贝到自己的应用下,包名要一致.

    现在开启服务调用aidl

    MainActivity:

    public class MainActivity extends AppCompatActivity {
        private IService iService;
        private MyConn conn;
        private Intent intent;
    
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intent = new Intent();
            intent.setAction("com.lss.alipay");
            //在5.0及以上版本必须要加上这个
            intent.setPackage("com.lss.alipay");
        }
    
        //按钮点击事件
        public void bind(View view){
            conn=new MyConn();
            bindService(intent,conn,BIND_AUTO_CREATE);
        }
        public void call(View view){
            try {
                iService.callALiPayService();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        public void unbind(View view){
            unbindService(conn);
        }
        private class MyConn implements ServiceConnection{
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iService=IService.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        }
    }
    

     如果你的手机是5.0及以上版本,开启服务时需要明确应用的包名,调用intent的setPackage( String package )方法

    //在5.0及以上版本必须要加上这个
    intent.setPackage("com.lss.alipay");
    

     不然会报错.错误如下

  • 相关阅读:
    ASP标准控件的重要性
    jndi的疑惑 转
    jms中topic和queue的区别
    JNDI解析
    javascript document 对象属性(转)
    SAX解析xml全解
    java路径解析
    深度学习之美(张玉宏)——第三章 机器学习三重门
    centos7 源码编译安装 php
    centos7 源码编译安装 nginx
  • 原文地址:https://www.cnblogs.com/IT-lss/p/5693995.html
Copyright © 2020-2023  润新知