Java注解代码生成

节选自:Java注解代码生成


1、简介
在我们常用的框架中注解和自动生成代码的身影很常见,因为注解和自动生成的配合,从而简化和统一代码,使框架使用简单且容易扩展,典型且最熟悉的就是ButterKnife,主要功能利用注解省略了findViewById的过程,当然也提供了其他的监听、绑定等很多强大的操作符,熟悉ButterKnife源码的应该知道,ButterKnife的实现就是利用我们今天的要讲的内容,我们在文章的最后也会尝试编写一个简单的ButterKnife;

IjkPlayer 学习笔记

节选自:IjkPlayer 学习笔记


笔记可能微乱,但大致清晰,可能会对他人有所帮助,故分享出来。

×××××××××××××××目录×××××××××××××××
ijk概述
mediacodec相关
OpenGL相关
filter相关
setOption配置相关
metadata相关
h264编码器特有的设置域
线程相关
消息机制
音频输出
声道切换
SDL_CreateCond 与 SDL_CreateThreadEx
如何暂停
×××××××××××××××××××××××××××××××××

手机设备信息与 Android build.prop 文件

节选自:手机设备信息与 Android build.prop 文件


什么是 build.prop 文件

路径: /system/build.prop

说明: build.prop 是 Android 系统中的一个重要的属性文件,记录了系统的设置和改变。

主要信息类型ro.build.*(编译信息),ro.product.*(设备信息),ro.config.*(默认设置信息),dalvik.vm.*(虚拟机信息)等。

获取 Android 设备信息的命令

一种是通过访问 /system/build.prop 文件进行查看

# 打印 /system/build.prop 所有内容
adb shell cat /system/build.prop

# 通过 grep 筛选特定内容
adb shell cat /system/build.prop | grep ro.product

也可以用 ADB 的命令查看

# 显示所有信息
adb shell getprop

# 显示特定信息
adb shell getprop ro.product.model

# 筛选信息
adb shell getprop | grep product

部分 build.prop 信息说明

参数 说明 例子
ro.build.id 编译标识 ro.build.id=KTU84P
ro.build.display.id 显示标识 ro.build.display.id=KTU84P release-keys
ro.build.version.sdk 编译时使用的SDK版本 ro.build.version.sdk=19

【转】Android 开发之ActivityLifecycleCallback

转载自:Android 开发之ActivityLifecycleCallback


一. 简介

ActivityLifecycleCallbacks是Application里的一个接口,在Android4.0(API level 14)中新加。用于监听应用中所有Activity的生命周期的调用情况,callback中的方法会在Activity回调方法之前调用,可以通过实现这个接口来完成一些特殊需求,比如检测APP是否处于前台。

二. 使用

以检测APP是否处于前台为例介绍使用。

1. 实现ActivityLifecycleCallbacks接口

public class ActivityLifecycleCallbackWrapper implements Application.ActivityLifecycleCallbacks {
    private static final String TAG = "LifecycleCallback";
    private int count; 
    private boolean isForeground; 

    public boolean isForeground() {
        return isForeground; 
    }

    @Override 
    public void onActivityCreated(Activity activity, Bundle bundle) {
        //to do 
    }

    @Override 
    public void onActivityStarted(Activity activity) { 
        count ++; 
    }

    @Override 
    public void onActivityResumed(Activity activity) {
        //to do 
    }

    @Override 
    public void onActivityPaused(Activity activity) {
        //to do 
    }

    @Override 
    public void onActivityStopped(Activity activity) { 
        count --; 
        if(count == 0) {
            isForeground = true; 
        }
    }

    @Override 
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
        //to do 
    }

    @Override 
    public void onActivityDestroyed(Activity activity) {
        //to do 
    }
}

2. 创建自定义Application,并在Application中注册callback。

public class MyApplication extends Application {
    ActivityLifecycleCallbacks callbacks; 

    @Override 
    public void onCreate() {
        super.onCreate(); 
        callbacks = new ActivityLifecycleCallbackWrapper();

        registerActivityLifecycleCallbacks(callbacks);  // 注册Callback
    }
}

利用反射获取ViewBinding

public abstract class CommonAdapter<Data, Binding extends ViewBinding> extends BaseAdapter {

