编码好心情:关于Intent生态的管理(一)

[编码好心情]新开专题,专题讲的是:好的编码习惯也能让你码出好心情~~

<p />
Update List


Intent

关于Intent(意图),即启动ActivityService等组件的方式。包含需要启动的对象、携带的数据(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) {

    }
}

类注释查看后是


类注释.png

这里用到一些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管理的生态圈里面。

整理你的AppIntent模式

如上面我们需要用到跳转后自我销毁的模式,另外我也列举一下常见的(这里我们先不跟IntentlaunchMode以及FLAGS做挂钩,只讨论和交互有关的模式):

  • 跳转到指定界面,并且该界面只初始化一次
  • 界面点击返回后跳转固定跳转到指定界面
  • 当前界面可能会被多次启动,我们只需要显示一个,重复的都要去掉
  • ...

前期列举完后(怎么可能列举得完。。你知道产品会怎么变吗-_-|||),接下来,我们需要一个强大的,能屏蔽具体实现细节,只暴露使用模式给我们Intent生态使用的方法!


小结

这篇文章先写到这啦,看完对编码习惯有没有一定的体会~! 总的来说,讲得是:提取管理类,抽离Extra参数细节,提供一个基类,将公共行为逻辑分装到基类和整理App的Intent模式。一步步将Intent相关的逻辑打造成一个生态做统一管理。稍作整理我再把后续部分写出来给大家分享~~~ ^ ^
·
·
·
·
·
·
·
·
·

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容