Android-記錄阿里的ARouter的使用以及遇到的坑

之前一直沒有寫文章的習(xí)慣,但是隨著開發(fā)時間的增長,你會發(fā)現(xiàn)你之前遇到好多已經(jīng)解決過的問題,因?yàn)闆]有記錄只是單純的為了解決問題而解決,結(jié)果就導(dǎo)致下次在遇到同樣的問題還要費(fèi)時間去百度,Google的一頓查詢,白白浪費(fèi)時間。正所謂好記性不如爛筆頭。好了廢話不多說了。

一.ARouter支持哪些功能

1.支持直接解析標(biāo)準(zhǔn)URL進(jìn)行跳轉(zhuǎn),并自動注入?yún)?shù)到目標(biāo)頁面中

2.支持多模塊工程使用

3.支持添加多個攔截器,自定義攔截順序

4.支持依賴注入,可單獨(dú)作為依賴注入框架使用

5.支持InstantRun

6.支持MultiDex(Google方案)

7.映射關(guān)系按組分類、多級管理,按需初始化

8.支持用戶指定全局降級與局部降級策略

9.頁面、攔截器、服務(wù)等組件均自動注冊到框架

10.支持多種方式配置轉(zhuǎn)場動畫

11.支持獲取Fragment

12.完全支持Kotlin以及混編(配置見文末 其他#5)

13.支持第三方 App 加固(使用 arouter-register 實(shí)現(xiàn)自動注冊)

好了介紹完支持的哪些功能,接下來就開始使用下吧!
一.前期準(zhǔn)備
首先在App的build.gradle的defaultConfig里面添加如下:

//使用阿里的ARouter配置
        javaCompileOptions {

            annotationProcessorOptions {

                arguments = [moduleName: project.getName()]

            }
        }

然后在App的build.gradle的dependencies里面添加ARouter的依賴

    //ARouter(進(jìn)行activity,fragment的跳轉(zhuǎn)以及傳值)
    implementation 'com.alibaba:arouter-api:1.3.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'

** 二.使用配置**
自定義一個Application并繼承自Application在onCreate()方法中初始化Arouter

  //是否進(jìn)行ARouter調(diào)試(可以通過AppConfig.isDebug=true/false來判斷日志的是否開啟)
        if (AppConfig.isDebug) {
            //下面兩句話必須放到init前面,否則配置無效
            ARouter.openLog();  //打印ARouter日志
            ARouter.openDebug();  //開啟ARouter的調(diào)試模式(如果在InstantRun模式下運(yùn)行,必須開啟調(diào)試模式,線上版本需要關(guān)閉,否則有安全風(fēng)險),
        }
        //官方建議在Application里面進(jìn)行初始化(使用該注解路徑至少兩級)
        ARouter.init(this);

\color{red}{最后不要忘記在AndroidManifest.xml文件中加入自定義的Application}
到這里ARouter就可以使用了,下面就簡單的用代碼實(shí)戰(zhàn)下吧!
分別創(chuàng)建了2個Activity,1個fragment,1個IInterceptor(攔截器),1個ARouter的服務(wù),1個攜帶數(shù)據(jù)時用到的轉(zhuǎn)換器,下面是代碼每一步都已經(jīng)測試過了并且已經(jīng)加上個人理解的注釋了,有需要的可以復(fù)制試下
\color{red}{主界面MainActivity}

package com.zd.myarouterdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.core.app.ActivityOptionsCompat;
import androidx.fragment.app.Fragment;

import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.callback.NavigationCallback;
import com.alibaba.android.arouter.launcher.ARouter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private AppCompatButton btn, btn1, btn2, btn3, btn4, btn5, btn6, btn7;

    /**
     * 推薦使用獲取ARouter服務(wù)
     */
    @Autowired(name = AppConfig.SERVICE)
    ARouterService aRouterService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ARouter.getInstance().inject(this);
        btn = (AppCompatButton) findViewById(R.id.btn);
        btn1 = (AppCompatButton) findViewById(R.id.btn1);
        btn2 = (AppCompatButton) findViewById(R.id.btn2);
        btn3 = (AppCompatButton) findViewById(R.id.btn3);
        btn4 = (AppCompatButton) findViewById(R.id.btn4);
        btn5 = (AppCompatButton) findViewById(R.id.btn5);
        btn6 = (AppCompatButton) findViewById(R.id.btn6);
        btn7 = (AppCompatButton) findViewById(R.id.btn7);
        btn.setOnClickListener(this);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
    }

    /**
     * 都使用了一個攔截器TestInterceptor
     *
     * @param view
     */
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
//            頁面之間跳轉(zhuǎn)使用阿里巴巴ARouter跳轉(zhuǎn),其中注意帶返回值啟動的時候請求嗎不能為0否則沒有回調(diào)onActivityResult
//            使用ARouter傳遞參數(shù)的時候如果有傳遞Bundle跟其他的屬性Bundle必須寫在前面否則其他的屬性注入不了
            case R.id.btn:
                //直接跳轉(zhuǎn)
                ARouter.getInstance().build(AppConfig.TEST).navigation();
                break;
            case R.id.btn1:
                //帶進(jìn)入動畫的跳轉(zhuǎn)(注意這里動畫一定要在build()之后不然會找不到方法)一下兩種方法都可以,可以自行選擇
                //1.在調(diào)用navigation()時,若設(shè)置的效果未起效,則在navigation()添加參數(shù),如navigation(this)即可。
