网页设计主要学什么内容,如何给网站做优化代码,用php做网站需要什么软件,个人注册网站一般做什么一、功能介绍
支持直接解析标准URL进行跳转#xff0c;并自动注入参数到目标页面中支持多模块工程使用支持添加多个拦截器#xff0c;自定义拦截顺序支持依赖注入#xff0c;可单独作为依赖注入框架使用支持InstantRun支持MultiDex(Google方案)映射关系按组分类、多级管理并自动注入参数到目标页面中支持多模块工程使用支持添加多个拦截器自定义拦截顺序支持依赖注入可单独作为依赖注入框架使用支持InstantRun支持MultiDex(Google方案)映射关系按组分类、多级管理按需初始化支持用户指定全局降级与局部降级策略页面、拦截器、服务等组件均自动注册到框架支持多种方式配置转场动画支持获取Fragment完全支持Kotlin以及混编(配置见文末 其他#5)支持第三方 App 加固(使用 arouter-register 实现自动注册)支持生成路由文档提供 IDE 插件便捷的关联路径和目标类支持增量编译(开启文档生成后无法增量编译)支持动态注册路由信息
二、典型应用
从外部URL映射到内部页面以及参数传递与解析跨模块页面跳转模块间解耦拦截跳转过程处理登陆、埋点等逻辑跨模块API调用通过控制反转来做组件解耦
三、基础功能 添加依赖和配置 android {defaultConfig {...javaCompileOptions {annotationProcessorOptions {arguments [AROUTER_MODULE_NAME: project.getName()]}}}
}dependencies {// 替换成最新版本, 需要注意的是api// 要与compiler匹配使用均使用最新版可以保证兼容compile com.alibaba:arouter-api:x.x.xannotationProcessor com.alibaba:arouter-compiler:x.x.x...
}
// 旧版本gradle插件( 2.2)可以使用apt插件配置方法见文末其他#4
// Kotlin配置参考文末其他#5添加注解 // 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级/xx/xx
Route(path /test/activity)
public class YourActivity extend Activity {...
}初始化SDK if (isDebug()) { // 这两行必须写在init之前否则这些配置在init过程中将无效ARouter.openLog(); // 打印日志ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行必须开启调试模式线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早推荐在Application中初始化发起路由操作 // 1. 应用内简单的跳转(通过URL跳转在进阶用法中)
ARouter.getInstance().build(/test/activity).navigation();// 2. 跳转并携带参数
ARouter.getInstance().build(/test/1).withLong(key1, 666L).withString(key3, 888).withObject(key4, new Test(Jack, Rose)).navigation();添加混淆规则(如果使用了Proguard) -keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}# 如果使用了 byType 的方式获取 Service需添加下面规则保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider# 如果使用了 单类注入即不定义接口实现 IProvider需添加下面规则保护实现
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider使用 Gradle 插件实现路由表的自动加载 (可选) apply plugin: com.alibaba.arouterbuildscript {repositories {mavenCentral()}dependencies {classpath com.alibaba:arouter-register:?}
}可选使用通过 ARouter 提供的注册插件进行路由表的自动加载(power by AutoRegister) 默认通过扫描 dex 的方式 进行加载通过 gradle 插件进行自动注册可以缩短初始化时间解决应用加固导致无法直接访问 dex 文件初始化失败的问题需要注意的是该插件必须搭配 api 1.3.0 以上版本使用 使用 IDE 插件导航到目标类 (可选) 在 Android Studio 插件市场中搜索 ARouter Helper, 或者直接下载文档上方 最新版本 中列出的 arouter-idea-plugin zip 安装包手动安装安装后 插件无任何设置可以在跳转代码的行首找到一个图标 () 点击该图标即可跳转到标识了代码中路径的目标类
四、进阶用法 通过URL跳转 // 新建一个Activity用于监听Scheme事件,之后直接把url传递给ARouter即可
public class SchemeFilterActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Uri uri getIntent().getData();ARouter.getInstance().build(uri).navigation();finish();}
}AndroidManifest.xml activity android:name.activity.SchemeFilterActivity!-- Scheme --intent-filterdataandroid:hostm.aliyun.comandroid:schemearouter/action android:nameandroid.intent.action.VIEW/category android:nameandroid.intent.category.DEFAULT/category android:nameandroid.intent.category.BROWSABLE//intent-filter
/activity解析参数 // 为每一个参数声明一个字段并使用 Autowired 标注
// URL中不能传递Parcelable类型数据通过ARouter api可以传递Parcelable对象
Route(path /test/activity)
public class Test1Activity extends Activity {Autowiredpublic String name;Autowiredint age;// 通过name来映射URL中的不同参数Autowired(name girl) boolean boy;// 支持解析自定义对象URL中使用json传递AutowiredTestObj obj; // 使用 withObject 传递 List 和 Map 的实现了// Serializable 接口的实现类(ArrayList/HashMap)// 的时候接收该对象的地方不能标注具体的实现类类型// 应仅标注为 List 或 Map否则会影响序列化中类型// 的判断, 其他类似情况需要同样处理 AutowiredListTestObj list;AutowiredMapString, ListTestObj map;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ARouter.getInstance().inject(this);// ARouter会自动对字段进行赋值无需主动获取Log.d(param, name age boy);}
}// 如果需要传递自定义对象新建一个类并非自定义对象类然后实现 SerializationService,并使用Route注解标注(方便用户自行选择序列化方式)例如
Route(path /yourservicegroupname/json)
public class JsonServiceImpl implements SerializationService {Overridepublic void init(Context context) {}Overridepublic T T json2Object(String text, ClassT clazz) {return JSON.parseObject(text, clazz);}Overridepublic String object2Json(Object instance) {return JSON.toJSONString(instance);}
}声明拦截器(拦截跳转过程面向切面编程) // 比较经典的应用就是在跳转过程中处理登陆事件这样就不需要在目标页重复做登陆检查
// 拦截器会在跳转之间执行多个拦截器会按优先级顺序依次执行
Interceptor(priority 8, name 测试用拦截器)
public class TestInterceptor implements IInterceptor {Overridepublic void process(Postcard postcard, InterceptorCallback callback) {...callback.onContinue(postcard); // 处理完成交还控制权// callback.onInterrupt(new RuntimeException(我觉得有点异常)); // 觉得有问题中断路由流程// 以上两种至少需要调用其中一种否则不会继续路由}Overridepublic void init(Context context) {// 拦截器的初始化会在sdk初始化的时候调用该方法仅会调用一次}
}处理跳转结果 // 使用两个参数的navigation方法可以获取单次跳转的结果
ARouter.getInstance().build(/test/1).navigation(this, new NavigationCallback() {Overridepublic void onFound(Postcard postcard) {...}Overridepublic void onLost(Postcard postcard) {...}
});自定义全局降级策略 // 实现DegradeService接口并加上一个Path内容任意的注解即可
Route(path /xxx/xxx)
public class DegradeServiceImpl implements DegradeService {
Override
public void onLost(Context context, Postcard postcard) {// do something.
}Override
public void init(Context context) {}
}为目标页面声明更多信息 // 我们经常需要在目标页面中配置一些属性比方说是否需要登陆之类的
// 可以通过 Route 注解中的 extras 属性进行扩展这个属性是一个 int值换句话说单个int有4字节也就是32位可以配置32个开关
// 剩下的可以自行发挥通过字节操作可以标识32个开关通过开关标记目标页面的一些属性在拦截器中可以拿到这个标记进行业务逻辑判断
Route(path /test/activity, extras Consts.XXXX)通过依赖注入解耦:服务管理(一) 暴露服务 // 声明接口,其他组件通过接口来调用服务
public interface HelloService extends IProvider {String sayHello(String name);
}// 实现接口
Route(path /yourservicegroupname/hello, name 测试服务)
public class HelloServiceImpl implements HelloService {Overridepublic String sayHello(String name) {return hello, name;}Overridepublic void init(Context context) {}
}通过依赖注入解耦:服务管理(二) 发现服务 public class Test {AutowiredHelloService helloService;Autowired(name /yourservicegroupname/hello)HelloService helloService2;HelloService helloService3;HelloService helloService4;public Test() {ARouter.getInstance().inject(this);}public void testService() {// 1. (推荐)使用依赖注入的方式发现服务,通过注解标注字段,即可使用无需主动获取// Autowired注解中标注name之后将会使用byName的方式注入对应的字段不设置name属性会默认使用byType的方式发现服务(当同一接口有多个实现的时候必须使用byName的方式发现服务)helloService.sayHello(Vergil);helloService2.sayHello(Vergil);// 2. 使用依赖查找的方式发现服务主动去发现服务并使用下面两种方式分别是byName和byTypehelloService3 ARouter.getInstance().navigation(HelloService.class);helloService4 (HelloService) ARouter.getInstance().build(/yourservicegroupname/hello).navigation();helloService3.sayHello(Vergil);helloService4.sayHello(Vergil);}
}预处理服务 // 实现 PretreatmentService 接口并加上一个Path内容任意的注解即可
Route(path /xxx/xxx)
public class PretreatmentServiceImpl implements PretreatmentService {Overridepublic boolean onPretreatment(Context context, Postcard postcard) {// 跳转前预处理如果需要自行处理跳转该方法返回 false 即可}Overridepublic void init(Context context) {}
}动态注册路由信息 适用于部分插件化架构的App以及需要动态注册路由信息的场景可以通过 ARouter 提供的接口实现动态注册 路由信息目标页面和服务可以不标注 Route 注解注意同一批次仅允许相同 group 的路由信息注册 ARouter.getInstance().addRouteGroup(new IRouteGroup() {Overridepublic void loadInto(MapString, RouteMeta atlas) {atlas.put(/dynamic/activity, // pathRouteMeta.build(RouteType.ACTIVITY, // 路由信息TestDynamicActivity.class, // 目标的 Class/dynamic/activity, // Pathdynamic, // Group, 尽量保持和 path 的第一段相同0, // 优先级暂未使用0 // Extra用于给页面打标));}});五、更多功能 初始化中的其他设置 ARouter.openLog(); // 开启日志
ARouter.openDebug(); // 使用InstantRun的时候需要打开该开关上线之后关闭否则有安全风险
ARouter.printStackTrace(); // 打印日志的时候打印线程堆栈详细的API说明 // 构建标准的路由请求
ARouter.getInstance().build(/home/main).navigation();// 构建标准的路由请求并指定分组
ARouter.getInstance().build(/home/main, ap).navigation();// 构建标准的路由请求通过Uri直接解析
Uri uri;
ARouter.getInstance().build(uri).navigation();// 构建标准的路由请求startActivityForResult
// navigation的第一个参数必须是Activity第二个参数则是RequestCode
ARouter.getInstance().build(/home/main, ap).navigation(this, 5);// 直接传递Bundle
Bundle params new Bundle();
ARouter.getInstance().build(/home/main).with(params).navigation();// 指定Flag
ARouter.getInstance().build(/home/main).withFlags();.navigation();// 获取Fragment
Fragment fragment (Fragment) ARouter.getInstance().build(/test/fragment).navigation();// 对象传递
ARouter.getInstance().withObject(key, new TestObj(Jack, Rose)).navigation();// 觉得接口不够多可以直接拿出Bundle赋值
ARouter.getInstance().build(/home/main).getExtra();// 转场动画(常规方式)
ARouter.getInstance().build(/test/activity2).withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom).navigation(this);// 转场动画(API16)
ActivityOptionsCompat compat ActivityOptionsCompat.makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);// ps. makeSceneTransitionAnimation 使用共享元素的时候需要在navigation方法中传入当前ActivityARouter.getInstance().build(/test/activity2).withOptionsCompat(compat).navigation();// 使用绿色通道(跳过所有的拦截器)
ARouter.getInstance().build(/home/main).greenChannel().navigation();// 使用自己的日志工具打印日志
ARouter.setLogger();// 使用自己提供的线程池
ARouter.setExecutor();获取原始的URI String uriStr getIntent().getStringExtra(ARouter.RAW_URI);重写跳转URL // 实现PathReplaceService接口并加上一个Path内容任意的注解即可
Route(path /xxx/xxx) // 必须标明注解
public class PathReplaceServiceImpl implements PathReplaceService {/*** For normal path.** param path raw path*/String forString(String path) {return path; // 按照一定的规则处理之后返回处理后的结果}/*** For uri type.** param uri raw uri*/
Uri forUri(Uri uri) {return url; // 按照一定的规则处理之后返回处理后的结果
}
}生成路由文档 // 更新 build.gradle, 添加参数 AROUTER_GENERATE_DOC enable
// 生成的文档路径 : build/generated/source/apt/(debug or release)/com/alibaba/android/arouter/docs/arouter-map-of-${moduleName}.json
android {defaultConfig {...javaCompileOptions {annotationProcessorOptions {arguments [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: enable]}}}
}六、其他 路由中的分组概念 SDK中针对所有的路径(/test/1 /test/2)进行分组分组只有在分组中的某一个路径第一次被访问的时候该分组才会被初始化可以通过 Route 注解主动指定分组否则使用路径中第一段字符串(/*/)作为分组注意一旦主动指定分组之后应用内路由需要使用 ARouter.getInstance().build(path, group) 进行跳转手动指定分组否则无法找到 Route(path /test/1, group app)拦截器和服务的异同 拦截器和服务所需要实现的接口不同但是结构类似都存在 init(Context context) 方法但是两者的调用时机不同拦截器因为其特殊性会被任何一次路由所触发拦截器会在ARouter初始化的时候异步初始化如果第一次路由的时候拦截器还没有初始化结束路由会等待直到初始化完成。服务没有该限制某一服务可能在App整个生命周期中都不会用到所以服务只有被调用的时候才会触发初始化操作 旧版本gradle插件的配置方式 apply plugin: com.neenbedankt.android-aptbuildscript {repositories {mavenCentral()}dependencies {classpath com.neenbedankt.gradle.plugins:android-apt:1.4}
}apt {arguments {AROUTER_MODULE_NAME project.getName();}
}dependencies {compile com.alibaba:arouter-api:x.x.xapt com.alibaba:arouter-compiler:x.x.x...
}Kotlin项目中的配置方式 // 可以参考 module-kotlin 模块中的写法
apply plugin: kotlin-kaptkapt {arguments {arg(AROUTER_MODULE_NAME, project.getName())}
}dependencies {compile com.alibaba:arouter-api:x.x.xkapt com.alibaba:arouter-compiler:x.x.x...
} 文章转载自: http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.fxpyt.cn.gov.cn.fxpyt.cn http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.rykn.cn.gov.cn.rykn.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.lwcgh.cn.gov.cn.lwcgh.cn http://www.morning.nflpk.cn.gov.cn.nflpk.cn http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn http://www.morning.zlchy.cn.gov.cn.zlchy.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.ycwym.cn.gov.cn.ycwym.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.ysbrz.cn.gov.cn.ysbrz.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.vuref.cn.gov.cn.vuref.cn http://www.morning.snbq.cn.gov.cn.snbq.cn http://www.morning.yrddl.cn.gov.cn.yrddl.cn http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn http://www.morning.cwtrl.cn.gov.cn.cwtrl.cn http://www.morning.fxzgw.com.gov.cn.fxzgw.com http://www.morning.ltkzb.cn.gov.cn.ltkzb.cn http://www.morning.sfsjh.cn.gov.cn.sfsjh.cn http://www.morning.nwwzc.cn.gov.cn.nwwzc.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn http://www.morning.kphsp.cn.gov.cn.kphsp.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.yqzyp.cn.gov.cn.yqzyp.cn http://www.morning.qzmnr.cn.gov.cn.qzmnr.cn http://www.morning.lcqrf.cn.gov.cn.lcqrf.cn http://www.morning.wqfzx.cn.gov.cn.wqfzx.cn http://www.morning.mmxnb.cn.gov.cn.mmxnb.cn http://www.morning.hxycm.cn.gov.cn.hxycm.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.clccg.cn.gov.cn.clccg.cn http://www.morning.lwlnw.cn.gov.cn.lwlnw.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.kjyhh.cn.gov.cn.kjyhh.cn http://www.morning.ftnhr.cn.gov.cn.ftnhr.cn http://www.morning.zlfxp.cn.gov.cn.zlfxp.cn http://www.morning.ylklr.cn.gov.cn.ylklr.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.ssjtr.cn.gov.cn.ssjtr.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.ckdgj.cn.gov.cn.ckdgj.cn http://www.morning.ljdd.cn.gov.cn.ljdd.cn http://www.morning.krklj.cn.gov.cn.krklj.cn http://www.morning.kxnjg.cn.gov.cn.kxnjg.cn http://www.morning.lnsnyc.com.gov.cn.lnsnyc.com http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn http://www.morning.dyrzm.cn.gov.cn.dyrzm.cn http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.ylqpp.cn.gov.cn.ylqpp.cn http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.xlclj.cn.gov.cn.xlclj.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.mhcft.cn.gov.cn.mhcft.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.mtsgx.cn.gov.cn.mtsgx.cn http://www.morning.rfbt.cn.gov.cn.rfbt.cn http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn