Android SDK编写学习笔记

Android SDK编写学习笔记#

最近公司希望将来某一天能让其他人能使用公司的平台,所以要开发SDK,但是自己对这方面的经验又不足,研究了两天,稍微有点东西写下来。

  • 一个全局配置类,主要得到全局上下文环境,以后会加入一些简单的配置信息。
             SdkContext.init(this);

复制代码
  • 一个接口,主要用来写对外开放的方法。
public interface IAkiraService {

    void connect(String mac, ConnectResponse response);//连接

    void getUser(UserResponse response);//获取用户信息

}
复制代码
  • 一个接口实现类
/**
 * SDK接口实现类
 * Created by zhoujiaqi on 2018/1/24.
 */

public class AkiraImpl implements IAkiraService {

    @Override
    public void connect(String mac, ConnectResponse response) {
        LogUtils.v(String.format("connect %s", mac));
        response.onResponse(0,true);
    }

    @Override
    public void getUser(UserResponse response) {
        LogUtils.v("disconnect");
        UserModel userModel = new UserModel();
        userModel.setAge(10);
        userModel.setUid(10001);
        userModel.setName("仙道彰");
        response.onResponse(0,userModel);
    }

}
复制代码
  • 一个代理类,这里用了Java的动态代理模式
public class TransactionHandler implements InvocationHandler {



    private Object target;

    public Object getInstance(Object target){
        this.target = target;
        Class clazz = target.getClass();
        Object obj = Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
        return obj;
    }



    //当通过代理类的对象发起对重写的方法的调用时,都会转为对如下的invoke方法的调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //method方法的返回值是returnVal
        LogUtils.e("++++++before " + method.getName() + "++++++");
        Object returnVal = method.invoke(target, args);
        LogUtils.e("++++++after " + method.getName() + "++++++");
        return returnVal;
    }
}
复制代码
  • 一个管理类,用来获取代理类实例
public class Akira {

    private static IAkiraService instance;
    public static IAkiraService getInstance() {
        if (instance == null) {
            synchronized (Akira.class) {
                if (instance == null) {
                    IAkiraService service = new AkiraImpl();
                    instance = (IAkiraService) new TransactionHandler().getInstance(service);
                }
            }
        }
        return instance;
    }
}
复制代码
  • 结果返回接口,这边因为每个实现方法返回数据不一样,就设计了一个父接口支持泛型,子接口写真正返回数据类型。 为什么要这样子呢?因为别人用你的SDK的时候,你返回泛型的话,他压根不知道是什么数据。。
//父接口
public interface TResponse<T> {
    void onResponse(int code, T data);
}
//子接口
public interface UserResponse extends TResponse<UserModel> {

}
复制代码
  • 最后在我们的项目中测试使用
//先再Application中初始化
public class MyApplication extends Application {

    private static MyApplication instance;
    public static Application getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        SdkContext.init(this);
    }
}


//Activity中使用
 btn_getuser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Akira.getInstance().getUser(new UserResponse() {
                    @Override
                    public void onResponse(int code, UserModel data) {
                        LogUtils.e(data.toString()+"");
                        tv_detail.setText(data.toString());
                    }
                });

            }
        });

复制代码
  • 明天继续学习。。。还是不清楚大厂的SDK怎么做的,哎。。。。。。

  • Github:项目地址

转载于:https://juejin.im/post/5a6998836fb9a01c9d320fd6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值