Skip to content

HT Universal Router是一种基于注解的Android页面管理框架,通过URL进行页面跳转管理,同时可以设置进入及退出动画,并提供页面降级及跳转拦截和重定向功能。

License

NEYouFan/ht-universalrouter-android

Repository files navigation

HT Universal Router页面管理框架

HT Universal Router是一种基于注解的Android页面管理框架,通过URL进行页面跳转管理,同时可以设置进入及退出动画,并提供页面降级及跳转拦截和重定向功能。

基本功能

  • 通过URL进行Activity之间跳转
  • 参数传递 (复杂类型参数传递)
  • 进入退出动画资源自定义
  • 页面降级 (注: 降级指的是Native无法匹配的URL可以转为通过Webview处理)
  • Webview跳转Native识别
  • URL中参数自动转化Intent参数
  • 支持startActivitystartActivityForResult
  • URLActivity多对一映射
  • 支持Debug模式,日志输出
  • 支持适配Android M DeepLink
  • 支持全局跳转数据,处理每次跳转监听 用户打点统计等功能
  • 支持自定义WebActivity接收URLKEY

用法

AndroidManifest.xml

添加权限:

<uses-permission android:name="android.permission.INTERNET"/>

注册HTRouterActivity,根据实际修改data标签中的信息

<activity android:name="com.netease.hearttouch.router.HTRouterActivity">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 为了支持android M -->
        <data android:host="www.kaola.com/" android:scheme="https" />
        <data android:host="www.kaola.com/" android:scheme="http" />
        <!-- 为了支持外部应用或者外部浏览器跳转本应用 -->
        <data android:host="www.kaola.com" android:scheme="kaola" />
    </intent-filter>
</activity>

相应的降级WebActivity,定义示例见后文。

<activity
    android:name=".WebActivity"
    android:label="@string/title_activity_web"
    android:theme="@style/AppTheme.NoActionBar"/>

初始化

ApplicationonCreate()中添加如下信息,其中HTRouterActivityHTLogUtilHTRouterManagerHTRouterHandlerHTRouterHandlerParams编译后会自动生成(注:仅当有页面使用@HTRouter注解时,以上代码才会生成)。

  • 降级页面接收的URLkey
  • 注册降级页面相应的WebviewActivity;
  • 是否开启debug模式
  • 每次跳转的监听,可以进行自定义处理,包括跳转的拦截和重定义等,可以作为拦截器使用,通过返回true来阻止本管理框架进行跳转,通过修改HTRouterHandlerParams中的内容来修改跳转的目标。
HTRouterManager.init();
//注册绑定默认的降级页面
StringcustomUrlKey = "customUrlKey"; //HTWebActivity接收参数key
HTRouterManager.registerWebActivity(WebActivity.class, customUrlKey);
//开启Debug模式,输出相应日志
HTRouterManager.setDebugMode(true);
HTRouterManager.setHtRouterHandler(new HTRouterHandler() {
    @Override
    public boolean handleRoute(Context context, HTRouterHandlerParams routerParams) {
       HTLogUtil.d("统计数据:" + context.getClass().getSimpleName() + "-->跳转url-->" + routerParams.url + "  参数intent" + routerParams.sourceIntent);
       //如果需要拦截或者改变跳转的目标可以直接改变url或者sourceIntent
       routerParams.url = "http://www.kaola.com/pay";
       //如果返回true则表示由监听中进行处理,不需要HTRouter负责跳转
       return false;
    }
    });
        

注解使用

@HTRouter 字段支持Activity类注解:

例如:

@HTRouter(url = {"http://www.kaola.com/pay"},entryAnim = R.anim.enter,exitAnim = R.anim.exit)