    @SuppressWarnings("unchecked")
    private Binding onCreateViewBinding(LayoutInflater inflater, ViewGroup parent) {
        ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
        Class<?> clazz = (Class) Objects.requireNonNull(type).getActualTypeArguments()[1];
        try {
            Method method = clazz.getMethod("inflate", LayoutInflater.class, ViewGroup.class, boolean.class);
            return (Binding) method.invoke(null, inflater, parent, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

参考链接:

利用ViewBinding和反射封装的基类,从此再也不用findViewById了

【转】Windows 安装 SourceTree3.3.8 跳过注册

转载自:windows 安装sourceTree3.3.8 install 时无反应,如何跳过注册安装


我的电脑是windows7, sourceTree是3.3.8

1、访问官网下载最新版本的sourceTree ,官网连接:

https://www.sourcetreeapp.com/

2、先安装sourceTree, 他会提示缺少.NET Framework 4.7.1, 少什么就安装什么,安装成功后, 需要重启电脑,然后执行步骤3; 如果没有缺少,请忽略,直接执行步骤3

3、选择bitbucket的界面退出

4、打开我的电脑, 在地址栏, 输入

%LocalAppData%\Atlassian\SourceTree\

5、在此目录下新建名为accounts.json文件, 写入以下内容

[
  {
    "$id": "1",
    "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
    "Authenticate": true,
    "HostInstance": {
      "$id": "2",
      "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
      "Host": {
        "$id": "3",
        "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
        "Id": "atlassian account"
      },
      "BaseUrl": "https://id.atlassian.com/"
    },
    "Credentials": {
      "$id": "4",
      "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
      "Username": "",
      "Email": null
    },
    "IsDefault": false
  }
]

6、打开 %LocalAppData%\Atlassian,进入“SourceTree.exe_Url_iayhtc13zv3obzuz5vchezjs1az2q5ef”(注:该目录可能和版本相关,不同版本的路径可能不完全一样。)

进入 3.3.8.3848 目录, 打开user.config 加入这几句话

<setting name="AgreedToEULA" serializeAs="String">
    <value>True</value>
</setting>
<setting name="AgreedToEULAVersion" serializeAs="String">
    <value>20160201</value>
</setting>

7、重新点击seourceTree.exe 安装, 弹框选择最后一项安装即可

配置国内阿里云 Gradle 仓库镜像

选择一:项目级配置(推荐)

在项目根目录的build.gradle文件中添加以下内容

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google/' }
        maven { url 'https://maven.aliyun.com/repository/jcenter/' }
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google/' }
        maven { url 'https://maven.aliyun.com/repository/jcenter/' }
    }
}

继续阅读配置国内阿里云 Gradle 仓库镜像

是时候拥抱ViewBinding了!!

节选自:是时候拥抱ViewBinding了!!


三、拥抱ViewBinding

关于ViewBinding的文档,官方写的很详细,请看视图绑定。本文一切从简,主要说下Google官方没有提到的一些问题。

3.1、环境要求

  • Android Studio版本3.6及以上
  • Gradle 插件版本3.6.0及以上

3.2、开启ViewBinding功能

ViewBinding支持按模块启用,在模块的build.gradle文件中添加如下代码:

android {
        ...
        viewBinding {
            enabled = true
        }
}

3.3、Activity中ViewBinding的使用

//之前设置视图的方法
setContentView(R.layout.activity_main);

//使用ViewBinding后的方法
mBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());

继续阅读是时候拥抱ViewBinding了!!

Android单元测试-常见的方案比较

节选自:Android单元测试-常见的方案比较


前言

本文将介绍在Android Studio中,android单元测试的介绍和实现。相关代码托管在github上的AndroidJunitDemo中,涉及到的用例代码收集于google官方提供的测试用例android-testing,同时进行了简化和修改。你可以从该demo中学习单元测试简单的使用,在工程中,包含两个模块,一个实现计算器功能的CalculationActivity,另外一个是PersonlInfoActivity,可以编辑姓名,邮箱和生日等信息,并保存到SharePreferences中,同时提供了两个模块的单元测试。

单元测试

关于单元测试,在维基百科中,给出了如下定义:

在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

android中的单元测试基于JUnit,可分为本地测试和instrumented测试,在项目中对应

  • module-name/src/test/java/.
    该目录下的代码运行在本地JVM上,其优点是速度快,不需要设备或模拟器的支持,但是无法直接运行含有android系统API引用的测试代码。
  • module-name/src/androidTest/java/.
    该目录下的测试代码需要运行在android设备或模拟器下面,因此可以使用android系统的API,速度较慢。

以上分别执行在JUnit和AndroidJUnitRunner的测试运行环境,两者主要的区别在于是否需要android系统API的依赖。
在实际开发过程中,我们应该尽量用JUnit实现本地JVM的单元测试,而项目中的代码大致可分为以下三类:

  • 1.强依赖关系,如在Activity,Service等组件中的方法,其特点是大部分为private方法,并且与其生命周期相关,无法直接进行单元测试,可以进行Ecspreso等UI测试。
  • 2.部分依赖,代码实现依赖注入,该类需要依赖Context等android对象的依赖,可以通过Mock或其它第三方框架实现JUnit单元测试或使用androidJunitRunner进行单元测试。
  • 3.纯java代码,不存在对android库的依赖,可以进行JUnit单元测试