//                ARouter.getInstance()
//                        .build(AppConfig.TEST)
//                        //進(jìn)入動畫(注意這里動畫一定要在build()之后不然會找不到方法),若設(shè)置的效果未起效,則在navigation()添加參數(shù),如navigation(this)即可。
//                        //參數(shù)1為打開的Activity的進(jìn)入動畫,參數(shù)2為當(dāng)前的Activity的退出動畫
//                        .withTransition(R.anim.top_in, R.anim.top_out).navigation(this);

                //2.新版本跳轉(zhuǎn)動畫
                if (Build.VERSION.SDK_INT >= 16) {
                    ActivityOptionsCompat compat = ActivityOptionsCompat.
                            makeScaleUpAnimation(view, view.getWidth() / 2, view.getHeight() / 2, 0, 0);

                    ARouter.getInstance()
                            .build(AppConfig.TEST)
                            .withOptionsCompat(compat)
                            .navigation();
                } else {
                    Toast.makeText(this, "API < 16,不支持新版本動畫", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn2:
                //帶動畫如果不起作用,請看btn1事件注釋
                //這里傳遞基礎(chǔ)參數(shù)跟原生的一樣(key-value)
                Bundle bundle = new Bundle();        //得到bundle對象
                bundle.putInt("index", 1);
                bundle.putString("name", "張三");
                bundle.putLong("num", 0x555555L);
                ARouter.getInstance()
                        .build(AppConfig.TEST)
                        .withInt("index", 1)
                        .withString("name", "張三")
                        .withLong("num", 0x555555L)
                        .withBundle("bundle", bundle)
                        .withTransition(R.anim.slide_in_left, R.anim.slide_out_right).navigation(this);
                break;
            case R.id.btn3:
                //帶動畫如果不起作用,請看btn1事件注釋
                //這里傳遞對象參數(shù)跟原生的一樣(key-value)
                Person person = new Person("張三", "25");
                ARouter.getInstance()
                        .build(AppConfig.TEST)
                        .withTransition(R.anim.bottom_in, R.anim.bottom_out)
                        .withInt("index", 2)
                        .withObject("person", person)
                        .navigation(this);
                break;
            case R.id.btn4:
                //帶動畫如果不起作用,請看btn1事件注釋
                //這里傳遞集合參數(shù)跟原生的一樣(key-value)
                List<Person> personList = new ArrayList<>();
                personList.add(new Person("張三", "25"));
                personList.add(new Person("里斯", "23"));
                Map<String, Object> map = new HashMap<>();
                map.put("person", new Person("王二麻子", "26"));
                map.put("list", personList);
                ARouter.getInstance()
                        .build(AppConfig.TEST)
                        .withTransition(R.anim.bottom_in, R.anim.bottom_out)
                        .withInt("index", 3)
                        .withObject("personList", personList)
                        .withObject("map", map)
                        .navigation(this);
                break;
            case R.id.btn5:
                //攔截器的使用面向切面編程
                //跳轉(zhuǎn)攔截,可以用于登錄
                ARouter.getInstance().build(AppConfig.TEST).navigation(this, new NavigationCallback() {
                    @Override
                    public void onFound(Postcard postcard) {
                        Log.e("MainActivity", "找到了");
                    }

                    @Override
                    public void onLost(Postcard postcard) {
                        Log.e("MainActivity", "找不到了");
                    }

                    @Override
                    public void onArrival(Postcard postcard) {
                        Log.e("MainActivity", "目標(biāo)activity打開完成");
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {
                        // 被登錄攔截了下來了
                        // 需要調(diào)轉(zhuǎn)到登錄頁面,把參數(shù)跟被登錄攔截下來的路徑傳遞給登錄頁面,登錄成功后再進(jìn)行跳轉(zhuǎn)被攔截的頁面
                        Log.e("MainActivity", "被攔截了");
                    }
                });
                break;
            case R.id.btn6:
                //獲取Fragment的實(shí)例(重復(fù)嵌套的情況下可能獲取不到,所以不推薦)
                Fragment fragment = (Fragment) ARouter.getInstance().build(AppConfig.FRAGMENT).navigation();
                Toast.makeText(this, fragment.toString(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn7:
                // 1. (推薦)使用依賴注入的方式發(fā)現(xiàn)服務(wù),通過注解標(biāo)注字段,即可使用,無需主動獲取
                // 2. 使用依賴查找的方式發(fā)現(xiàn)服務(wù),主動去發(fā)現(xiàn)服務(wù)并使用,下面兩種方式分別是byName和byType
                aRouterService.toast("第一種推薦的ARouter服務(wù)使用方式");
                break;
        }
    }
}

\color{red}{要跳轉(zhuǎn)的界面MainActivity的布局文件}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="不帶參數(shù)簡單跳轉(zhuǎn)" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="不帶參數(shù)帶動畫跳轉(zhuǎn)" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="帶基礎(chǔ)參數(shù)帶動畫跳轉(zhuǎn)" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="帶對象帶動畫跳轉(zhuǎn)" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="帶集合帶動畫跳轉(zhuǎn)" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳轉(zhuǎn)攔截" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="獲取Fragment對象" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ARouter服務(wù)" />

</LinearLayout>

\color{red}{要跳轉(zhuǎn)的界面TestActivity}

package com.zd.myarouterdemo;

import android.os.Bundle;
import android.text.TextUtils;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: TestActivity
 * @Description: 測試頁面
 * @Author: ljl
 * @CreateDate: 2019/9/3 11:22
 * @Version: 1.0
 */
@Route(path = AppConfig.TEST)
public class TestActivity extends AppCompatActivity {
    private TextView textShow, textShow1, textShow2;

    /**
     * 注解方式使用(盡量加上name),類型一定要對上不然也會獲取不到數(shù)據(jù),為null或者0
     */
    @Autowired(name = "index")
    int id;
    @Autowired(name = "name")
    String name;
    @Autowired(name = "num")
    long num;
    @Autowired(name = "bundle")
    Bundle bundleStr;
    @Autowired(name = "person")
    Person person;
    @Autowired(name = "personList")
    List<Person> personList;
    @Autowired(name = "map")
    Map map;
    @Autowired(name = "sp")
    String sp;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        textShow = (TextView) findViewById(R.id.tv_show);
        textShow1 = (TextView) findViewById(R.id.tv_show1);
        textShow2 = (TextView) findViewById(R.id.tv_show2);
        //2.注解方式(使用這種方式一定要注意加上ARouter.getInstance().inject(this)這句話,會獲取不到數(shù)據(jù)(int類型為0,String類型為null))
        ARouter.getInstance().inject(this);
        Toast.makeText(this, sp, Toast.LENGTH_SHORT).show();
        if (id != 0) {
            if (id == 1) {
                //獲取傳遞過來參數(shù)分為兩種(一種是原始的,另一種就是通過ARouter的注解方式)
                //1.原始方式
                Bundle bundle = getIntent().getExtras();
                //下面是獲取傳遞的Bundle數(shù)據(jù)(沒什么區(qū)別)
                Bundle bundle1 = getIntent().getBundleExtra("bundle");
                textShow.setText("基礎(chǔ)參數(shù)原始方式:序號:" + bundle1.getInt("index") + ",姓名:" + bundle.getString("name") + ",號碼:" + bundle.getLong("num"));
                textShow1.setText("基礎(chǔ)參數(shù)注解方式;序號:" + id + ",姓名:" + name + ",號碼:" + num + "bundle數(shù)據(jù)獲?。? + bundleStr.getString("name"));
            } else if (id == 2) {
                //這里獲取對象的時候一定要寫實(shí)現(xiàn)SerializationService的類(隨便寫不用調(diào)用就行,但是必須要有,不然或獲取不到,我這里有的JsonSerializationService類)
                textShow2.setText("對象參數(shù):" + person.toString());
            } else if (id == 3) {
                //這里獲取集合的時候一定要寫實(shí)現(xiàn)SerializationService的類(隨便寫不用調(diào)用就行,但是必須要有,不然或獲取不到,我這里有的JsonSerializationService類)
                textShow2.setText("集合參數(shù):" + personList.toString() + "==============map參數(shù):對象:" + map.get("person") + "集合:" + map.get("list"));
            }
        }
    }
}

\color{red}{TestActivity的布局文件}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:text="原始方式"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/tv_show1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:text="ARouter注解方式"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/tv_show2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:text="ARouter注解方式對象參數(shù)"
        android:textSize="14sp" />

</LinearLayout>

\color{red}{攜帶對象,結(jié)合,map跳轉(zhuǎn)時用到的解析JsonSerializationService}

package com.zd.myarouterdemo;

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.facade.service.SerializationService;
import com.alibaba.fastjson.JSON;

import java.lang.reflect.Type;

/**
 * @ClassName: JsonSerializationService
 * @Description: 跳轉(zhuǎn)界面帶參(傳遞Object)定義解析Obeject的SerializationService
 * @Author: ljl
 * @CreateDate: 2019/9/2 10:32
 * @Version: 1.0
 */
@Route(path = AppConfig.OBJECT_CUSTOM_JSON)
public class JsonSerializationService implements SerializationService {


    @Override
    public <T> T json2Object(String input, Class<T> clazz) {
        return JSON.parseObject(input, clazz);
    }

    @Override
    public String object2Json(Object instance) {
        return JSON.toJSONString(instance);
    }

    @Override
    public <T> T parseObject(String input, Type clazz) {
        return JSON.parseObject(input, clazz);
    }

    @Override
    public void init(Context context) {
    }
}

\color{red}{獲取ARouter的服務(wù)用到的ARouterServiceIProvider}

package com.zd.myarouterdemo;

import com.alibaba.android.arouter.facade.template.IProvider;

/**
 * @ClassName: ARouterServiceIProvider
 * @Description: ARouter服務(wù)使用
 * @Author: ljl
 * @CreateDate: 2019/9/3 17:05
 * @Version: 1.0
 */
public interface ARouterServiceIProvider extends IProvider {
    String toast(String msg);
}

\color{red}{獲取ARouter的服務(wù)用到的ARouterService}

package com.zd.myarouterdemo;

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Route;

/**
 * @ClassName: ARouterService
 * @Description: ARouterService
 * @CreateDate: 2019/9/3 16:59
 * @Version: 1.0
 */
@Route(path = AppConfig.SERVICE, name = "測試服務(wù)")
public class ARouterService implements ARouterServiceIProvider {
    @Override
    public String toast(String msg) {
        return "ARouter服務(wù)消息, " + msg;
    }

    @Override
    public void init(Context context) {

    }
}

\color{red}{界面跳轉(zhuǎn)時用的的攔截器}

package com.zd.myarouterdemo;

import android.content.Context;
import android.util.Log;

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.annotation.Interceptor;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;

/**
 * @ClassName: TestInterceptor
 * @Description: ARouter攔截器
 * // 比較經(jīng)典的應(yīng)用就是在跳轉(zhuǎn)過程中處理登陸事件,這樣就不需要在目標(biāo)頁重復(fù)做登陸檢查
 * // 攔截器會在跳轉(zhuǎn)之間執(zhí)行,多個攔截器會按優(yōu)先級順序依次執(zhí)行
 * @CreateDate: 2019/9/3 16:23
 * @Version: 1.0
 */
@Interceptor(priority = 1)
public class TestInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        String path = postcard.getPath();
        Log.e("路徑", path);
        if (path == AppConfig.TEST) {
            //如果是跳到TestActivity,就加個數(shù)據(jù),當(dāng)然也可以做其他操作
            postcard.withString("sp", "我是在攔截器中附加的參數(shù)");
        }

        //繼續(xù)跳轉(zhuǎn)
        callback.onContinue(postcard);

        //終止跳轉(zhuǎn)
        //callback.onInterrupt(null)

        //拋出異常
        // callback.onInterrupt(RuntimeException("我覺得有點(diǎn)異常"))

        // onContinue和onInterrupt至少需要調(diào)用其中一種,否則不會繼續(xù)路由
    }

    @Override
    public void init(Context context) {
        Log.e("TestInterceptor", "路由登錄攔截器初始化成功"); //只會走一次
    }
}

