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:專案地址