• MotionLayout 运动布局

    MotionLayout什么是MotionLayout?MotionLayout(运动布局) MotionLayout is a new class available in the ConstraintLayout 2.0 library to ...
  • ViewBinding

    Android绑定View的发展史从Android系统诞生至今,在代码中findView一直是Android开发者无法绕开的一道程序。从最初的findViewbyId到如今炙手可热的ViewBinding,期间涌现出了许多findView的方式,它们...
  • 动画Animation

    概述Android动画大致可以分为帧动画(Frame Animation)、补间动画(Tween Animation)、属性动画(Property Animation)、转场动画(Transition Animation)。 帧动画 逐帧动画是一种...
  • ADB命令学习资料

    ADB即Android Debug Bridge,安卓开发、测试过程中强大的命令调试工具,熟练掌握ADB命令可以提高开发效率。 ADB学习资料整理: Awesome Adb——一份超全超详细的 ADB 用法大全 那些做Android开发必须知道的AD...
  • Gradle、Python脚本多渠道自动化打包

    为什么要多渠道打包?

    众所周知,由于Google play在国内无法使用,国内Android应用市场群雄纷争,存在着众多的应用市场,在不同的市场可能有着不同的统计需求,需要为每个应用市场的Android包设定一个可以区分应用市场的标识,为此Android开发人员需要为每个应用市场发布一个安装包(渠道包),这就是为什么Android需要多渠道打包。

    使用gradle打包

    配置AndroidManifest.xml

    在Androidmanifest.xml中定义mate-data标签:

    1
    2
    3
    4
    5
    6
    7
    8
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"    
    package="com.package.name">
    <application>

    <meta-data android:name="UMENG_CHANNEL" android:value="xiaomi" />

    </application>
    </manifest>

    如果不使用多渠道打包方法,那就需要我们手动一个一个去修改value中的值,比如xiaomi,360,qq,wandoujia等等。
    使用多渠道打包的方式,就需要把上面的value配置成下面的方式:

    1
    <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />

    其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定义配置的值。

  • APP闪屏页的正确打开方式

    闪屏页(Splash),顾名思义,就是一闪而过的页面,当然,它大多时候可能并不是一闪而过,而是要我们等待数秒,因为我们的app在打开、初始化、加载的过程中都需要一定的时间,尤其是首次启动(冷启动)或者手机性能较差的时候耗时更加明显,这时候我们什么也看不到。与其毫无意义的等待(黑屏or白屏),何不展示一些有趣或者有意思的东西呢?所以闪屏页一般被用来展示公司Logo、标语或者App的特性等,当然,展示广告的就比较坑啦。那么问题来啦,既然我都设置了闪屏页,为什么我的app启动的时候还是会黑屏或白屏呢?

    问题由来:Starting Window

    当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前,如果初始化的时间过长,屏幕上可能没有任何动静,用户会以为没有点到相应的按钮。所以既不能停在原来的地方但又无法显示应用程序,怎么办呢?这就有了Starting Window(也称之为Preview Window)。

  • Android内存泄漏

    什么是内存泄漏

    内存泄露,简单的说,就是该被释放的内存没有被释放,一直被某个或某些实例所引用但不能被使用,导致GC不能回收,造成内存泄漏。总结的说,可以理解为长生命周期的对象一直持有短生命周期对象的引用,导致短生命周期对象一直被引用而无法被GC回收,内存泄漏是造成OOM的主要原因之一,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。

    安卓中常见的内存泄漏场景

    单例造成内存泄漏

    因为单例模式有其静态的特点,其生命周期和应用一样长,如果单例对象中包含了一个其他对象的引用,那么即使这个对象不再使用,依然存在一个单例对象引用它,造成无法回收。比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class AppManager {
    private static AppManager instance;
    private Context context;
    private AppManager(Context context) {
    this.context = context;
    }
    public static AppManager getInstance(Context context) {
    if (instance != null) {
    instance = new AppManager(context);
    }
    return instance;
    }
    }
  • Hexo常用命令备忘

    $ hexo g #生成$ hexo s #本地预览 访问本地页面:http://localhost:4000/ $ hexo d #部署 hexo new “postName” #新建文章
  • 用流水线的方式来理解RxJava的概念

    为什么另写一篇 RxJava 的文章?

    已经有很多 RxJava 的文章通过例子阐述了什么是 RxJava 以及怎么去用,但它们大多数只有代码。虽然也会通过类比来解释,例如最出名的就是“流”。通常情况下代码能完美地让人理解(我们都是程序员,对吧?),但是 RxJava 十分不同于以往的 Android 开发。在最开始时通过代码是很难让人理解的,用“流”来类比并不足够,即使是 marbles 的例子也还远远不够。我可以保证自己能理解,但对于别人,老实说,难道你们不需要更多结合实际的例子?难道你们不想在脑海中举一个例子来让自己更好地理解 RxJava 吗?我做了,并且我想和你们分享。

    工厂流水线

    好吧,我说谎了。为了理解 RxJava,我在脑海里举了不仅仅一个例子。例如我尝试观察动物园笼子的动物,尝试观察河流里的鱼,也尝试去观察蝙蝠侠里的犯罪(额,这不是现实生活中的,但不失为一个很好的例子)。但我还是认为工厂流水线是最好的例子。

  • 移动开发优秀三方支持

    统计

    1.友盟:http://www.umeng.com/
    友盟涵盖应用统计、消息推送、即时通讯、社会化分享、自动更新等功能,可以说是大而全。
    2.Talkingdata:https://www.talkingdata.com/
    Talkingdata提供应用统计分析、游戏运营分析、移动广告检测等服务。

    推送

    1.个推:http://www.getui.com/
    2.极光推送:https://www.jpush.cn/
    3.友盟推送:http://www.umeng.com/push

    社会化分享

    1.Mob ShareSDK:http://www.mob.com/#/
    Mob还提供短信验证SDK,MobAPI(包括天气查询、邮编查询、号码归属地查询以及即将上线的车辆违章查询等API接口)。
    2.友盟社会化分享:http://www.umeng.com/social