[编码好心情]新开专题,专题讲的是:好的编码习惯也能让你码出好心情~~
<p />
Update List
- [12/13] 补充上项目的GitHub地址: https://github.com/Yeewoe/jianshu_intent_demo
关于Intent(意图),即启动Activity、Service等组件的方式。包含需要启动的对象、携带的数据(Bundle)、启动的方式(FLAG)、是否需要等待监听结果(Result)等功能。
关于上述Intent所讲的每个部分抽开讲其实都可以是单独的技术文,网上也找到了一些好前辈们写的资料,这里放上一部分供大家参考(自己有用印象笔记做记录习惯,比如FLAG的东西是总怕忘记,需要经常查阅~~ 如日常混淆的FLAG_ACTIVITY_CLEAR_TOP和**FLAG_ACTIVITY_SINGLE_TOP ** <( ̄ˇ ̄)/),下面贴上连接
官方的Intent指南,Intent 和 Intent 过滤器 (这里关于显示和隐式启动区别、待定Intent即PendingIntent 以及Intent的解析等都讲得十分详细)
CSDN的nei504293736,android Intent.FLAG大全 (关于常用FLAG这里列举的比较全了)
CSDN的liuhe688,基础总结篇之二:Activity的四种launchMode (图文介绍launchMode,写的也很好)
本文的重点是分享日常在编码时如何去管理你的Intent,从Intent开始,培养优雅的编码习惯!!!**下面我们一步一步去拆解和构造一个属于自己的Intent生态。
先来一段目标代码
package org.yeewoe.intentdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class SignInActivityextends AppCompatActivity {
// ...
public void onSignIn() {
// TODO verify account 、password ...
/** 如果一切校验通过,这里将跳往到主界面 **/
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FROM, this.getClass().getName());
intent.putExtra(MainActivity.EXTRA_ACCOUNT, "输入的用户名");
startActivity(intent);
/** 这里需要销毁LoginActivity,避免从{@linkplain org.yeewoe.intentdemo.MainActivity 主界面}点击返回到这里||| **/
finish();
}
// ...
}
上面的代码是不是似曾相识|||,代码很简单,要做的就是往某个界面跳转,以及及时销毁本身。说说这样写的问题有哪些:
- 调用方需要知道主界面是哪个,假如你们是一个Team一起工作,那你可能就得弄清楚目标Activity了
- 调用方需要知道自己需要传的extra参数的name,通常name是由解析方提供的,那你可能就得去弄清楚目标Activity更多的细节了。
- 仔细观察这里要传的参数是调用方类本身的名字,属于通用型参数。假设你的Intent生态里面每个调用方都需要传入这种类似而且必须要带上的参数。那简直是一场噩梦,假设要修改参数就得每个地方做检查和改动
- finish自身的方式虽然可以,但是并不推荐,会导致全局的过渡动画失效,有兴趣的童鞋可以试试。而且重点是这种方式并不优雅~~
- ...
根据我提的一堆问题,稍微有经验的都知道需要抽离代码到一个单独的类上做管理,体现分层思想:
构建一个专门的局部性Intent管理类
我的习惯是构建局部性的管理类,若直接提供一个总的管理类,随着项目的增大可能会显得臃肿难以管理。如何定义局部:假设项目是按功能分模块的,那每个功能模块我们给一个单独的Intent管理类。这里我们新建一个AuthIntentManager类
package org.yeewoe.intentdemo;
import android.app.Activity;
import android.content.Context;
/**
* <h3>ClassInfo</h3>
* auth模块使用的Intent管理类
* <p />
* <h3>可处理的功能</h3>
* <ul>
* <li>注册跳转</li>
* <li>主界面跳转</li>
* </ul>
*
* Created by yeewoe on 2016/12/12.
*/
public class AuthIntentManager {
/**
* 跳往注册页面
*/
public static void intentToSignUp(Activity activity) {
}
/**
* 跳转主界面
*/
public static void intentToMain(Context context, String account) {
}
}
类注释查看后是
这里用到一些HTML语法的注释,关于这些查看我之前的一篇文章 编写优美Android注释的常用语法 <( ̄ˇ ̄)/ , 在这里谢谢童鞋们对我的支持了!
这个类现在还不能干什么事,但是我们已经将代码的结构做了初步的处理。 我们知道调用方需要带各种参数。为了让调用方不用过多的去了解传参的细节。那我们需要做进一步处理:
将参数细节封装进Intent管理类
将跳转主界面的方法做具体实现:
/**
* 跳转主界面
*/
public static void intentToMain(Context context, String account) {
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FROM, context.getClass().getName());
intent.putExtra(MainActivity.EXTRA_ACCOUNT, account);
context.startActivity(intent);
}
好的,我们将Extra参数信息封装进来了,这样外界调用已经不需要知道这些信息了~~ 接着,我们上面提到这里的EXTRA_FROM属于类似且必须的参数,基本我们每个Intent调用都会传,怎么办呢,这里继承能帮到我们:
提供Intent管理类基类,提供公共处理方法
直接上基类AbsIntentManager代码:
public abstract class AbsIntentManager {
private static final String EXTRA_FROM = "extra_from";
public static Intent buildIntent(Context context, Class<?> clazz) {
Intent intent = new Intent(context, clazz);
intent.putExtra(EXTRA_FROM, context.getClass().getName());
return intent;
}
public static Intent buildIntent(Context context, Class<?> clazz, int flags) {
Intent intent = new Intent(context, clazz);
intent.putExtra(EXTRA_FROM, context.getClass().getName());
if (flags > 0) {
intent.addFlags(flags);
}
return intent;
}
}
子类继承后做适配:
public class AuthIntentManager extends AbsIntentManager {
/**
* 跳往注册页面
*/
public static void intentToSignUp(Activity activity) {
}
/**
* 跳转主界面
*/
public static void intentToMain(Context context, String account) {
Intent intent = buildIntent(context, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_ACCOUNT, account);
context.startActivity(intent);
}
}
好了,这样我们的Intent调用就解决了参数暴露以及公共部分难维护的问题了。 Intent生态也初步见雏形。接下来需要讨论个问题,我们的问题提到SignInActivity用的finish自我销毁方式并不妥当,那需要怎么去替换这种方式,另外关于启动销毁模式的管理怎么去融合到我们的Intent管理的生态圈里面。
整理你的App的Intent模式
如上面我们需要用到跳转后自我销毁的模式,另外我也列举一下常见的(这里我们先不跟Intent的launchMode以及FLAGS做挂钩,只讨论和交互有关的模式):
- 跳转到指定界面,并且该界面只初始化一次
- 界面点击返回后跳转固定跳转到指定界面
- 当前界面可能会被多次启动,我们只需要显示一个,重复的都要去掉
- ...
前期列举完后(怎么可能列举得完。。你知道产品会怎么变吗-_-|||),接下来,我们需要一个强大的,能屏蔽具体实现细节,只暴露使用模式给我们Intent生态使用的方法!
小结
这篇文章先写到这啦,看完对编码习惯有没有一定的体会~! 总的来说,讲得是:提取管理类,抽离Extra参数细节,提供一个基类,将公共行为逻辑分装到基类和整理App的Intent模式。一步步将Intent相关的逻辑打造成一个生态做统一管理。稍作整理我再把后续部分写出来给大家分享~~~ ^ ^
·
·
·
·
·
·
·
·
·