• 微信 Mars Android Sample 源码分析

    整个 Sample 提供了以下功能:

    • 基于TCP长连接的聊天室体验。
    • 数据通信成功率、耗时、流量的展示。
    • 网络状况检测结果展示。

    一、本地运行 Server 端

    具体如何运行 Server 端,参照官方wiki:Mars Sample 使用说明

    二、修改 Android Sample

    下面说下Android 端该如何修改源码连接到本地服务器

    • 1.全局搜索marsopen.cn,修改替换为localhost
    • 2.在保证 app/build.gradleuseLocalMarsWrapper = true的情况下,在 wrapper module 下修改 com.tencent.mars.sample.wrapper.service. MarsServiceStub.java 的 dns 解析的地址为本地主机的 IP 地址 (wiki 上没写清楚)
      1
      2
      3
      4
      5
      @Override
      public String[] onNewDns(String host) {
      // No default new dns support
      return new String[]{"192.168.24.193"}; //替换为本地主机的 IP 地址
      }
  • ANDROID视频引导滑动黑屏扫雷以及解决方案

    前一段时间,公司项目需要做一个视频引导的功能,刚开始以为用个 ViewPager+Fragment+VideoView 不就实现了吗,很快就弄好了。不过后来测试发现在滑动切换页面时会出现黑屏,比较影响用户体验,然后在网上找了各种“可行”的方案,都未能完全解决,最后尝试了一种巧妙的方法才解决这个问题。

    首先说明下,这里视频引导用到的技术点是 ViewPager+Fragment+VideoView(当然也使用过 SurfaceView 来实现,不过原理基本一致),产品提供四个单独的视频(不是一个视频)+ 引导的圆点和进入主页的按钮(不是直接添加在视频上的)。另外限制条件是,产品未提供每个视频的第一帧的图片。

  • Android用建造者模式实现一个新功能引导页

    最近每次版本更新都会在UI变动或加了新功能的地方加一个引导蒙层页面(新功能标记、文案和一个“知道了”的按钮),有时候一个版本会加三四个页面,原来的做法是:

    • 1.在每个Activity的布局文件外层添加一个FrameLayout(这方法好蠢,又要嵌套一层布局);
    • 2.再将需要显示的引导页布局加在后面(或用include的方式);
    • 3.写两个方法,获取和设置是否显示了该引导页的判断,存储到SharedPreferences;
    • 4.最后在对应Activity页面添加对应控制引导页显隐的逻辑

    每添加一个页面就要重复上面四个步骤,而且之后版本迭代需要去掉这些冗余代码时也比较麻烦,改动的地方比较多,不利于管理。
    这方法太笨了,不能纯粹只为了完成功能呀,于是想了一个简单有效的方法。

  • Android中的Handler, AsyncTask, Thread和Service相关

    Android中Handler和AsyncTask的区别

    注:AsyncTask在1.6前是串行的,在1.6开始采用并行,不过到3.0又改回串行,避免并行带来的错误(在1.6-3.0以前,系统默认最大并发执行5个线程,缓冲线程队列最大128个,10个任务的等待,超过会出现java.util.concurrent.RejectedExecutionException异常。在3.0以后,无论有多少任务,都会在其内部单线程执行;)
    3.1系统以上,可以调用new AsyncTask().executeOnExecutor(Executor exec, Params… params)自定义线程池执行

    附:

  • Android编程规范

    前言

    在软件开发中,没有规矩不成方圆,但规则是人制定的,没有标准,只有适合自己或团队的才是最好的,当然前提是整体上要符合编程语言的规范。

    一、命名规范

    1.包命名

    规则:包名全部小写,采用反域名命名规则,一级包名是顶级域名,通常为com, edu, gov, net, org等,二级包名,通常为公司名或部门名或者个人名,三级包名通常为项目名,四级包名为模块名或者层级名。以下是从层级包名来划分Android项目中采用的包划分结构:(在实际项目中可以采用包命名和模块命名结合的方式)

  • Android 开发艺术探索笔记-4.View的工作原理

    4.1初识ViewRoot和DecorView

    ViewRoot对应于ViewRootImpl类,它是连接WindowManagerDecorView的纽带,View的三大流程都是通过ViewRoot来完成的。
    在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联,源码如下:

    1
    2
    root = new ViewRootImpl(view.getContext(), display);
    root.setView(view, wparam, panelParentView);

    View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来,其中measure用来测量View的宽和高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制在屏幕上,流程如图:

  • Android 开发艺术探索笔记-3.View的事件体系

    3.1 View基础知识

    1.View是所以控件的基类,ViewGroup也属于View

    2.View的位置参数
    由top、left、right、bottom,左上角和右下角的横纵坐标决定(相对View的父容器)。
    Android3.0开始增加了几个参数:左上角坐标x和y、左上角相对父容器的偏移量translationX和translationY(默认值为0)
    x = left + translationX
    y = top + translationY
    平移时,top、left不会发生改变,始终为原始坐标

  • Android开发艺术探索笔记-2.IPC机制

    2.1 Android IPC简介

    IPC是Inter-Process Communication的缩写,是进程间的通信或跨进程通信,指两个进程之间进行数据交换的过程。线程是CPU调度的最小单位,是一种有限的系统资源,而进程一般指一个执行单元,可以包含多个线程。任何一个系统都有IPC机制,Linux上是通过命令管道、共享内容、信号量来进行进程间通信的。

    2.2 Android中的多进程模式

    (1). 开启多进程模式
    为四大组件在AndroidManifest中指定android:process属性:

    • 指定完整进程名,如android:process=”com.google.play.remote”。
    • 以“:”开头,比如设置为android:process=”:remote”。则系统会在实际运行的进程名前加上应用程序的包名,即变成“com.google.play:remote”
  • Android开发艺术探索笔记-1.Activity的生命周期和启动模式

    1.1Activity生命周期全面分析

    activity lifecycle

    • onCreate(), 加载界面布局资源,初始化Activity需要的数据等
    • onStart(), Activity已经是可见状态,但未出现在前台,无法与用户交互;
    • onResume(), Activity已经可见,处于前台,所以一般如果需要返回页面自动刷新数据时,将请求的方法放在onResume;
    • onPause(), 不能做太耗时的操作,onPause必须执行完,新的Activity才会启动,也就是说ActivityA跳转到ActivityB,执行顺序: ……A:onPause()->B:onCreate()->B:onStart()->B:onResume()->A:onStop()
    • onStop(), Activity不可见时会调用,所以当新的Activity采用透明主题时,当前Activity不会调用onStop();
    • onDestroy(), 回收资源,取消注册广播等;

    onStart()和onStop()是从Activity是否可见来回调,而onResume()和onPause()是从Activity是否位于前台来回调。

  • Android中消除Java冗长代码神器——Lombok

    简介

    Android中经常需要建一些数据的实体类,然后实现它们的getter和setter的方法,虽然有JsonFormat的插件可以一键生成对应的getter和setter的方法,但是如果一个实体类有几十个变量的话,生成大量的代码,使这个实体类不够简洁。而Lombok正是一个可以消除Java冗长代码,使代码更精简和优雅的注解工具。它可以在编译期自动生成getter/setter/toString/equals/hashCode/constructor等方法,而在实体类中隐藏掉(不写)这些方法(代码中还可以引用),从而减少代码量,使代码更精简。