页面跳转方法

  1. 使用HTRouterManager.startActivity()接口

    • activity: 当前页面的activity
    • url: 跳转的目标URL
    • sourceIntent: 传递进来一个intent,用于传递用户数据及启动模式等扩展
    • isFinish: 跳转后是否需要关闭当前页面

    例如HTRouterManager.startActivity(this, "http://www.kaola.com/pay", null, false);

  2. 还提供HTRouterManager.startActivityForResult(),参数与HTRouterManager.startActivity()相同,回调发生在Activity中。

  3. 由于FragmentstartActivityForResult()的回调可以选择发生在Fragment或者Fragment所处的Activity中(通常直接调用startActivityForResult()发生在fragment中,而通过getActivity().startActivityForResult()则发生在Activity中),故另外提供HTRouterManager.startActivityForResult(Fragment fragment, String url, Intent sourceIntent, boolean isFinish)接口,该方法只有第一个参数不同。

参数获取

除了在页面跳转的sourceIntent中传入的自定义类型参数外,本框架还实现URL中参数字段的自动解析,解析后保存在HashMap中序列化后放在跳转的Intent参数中。用户可以用如下方式获取,需要进行强制类型转换:

Intent intent = getIntent();
HashMap<String, String> urlParamsMap = (HashMap<String, String>)intent.getSerializableExtra(HTRouterManager.HT_URL_PARAMS_KEY);

降级及升级WebActivity示例

  • 降级WebActivityNative处理不了的转Webview,只需要接收url参数后loadUrl一下。

    public class WebActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Intent intent = getIntent();
            String url = intent.getStringExtra("customUrlKey");
            WebView webView = new WebView(this);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setUseWideViewPort(true);
            webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
            webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
            webView.getSettings().setLoadWithOverviewMode(true);
            String targetUrl = HTRouterManager.getHttpSchemaHostAndPath(url);
            HTLogUtil.d("打开链接=" + targetUrl);
            webView.loadUrl(targetUrl);
            setContentView(webView);
        }
    }
    
  • 升级WebActivitywebview中的url先交给native处理,需要重载shouldOverrideUrlLoading(),处理webview中的url

    public class WebActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //...
            //一些初始化...
            webView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    Log.i("HT", "重新加载=" + url);
                    HTRouterEntry entity = HTRouterManager.findRouterEntryByUrl(url);
                    //为了防止匹配不上后循环跳,这里需要有个判断
                    if (entity != null) {
                        //匹配上之后
                        HTRouterManager.startActivity(WebActivity.this, url, null, false);
                        return true;
                    }
                    return super.shouldOverrideUrlLoading(view, url);
                }
            });
            //...
            //一些后续操作
        }
    }
    

进阶使用

本框架可以注册HTRouterHandler,进行跳转拦截或记录等处理,实现该接口并通过HTRouterManager.setHtRouterHandler()注册。返回值true代表拦截处理,则本框架不会进行后续的处理。返回false代表还需要本框架进行进一步跳转处理,同时可以修改routerParams中的urlsourceIntent来达到动态控制跳转的重定向。

public interface HTRouterHandler {
  boolean handleRoute(Context context, HTRouterHandlerParams routerParams);
}

集成

Gradle

appbuild.grade中添加

apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.netease.hearttouch:ht-universalrouter-dispatch:0.1.0'
    apt 'com.netease.hearttouch:ht-universalrouter-dispatch-process:0.1.0'
}

projectbuild.gradledependencies下面添加

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

maven

<dependencies>
  <dependency>
    <groupId>com.netease.hearttouch</groupId>
    <artifactId>ht-universalrouter-dispatch</artifactId>
    <version>0.1.0</version>
  </dependency>
  <dependency>
    <groupId>com.netease.hearttouch</groupId>
    <artifactId>ht-universalrouter-dispatch-process</artifactId>
    <version>0.1.0</version>
    <optional>true</optional>
  </dependency>
</dependencies>

代码混淆

如果要使用混淆,在引用工程的proguard文件中,添加如下代码:

-keep class com.netease.hearttouch.router.** { *; }

许可证

HT Universal Router 使用 MIT 许可证,详情见 LICENSE 文件。

About

HT Universal Router是一种基于注解的Android页面管理框架,通过URL进行页面跳转管理,同时可以设置进入及退出动画,并提供页面降级及跳转拦截和重定向功能。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages