添加权限 <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 获取系 ...
触摸事件 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 ...
使用 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 ...
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" } } } ...
View 构造方法中第三个参数 defStyleAttr
今天使用一个自定义控件继承自 AppCompatButton, 字体不是居中的, 最后排查发现是构造方法的问题; 对比 AppCompatButton 的源码发现是 defStyleAttr 参数的问题 public class TButton extends android.support.v7.widget.AppCompatButton { public TButton(Context context) { this(context, null); } public TButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TButton(Context context, AttributeSet attrs, in ...
AIDL 回调中的 IllegalStateException
beginBroadcast java.lang.IllegalStateException 已知在 aidl 中回调注册的 callback 对象时, 需要使用 beginBroadcast() 和 finishBroadcast(), 且一个 begin 之后对应一个 finish; 下面是官方建议的回调的写法; int i = callbacks.beginBroadcast(); while (i > 0) { i--; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take c ...
在 Data Binding 使用数组资源和定义多个属性
同时定义多个属性 如果给一个 View 添加多个属性, 并且这几个属性是相互影响的, 可以像下面这样定义; @BindingAdapter({"background", "skin"}) public static void setViewBgStyle(Button view, String[] arrayId, int index) { } 1234 @BindingAdapter({"background", "skin"}) public static void setViewBgStyle(Button view, String[] arrayId, int index) { ...
ContentProvider
时间过得真快, 上一篇关于 ContentProvider 的笔记还是 2015 年的时候, 之后就没有用过 ContentProvider 了, 有些东西都忘了, 而且关于自定义 ContentProvider 和 greendao 的内容比较少, 这里再重新整理一遍; 这里使用 greendao 框架存储数据, 不同点就是 SQLiteDatabase 对象是通过 greendao 提供的 getWritableSQLiteDatabase 方法来获取到的; 正文 继承 ContentProvider, 来实现跨进程的数据库访问; 继承的子类需要在 AndroidManifest.xml 中进行配置; <provider android:exported="tr ...