2024年最新鸿洋推荐:实际生产中的-Android-SDK开发总结(一),安卓手机界面设计规范

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

生成一个JSON格式的字符串,跟Map方案的缺点类似,组装过程中还容易产生JSON格式问题。

3.1.3、传递一个自定义实体类

通过SDK模块内置专用实体类的实例,动态设置相关参数,交互类的实例。该放方案简单易用,屏蔽了生成与设置的细节,直接通过简单的set方法接口为其赋值,并且可以在赋值时进行数据校验、限定。

入参构建示例:

//构建请求实体
final ReqContent req = new ReqContent();
req.setToken(“a_valid_token”);
req.setSignature(“a_valid_signature”);

返参获取示例:

//获取返回实体
ResultContent result = getResult(intent);
int code = result.getCode();
String message = result.getMessage();
String token = result.getToken();

Tips1:采用自定义实体类作为出入参在activity间传输时,无法直接传递实体,需要经过序列化。有两种方法可以实现

1、实体类需要实现 JDK下的Serializable接口,通过bundle传输:

bundle.putSerializable(KEY_REQ, req);

2、实体类需要实现 Android SDK下的Parcelable接口,通过bundle传输:bundle.putParcelable(KEY_REQ, req);

Tips2:需要注意的是:Intent 中的 Bundle 是使用 Binder 机制进行数据传送的,有大小限制,所以务必不要进行大数据传输,建议最大不超过500K,越小越好,避免传输图片。(实测不同版本有不同限制,500K不是一个确定的数目,感兴趣的可以自己测试一下)

3.2、调用封装设计

SDK的调用,需遵循简单、封装的原则。

主要有两种类型,一是单纯的、无界面的、不与用户交互的代码逻辑,如常见的加密、摘要生成SDK等等,直接通过一个最简单的方法调用后直接返回即可。

二是复杂的、有界面、直接接触用户的SDK,此类SDK也是本章重点讨论的类型。

背景:SDK内部有一系列承载不同业务逻辑的Activity,第三方通过启动SDK的入口Activity进行SDK调用与业务分发,那么如何做一个优雅的调用封装?

封装前的调用:

//繁琐的调用代码
Bundle bundle = new Bundle();
//这里要暴露或者约定一个静态KEY
bundle.putParcelable(KEY_REQ, request);
Intent intent = new Intent(context, EntryActivity.class);
//屏蔽转场动画,让画面跳转更和谐
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtras(bundle);
context.startActivity(intent);

封装后的调用:

//简洁的调用代码
MySDK.launchSdk(context,req);

//将复杂逻辑或细节内置于SDK中,对外提供封装好的静态方法即可
public static void launchSdk(Context context, ReqContent request) {
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_REQ, request);
Intent intent = new Intent(context, EntryActivity.class);
//屏蔽转场动画,让画面跳转更和谐
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtras(bundle);
context.startActivity(intent);
}

如此一来,不仅简化了调用,还屏蔽了一系列中间过程的模板代码,何乐而不为呢?SDK多写几行代码,可以方便开发者千万家。这里只是简单提供了一个思路,具体流程具体分析,从这里发散开去即可,但是也要避免过度封装,导致扩展、、兼容性的问题。

3.3、数据返回设计

数据返回是SDK设计中不可缺失的一环。遵循的是“调用即响应”的原则,响应具体可以分为返回码、抛异常。切勿设计出无响应、无回调的SDK逻辑。SDK内部流程处理完毕后必须给调用方一个返回,业务才能继续。具体来讲,处理了if,就必须关注else,处理了case,就必须关注default,这也是良好的java编程习惯的一部分。

业务型SDK的数据返回机制需要怎么设计呢?首先我们看下需求背景:

  • 需要在App与SDK的Activity间进行数据传输

  • 调取SDK后,需要执行一段异步逻辑,结束后需及时关闭;

  • 需要在逻辑代码处理过程中随时随地的构造返回参数并返回;

  • SDK代码需集成于各类第三方App,需要通用的交互机制,避免引起更多兼容问题。

采用startActivityForResult()? 理论可行,但不够灵活,弃用。

采用EventBus ? 避免引入非必须第三方依赖,暂时放弃。

采用BroadcastReceiver?Android 内置的四大组件之一,为组件间交互而生。而且灵活方便,与入参方法呼应,可以从Intent中传输数据。

广播又可以分为全局广播和应用内广播,全局广播可以跨App传递,基于Binder机制,在这个场景下显得过于大材小用。而应用内广播,基于Handler机制,仅限于同一应用内的数据交互,相比于全局广播无需进程间通信,效率更高、也无需担心其他应用接收广播带来的安全性问题。下面来看下应用实例:

发送数据

//SDK内部封装的静态方法,提供给SDK内部模块统一调用
public static void sendResult(String token, int code, String message) {

ResultContent result = new ResultContent();
result.setToken(token);
result.setCode(code);
result.setMessage(message);

Bundle bundle = new Bundle();
bundle.putParcelable(KEY_RESULT, result);

Intent intent = new Intent();
intent.setAction(MY_SDK_RECEIVER_ACTION);
intent.putExtras(bundle);
LocalBroadcastManager.getInstance(MySDK.getContext()).sendBroadcast(intent);
}

接收数据

//SDK内部封装的注册方法,提供给APP模块统一调用
public static void registerReceiver(BroadcastReceiver receiver) {
IntentFilter filter = new IntentFilter();
filter.addAction(MY_SDK_RECEIVER_ACTION);
LocalBroadcastManager.getInstance(getContext()).registerReceiver(receiver, filter);
}

//SDK内部封装的反注册方法,提供给APP模块统一调用,如果在onCreate()方法中注册,则在onDestroy()方法中反注册。
public static void unregisterReceiver(BroadcastReceiver receiver) {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(receiver);
}

//APP 中定义的广播接收器,用于接收返回参数
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ResultContent result = MySDKHelper.getResult(intent);
if (result == null) {
return;
}
int code = result.getCode();
String message = result.getMessage();
String token = result.getToken();
String log = String.format(Locale.CHINA,“返回码: %d 返回信息: %s Token: %s”, code, message, token);
Log.d(TAG, log);
}
}

四、参数过滤设计

参数过滤是指在入参过程中对入参数据进行过滤,避免无意义后续业务流程,及时提供调用反馈。

常见的过滤方式有:非空检测、数据类型检测,数据格式检测。还可以通过自定义注解的方式对参数进行标记,通过编译器的检测就可以及时纠正数据类型。

一个简单的自定义注解示例

public class SourceAnnotationDemo {

public static final String TYPE_A = “A”;
public static final String TYPE_B = “B”;

private String type;

@StringDef({TYPE_A, TYPE_B})
@Retention(RetentionPolicy.SOURCE)
public @interface MyType {
}

总结

这次面试问的还是还是有难度的,要求当场写代码并且运行,也是很考察面试者写代码
因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值