美文网首页Android知识Android技术知识今日看点
编码好心情:关于Intent生态的管理(一)

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

作者: Yeewoe | 来源:发表于2016-12-12 16:11 被阅读170次

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

    <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相关的逻辑打造成一个生态做统一管理。稍作整理我再把后续部分写出来给大家分享~~~ ^ ^
    ·
    ·
    ·
    ·
    ·
    ·
    ·
    ·
    ·

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ieymmttx.html