AndroidX(/frameworks/support) 代码下载与编译 什么是 AndroidX android 支持库,提供对不同 android 版本的兼容接口。 以下为 android 开发者网站上的说明: androidx 命名空间包含 Android Jetpack 库。与支持库一样,androidx 命名空间中的库与 Android 平台分开提供,并向后兼容各个 Android 版本。 AndroidX 是对原始 Android 支持库进行了重大改进,后者现在已不再维护。androidx 软件包完全取代了支持库,不仅提供与支持库同等的功能,而且还提供了新的库。 此外,AndroidX 还包括以下 ...
android9.0 切换语言
添加权限 <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 12 <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 主要 API 获取系 ...
struct 结构体大小
结构体内可以有多种类型数据, 默认按照成员声明顺序, 在内存中按照默认对齐方式存储; 也可以使用 "#pragma pack(N)" 指定对齐字节数 默认对齐方式 结构体第一个成员的地址和结构体地址相同 对齐时, 成员会相对结构体地址偏移, 产生偏移量, 这个偏移量要是成员大小的整数倍 结构体的总大小, 需要是长度最大的成员的整数倍; 对齐会产生填充字节 struct PackS{ char c; double d; int i; }; PackS packS = {'A', 3, 3}; cout << "char 大小 = " << sizeo ...
触摸事件 ACTION_UP/ACTION_MOVE 的分发
MotionEvent 的 ACTIONDOWN 是按照传递流程执行的, 但是 ACTIONUP/ACTION_MOVE 的传递过程会 受到事件是否被消费的影响 (被消费指的是方法返回 true ) 基础知识 触摸事件的分发主要涉及以下三个方法 boolean dispatchTouchEvent(MotionEvent event) boolean onTouchEvent(MotionEvent event) boolean onInterceptTouchEvent(MotionEvent event) // ViewGroup 独有 MotionEvent 有三种动作 (actoin) ACTION_DOWN 按下 ACTION_UP 抬起 ACTION_MOVE 移动 总的来说触摸事件的 传递流程 是: dispatchTouchEvent() -> onIntercept ...
Program type already present
Program type already present: android.support.annotation.AnimRes Message{kind=ERROR, text=Program type already present: android.support.annotation.AnimRes, sources=[Unknown source file], tool name=Optional.of(D8)} 12 Program type already present: android.support.annotation.AnimResMessage{kind=ERROR, text=Program type already present: android.support.annotation.AnimRes, sources=[Unknown source file], tool name=Optional ...
使用 HanziToPinyin 转拼音
看源码时发现, 在联系人存储的代码下, 有一个汉字转拼音的工具类 HanziToPinyin; 使用了全球化支持库 icu4j 导入依赖文件: implementation 'com.ibm.icu:icu4j:60.2' 1 implementation 'com.ibm.icu:icu4j:60.2' 使用方法: hanziToPinyin = HanziToPinyin.getInstance(); String pinyin = hanziToPinyin.transliterate("汉语拼音"); ...
JNI 回调报错
java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: can't call void com.jnidemo.NativeInterface.onConnectionStateChanged(int, int) on instance of java.lang.Class jni 中无法回调某个 java 方法; 因为使用了错误的 jobject 对象来回调 java 中的方法; // java public native static void initNative(); public void stateCallback(){ } // C 中 static JNIEnv *sCallbackEnv = NULL; static jobject mCallbacksObj = NULL; // 第二个参数应是 jclass, 虽不报错但使用 ...
activity-alias 和 meta-data 标签
activity-alias 标签 activity 别名, 使用 android:targetActivity 指定真正指向的 activity, 调用这个 activity 会打开 targetActivity; <activity-alias android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:targetActivity="strin ...
java原子性
原子操作被认为是原子性; 一个操作是 不可打断 的, 一旦开始, 就运行到结束, 就认为是原子操作, 像 a=0, 只有一个操作, 不可打断, 认为是原子操作, 还有一些语句块, 用 sychronized 加锁后, 也可认为是原子操作; java 提供了位于包 java.util.concurrent.atomic 中的原子类, 使用该工具包中的原子类, 可在不加锁的情况下对单个变量安全的进行多线程编程; 包中的类 AtomicBoolean 可以用原子方式更新的 boolean 值。 AtomicInteger 可以用原子方式更新的 int 值。 AtomicIntegerArray 可以用 ...
JNI 引入已有的库文件遇到的问题
软件环境 Android studio: 3.1.1 NDK 版本: r15c targetSdkVersion 27 Gradle Version: 4.4 Android Plugin Version:3.1.1 error adding symbols: File in wrong format 已有的动态库可能是针对一个特定的平台, 指定想要编译出的库对应的平台与已有 so 文件相同 // Module 下的 build.gradle // 假设已有的一个 so 文件对应的指令集是 armeabi-v7a android { defaultConfig { ... ndk { abiFilters "armeabi-v7a" } } } ...