[Android常见问题] 自定义授权界面

2023-11-03

自定义授权界面
http://bbs.mob.com/thread-278-1-1.html

(出处: http://bbs.mob.com/)

本帖最后由 wolf 于 2016-5-6 10:30 编辑

自定义授权界面
 
1、准备工作

参考文档,在你的项目里面创建一个类,叫做MyAuthPageAdapter(或者其他你喜欢的名字),让这个类继承自“cn.sharesdk.framework.authorize.AuthorizeAdapter”,然后将这个类的完整路径(也就是包名+类名)注册到AndroidManifest.xml的ShareSDKUIShell这个Activity下。另外一些开发者虽然正确地编写和注册了这个AuthorizeAdapter,却忘记在混淆的时候keep这个类,导致这个类被改名甚至丢失。  

  1. <activity
  2.        android:name="com.mob.tools.MobUIShell"
  3.        android:theme="@android:style/Theme.Translucent.NoTitleBar"
  4.        android:configChanges="keyboardHidden|orientation|screenSize"
  5.        android:windowSoftInputMode="stateHidden|adjustResize" >
  6.        <!-- 
  7.               AuthorizeAdapter表示一个继承自cn.sharesdk.framework.authorize.AuthorizeAdapter
  8.               的类,这个类可以监听到页面的生命周期,也可以获取授权页面的各种UI控件。 
  9.               开发者可以通过继承AuthorizeAdapter,重写其方法,并获取各种UI来自定义这个页面的行为。
  10.         -->        
  11.        <meta-data android:name="AuthorizeAdapter" android:value="cn.sharesdk.demo.MyAuthPageAdapter" />
  12. </activity>
复制代码

说明文档介绍了这个类的配置、各种和生命周期相关的方法的名称等等,虽然举了例子,但是很简单。不过Sample里面有一个很丰富的例子,而AuthorizeAdapter的JavaDoc也有对其public方法的定义说明,这些都建议看一下。下面对常见的一些问题做一下解释:

2、如何隐藏logo

授权页面其实没有那么复杂。虽然Share SDK的所有ui都依赖于ShareSDKUIShell,但是其实它只是提供一个外壳,其业务由具体的FakeActivity实现。Web授权的业务由FakeActivity的子类WebAuthorizeActivity实现,而这个类中有三个主要的成员AuthorizeAdapter、RegisterView和AuthorizeListener。其中的RegisterView和AuthorizeListener并不对外暴露,分辨用于表示授权页面的View,和授权操作的回调。因此自定义授权页面的操作,就是依赖WebAuthorizeActivity的生命周期,修改RegisterView的过程。

然后仔细看一下RegisterView。它是LinearLayout的子类,分为两部分——标题栏(TitleLayout)和页面主体(RelativeLayout)。TitleLayout也是LinearLayout的子类,它在授权页面的时候包含5个子View,第一个表示返回按钮,第二个是按钮后面分割线,第三个是标题栏上的文字,第四、第五个隐藏,你可以在快捷分享的EditPage里面看到它们,在右上角,最后的是Share SDK的logo。删除logo就是让这个view不可视,不过具体的代码下面再说,继续介绍页面主体。

页面主体是一个RelativeLayout,里面直接包含一个LinearLayout,之所以使用RelativeLayout,是为了后续自定义的扩展性更高,如果只有一个单纯的LinearLayout,开发者甚至不能在页面上摆多一个“悬浮”按钮。页面主体只有两部分,上面是一个View,其实是页面加载的进度条(一条蓝色的小条),然后绝大部分的面积被一个WebView覆盖,用来显示授权页面。有些开发者问“授权页面的样式能不能修改”。我不清楚他的“样式”是指什么,如果是控件的布局或者显示效果,答案是“可以”,如果是改变WebView里面的布局,答案是“不行”,因为这是个网页,是目标平台提供的页面。

说了这么多,怎么去除logo呢——看上去似乎很碍眼。代码是这样子的:

  1. public class MyAuthPageAdapter extends AuthorizeAdapter {
  2.          public void onCreate() {
  3.                    hideShareSDKLogo();
  4.          }
  5. }
复制代码

这段代码可以在Sample的MyAdapter中找到。这个方法2.0以前并不存在,因为那时候使用的是另外的代码:

  1. public class MyAuthPageAdapter extends AuthorizeAdapter {
  2.          public void onCreate() {
  3.                    TitleLayout llTitle = getTitleLayout();
  4.                     int count = llTitle.getChildCount();
  5.                     llTitle.getChildAt(count - 1).setVisibility(View.GONE);
  6.          }
  7. }
复制代码

这两种办法是等价的。

3、如何去掉启动动画

有些开发者不喜欢授权页面的弹出动画,希望去掉,具体的代码是这样子的:

  1. public class MyAuthPageAdapter extends AuthorizeAdapter {
  2.          public void onCreate() {
  3.                    disablePopUpAnimation();
  4.       }
  5. }
复制代码

这行代码也在Sample的MyAdapter中。

4、如何修改标题栏

很少有开发者需要修改标题栏上除了Logo以外的内容,不过前段时间确实有开发者问过,他想居中显示文字,而且想修改“返回按钮”的图片等等。那么现在回头看上面RegisterView的结构图。TitleLayout你可以从方法getTitleLayout()中获得,得到以后你可以修改它的背景、高度,甚至可视性。而修改返回按钮,你应该参考TitleLayout的JavaDoc,你会找到一个方法getBtnBack(),这个方法返回一个ImageView,就是返回按钮。通过setImageResource()方法可以修改其图标。至于如果你想去掉返回按钮后面的分割线,会麻烦一点,用下面的代码:

  1. public class MyAuthPageAdapter extends AuthorizeAdapter {
  2.          public void onCreate() {
  3.                    TitleLayout llTitle = getTitleLayout();
  4.                     llTitle.getChildAt(1).setVisibility(View.GONE);
  5.           }
  6. }
复制代码

为啥是“1”,参考上面的图片你就明白了。

然后是文字,同样有一个方法getTvTitle(),这个方法会返回标题栏的文字的控件。通过修改这个控件的各种属性,可以修改标题栏的样式。至于如何居中文字,其实这个TextView是设置比重为1的,因此它自动占满父容器。所以你只需要setGravity(Gravity.CENTER)就行了。但是这样子运行以后可能看上去不是很居中,那是因为返回按钮还有宽度。因此这个时候你还需要调用setPadding(0, 0, dp_48, 0);其中的dp_48表示“48dp”,是返回按钮的狂赌,其实你还可以更精确设置为“50dp”,因为分割线的宽度是“2dp”。

5、如何自定义动画

动画有利于页面加载,授权页面自己是有弹出动画的,但是如果你想设置自己的动画,该怎么做呢?先来看一下授权页面默认动画的设置代码:

  1. adapter.onCreate();
  2. if (adapter != null && !adapter.isPopUpAnimationDisable()) {
  3.        ScaleAnimation anim = new ScaleAnimation(0, 1, 0, 1,
  4.                 Animation.RELATIVE_TO_SELF, 0.5f,
  5.                 Animation.RELATIVE_TO_SELF, 0.5f);
  6.         anim.setDuration(550);
  7.         anim.setInterpolator(new PopUpInterpolator());
  8.         rv.setAnimation(anim);
  9. }
  10. activity.setContentView(rv);
复制代码

这段代码来自WebAuthorizeActivity的onCreate方法,其中的adapter是AuthorizeAdapter,rv是授权页面的最外层容器,授权页面的动画就是在这个View上面。

先解释一下这几行代码吧。adapter的onCreate会先调用,所以开发者可以在adapter的onCreate方法中对ui作显示前的最后修改。此后如果adapter里面被调用了disablePopUpAnimation方法,则跳过rv的动画设置,否则为rv设置一个ScaleAnimation,这个动画的时长是500毫秒,相对于中心缩放,缩放的规则由PopUpInterpolator控制(其内部是一个float数组而已)。然后就为ShareSDKUIShell设置View了。

开发者如果想自定义动画,需要做三件事情:禁用默认动画、获取授权页面顶级容器rv、为rv设置自己的动画。下面用Sample中的代码演示:
  1. public class MyAuthPageAdapter extends AuthorizeAdapter {
  2.          public void onCreate() {
  3.                    disablePopUpAnimation();
  4.                     View rv = (View) getBodyView().getParent();
  5.              TranslateAnimation ta = new TranslateAnimation(
  6.              Animation.RELATIVE_TO_SELF, -1,
  7.              Animation.RELATIVE_TO_SELF, 0, 
  8.              Animation.RELATIVE_TO_SELF, 0,
  9.              Animation.RELATIVE_TO_SELF, 0);
  10.              ta.setDuration(500);
  11.              rv.setAnimation(ta);
  12.          }
  13. }
复制代码

上面的代码第一句是禁用默认动画,然后就获取rv,创建一个滑动的动画,使页面从左往右滑入,动画时长500毫秒,然后为rv设置动画。

你无需为rv启动动画,因为当rv被加载到activity中的时候,rv的动画就会被执行了。

6、如何自定义监听

很多开发者想自定义授权页面,但是他们只是知道复制Sample的MyAdapter,却不知道该怎么改,然后发现授权没有回调,于是过来问技术支持,技术支持同时要和好几个人处理问题,因此有时比较奇葩的问题又会转给我。然后我开始的时候也被蒙住,知道我看到他MaAdapter中空荡荡onComplete方法,才恍然大悟。

不要随便复制你看不懂的代码吧!

Sample中有“授权并关注Share SDK官方微博”的需求,因此我添加了这些事件监听,你的应用如果不需要(大部分应用不需要),或者说你的Adapter只是为了删除以下Logo(超过九成的开发者只为这个目的),那就老实新建一个Adapter,然后在onCreate里面调用一句代码删除之就好了,复制粘贴也没有快到什么地方,而且还有大把你看不懂的代码,最后你删删减减,删掉了重要的步骤,授权成功了,你却得不到回调,更别说后续的分享了。

那如果真的需要“授权以后OOXX”呢,比方说“授权以后发一条分享”(好诡异的需求,不是一般是“授权以后关注官方微博”吗),有什么办法呢?那你需要好好阅读Sample里面MyAdapter的代码了。从Share SDK的框架出发,只要编码正确,你可以在任何地方拦截Share SDK的操作回调。MyAdapter就是一个例子,为了演示“授权以后关注官方微博”的功能,它拦截了授权的事件。来看看拦截的代码吧:

  1. private void interceptPlatformActionListener(String platName) {
  2.     Platform plat = ShareSDK.getPlatform(getActivity(), platName);
  3.        // 备份此前设置的事件监听器
  4.        backListener = plat.getPlatformActionListener();
  5.        // 设置新的监听器,实现事件拦截
  6.        plat.setPlatformActionListener(this);
  7. }
复制代码

[/table]backListener是PlatformActionListener,MyAdapter的一个全局变量,它保存的是开发者调用share、authorize或者其他操作前传递进来的回调。保存起来,先不要让它接收到授权结果,然后重新设置一个新的回调——MyAdapter自己。于是将来(网页)授权的结果会优先给MyAdapter,你就可以在MyAdapter的onComplete方法中做各种事情了。看看MyAdapter的做法:

  1. public void onComplete(Platform plat, int action, HashMap<String, Object> res) {
  2.          if (action == Platform.ACTION_FOLLOWING_USER) {
  3.                   // 当作授权以后不做任何事情
  4.                   plat.setPlatformActionListener(backListener);
  5.                   if (backListener != null) {
  6.                           backListener.onComplete(plat, Platform.ACTION_AUTHORIZING, null);
  7.                   }
  8.          }else if (ctvFollow.isChecked()) {
  9.                    // 授权成功,执行关注
  10.                   String account = MainAdapter.SDK_SINAWEIBO_UID;
  11.                   if (TencentWeibo.NAME.equals(plat.getName())) {
  12.                            account = MainAdapter.SDK_TENCENTWEIBO_UID;
  13.                   }
  14.                  plat.followFriend(account);
  15.           }else {
  16.                    // 如果没有标记为“授权并关注”则直接返回
  17.                    plat.setPlatformActionListener(backListener);
  18.                    if (backListener != null) {
  19.                           // 关注成功也只是当作授权成功返回
  20.                            backListener.onComplete(plat, Platform.ACTION_AUTHORIZING, null);
  21.                   }
  22.         }
  23. }
复制代码

这里面过滤两个事件:授权和关注。为什么是两个,因为这个是自定义授权的工具,本来就只有授权的操作会来这里,至于另外的关注,因为我授权结束以后要处理关注。那么我们先看授权的代码(从“else if (ctvFollow.isChecked())”开始)。

首先需要判断用户是否勾选了页面底部的checkbox,这个cb是默认勾选的,但是不能阻止用户取消它。如果勾选了,就代表授权后要关注,因此通过平台名称判断具体应该关注的帐号是什么,执行一个followFriend的操作。这里的代码其实看上去平淡无华,但是如果用户没有勾选,则需要立刻返回授权的结果给外面的代码。但是由于此前我们已经拦截了回调,因此这里需要重新设置回调,设置也很容易,调用原始回调的onComplete方法就行了。

对于已经勾选关注,并且执行了关注的操作,需要等待此关注的结果,错误和取消的回调这里就略过了,你可以看源码,我们看回成功的情况。成功时不能返回“关注成功”,而应该返回“授权成功”,因为关注是附带的操作。和上面说的一样,重置操作回调,然后调用方法给结果,此时需要注意的是外层的onComplete参数action是关注事件,你不能将它传递个backListener,你只能传递Platform.ACTION_AUTHORIZING,表示授权操作。

我觉得大部分有“授权后OOXX”需求的,都是关注而已,但是如果你有其他的需求,那就模仿着改吧。但是如果我强烈建议你不懂就不要复制粘贴!

7、总结

有不少开发者过来当头就问:你们的授权页面可以修改吗——亲,整个页面都可以修改,只是看你懂不懂修改而已。在写这帖子之前我一般建议开发者先看文档,因为文档会告诉你怎么写一个AuthAdapter,然后写代码获取某一个控件,不管是标题栏也还是页面主体,之后运行并断点看看这个控件。在android的ui框架下,从页面中的任意个View出发,你都可以抓到页面的所有View会来,因为View都会保存自己的Children和Parent,从自己的parent一直往上追溯,就可以到达顶层的PhoneView,但是一般不需要到那里(除非你要Activity嵌套——这是一种蹩脚的技术,不要用),但原理都是一样的。不过现在有了这个帖子,有了前面的图片,你应该可以比较清晰知道页面的组成。Share SDK并不会保留任何对这个页面的控制,你可以对它做任何你喜欢的修改,只要别不小心破坏了授权的逻辑就行了。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Android常见问题] 自定义授权界面 的相关文章

  • 【总结】【C++11】禁止拷贝新方法与相关知识点

    原理 依据 https isocpp github io CppCoreGuidelines CppCoreGuidelines Rc copy virtual C 67 A polymorphic class should suppres
  • Qt入门-下拉列表框QComboBox类

    QComboBox是QT GUI中的下拉列表框 class Q GUI EXPORT QComboBox public QWidget Q OBJECT 常用方法和属性 1 addItems void addItems const QStr
  • JavaWeb学习-02(response和request)

    JavaWeb学习 02 response和request 一 request对象 1 HttpServletRequest是ServletRequest的子接口 request对象用于接收客户端传递过来的请求内容 通过该对象的各种方法来获
  • weak_ptr 智能指针的使用

    目录 一 weak ptr 变量的定义 二 expired 成员函数 三 lock 成员函数 四 use count 成员函数 五 为什么要用 weak ptr 一 weak ptr 变量的定义 weak ptr 对象的构造有3种方法 1
  • 软件测试面试面对HR提出的问题,怎么回答才不会被面试官“套路”

    面试中 如何回答HR提出的问题很大程度上决定了面试能不能成功 下面是软件测试人员在面试过程中经常被问到的10个问题 告诉你怎么回答才不会被面试官套路 请你做一个自我介绍 误区 一般人回答这个问题过于平常 只说姓名 年龄 爱好 工作经验 这些
  • 深度学习中的优化算法之NAG

    之前在https blog csdn net fengbingchun article details 124648766 介绍过Momentum SGD 这里介绍下深度学习的另一种优化算法NAG NAG Nesterov Accelera
  • 【航模】凤凰模拟器安装

    固定翼飞手3 1 航模入门教程 凤凰模拟器的安装与初始设置 航模模拟器详细教程 到群里下载凤凰模拟器 并按照视频进行安装 群里的文件安装方式相比自己CSDN里面介绍的安装方式更省力 DirectX它能够自己进行安装 自己的天地飞6遥控器是右
  • 八、RSTP

    STP协议虽然能够解决环路问题 但是收敛速度慢 影响了用户通信质量 如果STP网络的拓扑结构频繁变化 网络也会频繁失去连通性 从而导致用户通信频繁中断 IEEE于2001年发布的802 1w标准定义了快速生成树协议RSTP Rapid Sp
  • spring硬骨头-----解决循环依赖问题

    目录 what spring中是如何解决循环依赖问题的 整体思路 spring中初始化时设置属性值的方法 set和构造的区别 那么三级缓存是怎么处理的呢 实现细节 总结 1 三级缓存解决循环依赖问题的关键是什么 为什么提前暴露对象能够解决
  • SpringBoot整合shiro-spring-boot-web-starter启动报错

    最近在做一个SpringBoot整合常用框架的系统 在整合Shiro时启动就报错 现将解决办法总结如下 SpringBoot使用的是最新的2 3 4版本 Shiro使用的是shiro spring boot web starter1 6 0
  • Python 数组操作指南:使用示例和方法解析

    什么是 Python 数组 数组是一种基本数据结构 也是大多数编程语言的重要组成部分 在 Python 中 它们是能够同时存储多个项目的容器 具体来说 它们是元素的有序集合 每个值都具有相同的数据类型 这是关于 Python 数组需要记住的
  • 11. 微积分 - 偏导数&方向导数

    文章目录 偏导数 方向导数 方向余弦 投影 继续讲方向导数 Hi 大家好 我是茶桁 我们上节课学习了链式法则 本节课 我们要学习 偏导数 和 方向导数 偏导数 偏导数在导论课里面也提到过 偏导数针对多元函数去讲的 多元函数是什么 我们拿个例
  • springboot 获取 property参数

    public class TankyxApiMemberApplication extends SpringBootServletInitializer public static void main String args Configu
  • 排列组合(递推矩阵)

    排列与组合有什么区别 排列与元素的顺序有关 组合与顺序无关 如何递推出对应的排列组合呢 组合 通过上面的组合公式可以得到下面的数据表格 n m 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 2
  • 单链表的基本操作c++

    头节点 第一个节点 一般不储存数据 头指针 指向第一个节点 首元节点 第一个储存数据的节点 可以通过头节点或头指针指向整个链表 链表的初始化 前插法 前插法 node initlink node p node malloc sizeof n
  • JavaSE 01

    JAVASE 学习1 作为初学者 主要在此记录学习过程中的点滴 以供参考和后期回顾 1 Java是一个全面且功能强大的语言 可用于多种用途 Java有三个版本 Java标准版 Java Standard Edition Java SE 可以

