Android SDK編寫學習筆記

仙道彰發表於2018-01-25

Android SDK編寫學習筆記#

cmd-markdown-logo

最近公司希望將來某一天能讓其他人能使用公司的平臺,所以要開發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:專案地址

相關文章