\color{red}{獲取fragment實(shí)例時用到的BlankFragment}

package com.zd.myarouterdemo;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.alibaba.android.arouter.facade.annotation.Route;


/**
 * fragment測試
 */
@Route(path = AppConfig.FRAGMENT)
public class BlankFragment extends Fragment {


    private OnFragmentInteractionListener mListener;

    public BlankFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }
}

\color{red}{AppConfig配置}

package com.zd.myarouterdemo;

/**
 * @ClassName: AppConfig
 * @Description: ARouter跳轉(zhuǎn)參數(shù)配置
 * @Author: ljl
 * @CreateDate: 2019/9/3 11:17
 * @Version: 1.0
 */
public class AppConfig {
    /**
     * 是否是測試模式(用于判斷是否開啟ARouter是否打印Log和openDebug)
     */
    public static boolean isDebug = true;

    /**
     * 這里用于統(tǒng)一管理跳轉(zhuǎn)注解路徑(這里要注意一定要至少兩級并且前面一定要有斜杠,不要忘記,不然不會出錯)
     * 1.前面缺少斜杠會出現(xiàn)錯誤,錯誤如下
     * Process: com.zd.myarouterdemo, PID: 12831
     * com.alibaba.android.arouter.exception.HandlerException: ARouter::Extract the default group failed, the path must be start with '/' and contain more than 2 '/'!
     * <p>
     * <p>
     * 2.如果注解路徑只有一級時,build會在編譯的時候直接報錯,錯誤如下
     * 錯誤: ARouter::Compiler An exception is encountered, [Failed to extract default group! String index out of range: -2]
     * 警告: ARouter::Compiler >>> Route meta verify error, group is  <<<
     * 注: ARouter::Compiler >>> Generated provider map, name is ARouter$$Providers$$app <<<
     * 注: ARouter::Compiler >>> Generated root, name is ARouter$$Root$$app <<<
     * 1 個錯誤
     * 1 個警告
     */
    public static final String TEST = "/app/TestActivity";
    public static final String FRAGMENT = "/app/BlankFragment";
    //傳值的時候?qū)ο髮?shí)體,集合,map使用
    public static final String OBJECT_CUSTOM_JSON = "/custom/json";
    //ARouter里的Service
    public static final String SERVICE = "/custom/service";

}

