探索Android路由框架-ARouter(2)

首先:在Activity/Fragment类上面写上 Route path 注解。 [原创文章:www.11jj.com]

[转载出处:www.11jj.com]

注意:这里的路径需要注意的是至少需要有两级,/xx/xx

  • 然后:在Activity/Fragment类里面进入Arouter 注入,也就是:       ARouter.getInstance().inject(this);

  • 接着:目标的Activity类上面需要声明Route path 注解,以此对应(跳转如果不对应路径,框架会Toast说路径不匹配)

  • 上述说明的使用代码如下:

    // 在支持路由的页面上添加注解(必选)
    // 这里的路径需要注意的是至少需要有两级,/xx/xx
    // 路径标签个人建议写在一个类里面 这样方便统一管理和维护
    @Route(path = "/app/MainActivity")
    public class MainActivity extends BaseActivity {
        public static final String TAG = "app";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
             ARouter.getInstance().inject(this);
            /**
             * Activity 跳转 (普通跳转)
             * 跳转到SimpleActivity
             */

            findViewById(R.id.skip).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                ARouter.getInstance().build( "/app/SimpleActivity").
                            navigation();
                }
       });

    理论上来说,如果只是进行简单的跳转页面,ARouter.getInstance().build(“目标界面对应的路径”).navigation();这一行代码即可完成跳转界面。由于项目的扩大、界面的跳转成为了很常见的功能、路径的标签数量也会相对增多。因此需要更好管理的界面路径(所以更好的选择是写一个类,在这个类里面统一管理和维护路径标签,不仅利于维护也方便后期拓展,看到路径就一目了然,哇~这个路径对应的是登录界面,这个路径对应的是详情界面而且更加容易排错);

    其次,每个页面的注入,也就是ARouter.getInstance().inject(this);这句代码出现的几率会写的很多,(而且一般的常规逻辑是有注入就有解绑或者释放资源)所以我们应该简单封装起来提高效率。

    简单封装

    首先是路径管理(只是参考):

    /**
     * ARouter上面的注解需要我们写路径标识
     * 我们可以写一个常量文件,在这里统一管理路径标签
     */

    public final class Constance {
        public static final String TAG = "app";
        public static final boolean UseIInterceptor = true;
        public static final String ACTIVITY_URL_MAIN = "/app/MainActivity";
        public static final String ACTIVITY_URL_SIMPLE = "/app/SimpleActivity";
        public static final String ACTIVITY_URL_PARSE = "/app/SimpleUriActivity";
        public static final String ACTIVITY_URL_SECOND = "/app/SecondActivity";
        public static final String ACTIVITY_URL_INTERCEPTOR = "/app/Interceptor";
        public static final String ACTIVITY_URL_FRAGMENT = "/app/fragment";
        public static final String GROUP_FIRST = "group_first";
    }

    然后是注入封装;这里多提一嘴,优秀的第三方框架如果一般有注入或者绑定的API,那与之对应的一般就会有释放或者解绑资源的API。(这样做的本质是优化内存)其中, ARouter.getInstance().destroy() ; 这个API一目了然,就是释放资源的API。下面就是开始注入和释放资源的封装:

    public class BaseActivity extends AppCompatActivity {
        private SparseArray<View> mViews;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // ARouter inject 注入
            ARouter.getInstance().inject(this);
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            mViews = new SparseArray<>();
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
    //        这样写会报错
    //        ARouter.getInstance().destroy();
        }

    笔者在Activity的基类里面通过生命周期进行了注入和解绑,但是项目运行后发现了一个问题,就是如果在onDestroy()里面调用了 ARouter.getInstance().destroy() ; 在进入目标Activity之后,然后按back键返回原界面的时候,APP会报错崩溃,下面是崩溃日志:

    探索Android路由框架-ARouter(2)

    仔细一看,初始化有问题?在前面我们说到在自定义Application里面已经初始化了ARouter,且在清单文件里面配置了自定义的Application,但是依旧提示没有初始化,这就纳了个闷?然后想了想,可能是 ARouter.getInstance().destroy();这行代码的使用位置可能用错了。然后既然是在Application里面进行的初始化,那么就可以将这行释放资源的代码,写在Application生命周期的onTerminate( )里面,果不其然,项目运行后就没什么问题了。当然,这是我自己的思路,有更好的意见和想法请在评论区指出,谢谢。因此调整之后的Application写法如下:

    public class HomeApplication extends Application {
    //  ARouter 调试开关
        private boolean isDebugARouter = true;
        @Override
        public void onCreate() {
            super.onCreate();
            if (isDebugARouter) {
                // 下面两行必须写在init之前,否则这些配置在init过程中将无效
                ARouter.openLog();     // 打印日志
                // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!
                // 线上版本需要关闭,否则有安全风险)
                ARouter.openDebug();
            }
            // 官方建议推荐在Application中初始化
            ARouter.init(HomeApplication.this);
        }
        @Override
        public void onTerminate() {
            super.onTerminate();
            ARouter.getInstance().destroy();
       }
    }使用

    自媒体 微信号:11jj 扫描二维码关注公众号
    爱八卦,爱爆料。

    小编推荐

    1. 1

      数字易经0到9代表什么卦(数字易经测算)

      大家好,小伟今天来为大家解答数字易经0到9代表什么卦以下问题,数字易经测算很多人还不知道,现在让我们一起来看看吧!1、数字1代表坎水、数

    2. 2

      苹果手机呼叫转移怎么设置(苹果手机呼叫转移怎么设置无法接通)

      大家好,小乐今天来为大家解答苹果手机呼叫转移怎么设置以下问题,苹果手机呼叫转移怎么设置无法接通很多人还不知道,现在让我们一起来看看

    3. 3

      中国红十字会标志简笔画(中国红十字会标志简笔画)

      大家好,小豪今天来为大家解答中国红十字会标志简笔画以下问题,中国红十字会标志简笔画很多人还不知道,现在让我们一起来看看吧!1、保护性

    4. 4

      八年级下册语文书人教版电子书(八年级下册语文书人教版电子书2022)

      大家好,小美今天来为大家解答八年级下册语文书人教版电子书以下问题,八年级下册语文书人教版电子书2022很多人还不知道,现在让我们一起来看

    5. 5

      古伊尔(魔兽古伊尔)

      大家好,小丽今天来为大家解答古伊尔以下问题,魔兽古伊尔很多人还不知道,现在让我们一起来看看吧!1、古伊尔是魔兽世界里面部落的一个酋长

    6. 6

      唯一极值点问题

      在高档数学的进修中,我们经常会碰着独一驻点的问题,在非常宽松的前提下,这个独一的驻点也就是极值点。今天我们稍微改变一下前提,商量如

    7. 7

      三公九卿制是什么(三公九卿制是什么朝代的制度)

      大家好,小乐今天来为大家解答三公九卿制是什么以下问题,三公九卿制是什么朝代的制度很多人还不知道,现在让我们一起来看看吧!1、三公九卿

    8. 8

      订房网哪个平台好(订房什么网最便宜)

      大家好,小娟今天来为大家解答订房网哪个平台好以下问题,订房什么网最便宜很多人还不知道,现在让我们一起来看看吧!1、携程、美团、艺龙、

    Copyright 2024.依依自媒体,让大家了解更多图文资讯!