随机推荐

  • 手把手教你用VS2019搭建Linux开发环境

    因为linux的界面还是不如Windows友好 但是linux系统下可以看见一些更底层的东西 今天 我来教你用vs2019搭建linux项目 第一步 打开vs的安装器 看下面标注的组件是否安装 第二步 开启linux ssh服务 ubunt
  • Android Studio连接夜神模拟器

    Android Studio连接夜神模拟器 一 下载夜神模拟器 二 夜神模拟器连接Android Studio 三 其他操作 3 1 屏幕旋转 3 2 创建其他模拟器 一 下载夜神模拟器 官网 https www yeshen com 下载
  • TCP如何保证可靠传输

    TCP如何保证可靠传输 TCP保证可靠传输的方式有 校验和 序列号 确认应答 超时重传 连接管路 流量控制 拥塞控制等 1 校验和 在数据传输过程中 吧传输的数据当作一个16位整数 吧所有的数据加起来 最前面的进位补到最后一位 然后取反得到
  • 钱币兑换问题(dp背包)

    钱币兑换问题 在一个国家仅有1分 2分 3分硬币 将钱N兑换成硬币有很多种兑法 请你编程序计算出共有多少种兑法 Input 每行只有一个正整数N N小于32768 Output 对应每个输入 输出兑换方法数 Sample Input 293
  • 观察者模式(推模型+拉模型)

    观察者模式 Observer Pattern 当一个对象被修改时 会自动通知它的依赖对象 现在我们是新闻社 要向所有新闻订阅者推送新闻 那么该如何实现呢 经过思考我们不难发现一家新闻社一般对应的是多个新闻订阅者 那么我们先从新闻社开始入手
  • 同步和异步的区别及优缺点 通俗理解

    一 同步和异步的区别 程序里面的同步和异步和我们现实生活理解不太一样 一般我们对同步的理解是同时做很多事情 但程序中的同步是按照任务的顺序执行任务 前一个任务没有执行结束 下一个任务不会执行 要等待上一个任务执行结束 通俗举例 我大学有个室
  • 服务器同时读写多个文件,多服务器文件读写

    多服务器文件读写 内容精选 换一换 表1列出了弹性文件服务的常用功能 在使用弹性文件服务之前 建议您先通过常用概念介绍了解NFS CIFS等基本概念 以便更好地理解弹性文件服务提供的功能 表示该类型的文件系统支持该功能 表示该类型的文件系统
  • angular项目从部署到启动

    angular是前端三大框架之一 适合开发大型需要多人合作的项目 代码规范 社区活跃 不过学习曲线陡峭 这篇介绍环境搭建 完成就可以启动ng项目了 一 Node js和npm 在node官网 https nodejs org zh cn d
  • Java实战之城市多音字处理

    Java实战之城市多音字处理 一 需求 对城市名称转化为拼音的时候 当遇到多音字城市的时候 转化拼音就不是我们想要的了 使用 pinyin4j 无法直接解决这个问题 网上有很多维护多音字信息的 觉得麻烦 如 长沙 gt zhangsha 厦
  • Massif:堆分析器

    简介 Massif是一个堆分析器 它度量程序使用了多少堆内存 这包括有用的空间 以及分配给簿记和对齐目的的额外字节 它还可以测量程序堆栈的大小 尽管默认情况下它不这样做 堆分析可以帮助您减少程序使用的内存量 在具有虚拟内存的现代机器上 这提
  • 人工智能如何理解开悟?

    马斯克为啥牛逼你知道吗 为啥现能成世界首富 你们知不知道 最近这一个月全世界最火的连比尔盖茨都说了 这个是比当年人类发明互联网更加震撼人心的 就是马斯克有一家公司发明了一个聊天机器人 叫track GDP 这个track GDP有多厉害呢
  • 现在的jdk keytool无法获取到jks的MD5怎么办?

    一 使用其他版本的JDK 可获取MD5的版本 https ask dcloud net cn article 38778 二 使用openssl 获取 命令如下 keytool exportcert keystore xxx keystor
  • qt 5.12.1 下载安装详细教程

    前言 Qt是一个跨平台的C 图形界面应用程序框架 它提供给开发者建立图形用户界面所需的功能 广泛用于开发GUI程序 也可用于开发非GUI程序 Qt很容易扩展 并且允许真正地组件编程 基本上 Qt同X Window上的Motif Openwi
  • 几种字符串补“0”(或其它字符)的方式

    几种字符串补 0 或其它字符 的方式 好记性不如烂笔头 先记下 呵呵 方式一 这个最多程序员用的 也是最普通的方式 int a 656 string b a if b length lt 6 for int i 0 i lt 6 b len
  • 参数在信号-槽参数用值传递还是引用传递

    结论 以下表格总结了我们的结果 例如第一行 如果程序传递信号的参数为引用到槽 那么在直接连接则不发生复制 在队列连接则发生一次复制 Signal Slot Direct Queued const Copy const Copy 0 1 co
  • Matlab找出矩阵每一行的最大值及其位置

    dis max arr 2 dis array zeros M N for i 1 size dis hang max dis i 1 c find edtImage i hang max dis array i c 1 end figur
  • 移植NTP时间同步工具到arm linux平台创建定时任务

    移植NTP时间同步工具到arm linux平台创建定时任务 下载源码 解压并编译 一个脚本进行编译 上传文件至开发板 运行 创建开机启动项 注意在windows上编写的文件可能需要执行以下命令 ntp服务器 下载源码 wget c http
  • (ubuntu)linux和mac安装Miracl密码库

    只要你按照以下步骤操作 可以得到Miracl密码库的静态编译文件 a 步骤一 官网仓库 注意 是下载ZIP 而不是直接clone下来 不然的话是绝对不行的 步骤二 unzip j aa L MIRACL master zip 执行命令 终端
  • spring中的动态代理

    两种代理原理 jdk动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子类来处理 spr
  • [Android常见问题] 自定义授权界面

    自定义授权界面 http bbs mob com thread 278 1 1 html 出处 http bbs mob com 本帖最后由 wolf 于 2016 5 6 10 30 编辑 自定义授权界面 1 准备工作 参考文档 在你的项