\color{red}{實(shí)體對象Person}

package com.zd.myarouterdemo;

import android.text.TextUtils;

/**
 * @ClassName: Person
 * @Description: java類作用描述
 * @CreateDate: 2019/9/3 14:24
 * @Version: 1.0
 */
public class Person {
    public String name;
    public String age;

    public Person() {
    }

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        if (TextUtils.isEmpty(name)) {
            return "";
        } else {
            return "name : " + name + "\n age : " + age;
        }
    }

}

\color{red}{MyApplication}

package com.zd.myarouterdemo;

import android.app.Application;
import android.content.Context;

import com.alibaba.android.arouter.launcher.ARouter;

/**
 * @ClassName: MyApplication
 * @Description: java類作用描述
 * @Author: ljl
 * @CreateDate: 2019/9/3 11:17
 * @Version: 1.0
 */
public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        //是否進(jìn)行ARouter調(diào)試
        if (AppConfig.isDebug) {
            //下面兩句話必須放到init前面,否則配置無效
            ARouter.openLog();  //打印ARouter日志
            ARouter.openDebug();  //開啟ARouter的調(diào)試模式(如果在InstantRun模式下運(yùn)行,必須開啟調(diào)試模式,線上版本需要關(guān)閉,否則有安全風(fēng)險),
        }
        //官方建議在Application里面進(jìn)行初始化(使用該注解路徑至少兩級)
        ARouter.init(this);
    }

    public static Context getContext() {
        return mContext;
    }
}

\color{red}{最后在寫的過程中遇到過找不到布局文件里的Id(問題:Cannot resolve symbol 'btn7'),但是編譯沒問題。}
解決方式:android studio報出一個提示,R類里出現(xiàn)了File size exceeds configured limit (2560000). Code insight features not available.
原因是Intellij IDEA對單個文件的大小默認(rèn)限制為2500kb, android studio是基于Intellij IDEA的,而Windows系統(tǒng)和OS X系統(tǒng)對文件大小的計算方式不一致,前者是1024進(jìn)制,后者是1000進(jìn)制,所以暫時OS X系統(tǒng)上沒有出現(xiàn)問題,后來將OS X 系統(tǒng)上的限制大小改小后,就出現(xiàn)一樣的問題。
進(jìn)入android studio的安裝目錄 ,將里面的idea.max.intellisense.filesize=2500數(shù)值更改為5000,重啟下Android studio就可以了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容