日常开发中,注解能够帮助我们写出更好更优秀的代码,为了更好地支持 Android 开发,在已有的 android.annotation 基础上,Google 开发了 android.support.annotation 扩展包,共计50个注解,帮助开发者们写出更优秀的程序。
官网链接: developer.android.google.cn/reference/a… 、 developer.android.google.cn/reference/a…
super.()
1.在 res 文件夹下创建 animator 子文件夹
2.在 animator 文件夹下创建 scale.xml 文件
<set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用: @AnimatorRes public int returnAnimator() { return R.animator.scale; 如果将 return R.animator.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnimRes 1.在 res 文件夹下创建 anim 子文件夹 2.在 anim 文件夹下创建 scale.xml 文件 <set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用: @AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用:
3.在需要的地方如下调用:
@AnimatorRes public int returnAnimator() { return R.animator.scale; 如果将 return R.animator.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnimRes 1.在 res 文件夹下创建 anim 子文件夹 2.在 anim 文件夹下创建 scale.xml 文件 <set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用: @AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnimatorRes public int returnAnimator() { return R.animator.scale; 如果将 return R.animator.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.animator.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.animator.scale;
return 1;
return R.string.test;
AnimRes 1.在 res 文件夹下创建 anim 子文件夹 2.在 anim 文件夹下创建 scale.xml 文件 <set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用: @AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 res 文件夹下创建 anim 子文件夹
2.在 anim 文件夹下创建 scale.xml 文件
<set xmlns:android="http://schemas.android.com/apk/res/android"></set> 3.在需要的地方如下调用: @AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。 AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnimRes public int returnAnim() { return R.anim.scale; 如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.anim.scale;
AnyRes 在需要的地方如下调用: @AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
在需要的地方如下调用:
@AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。 AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnyRes public int returnAny() { return 1; 如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。
如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。
AnyRes
StringRes
DrawableRes
AnyThread 在需要的地方如下调用: @AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnyThread public void test() { //..... ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AnyThread public void test() { //.....
ArrayRes 1.在 values 文件夹下创建 arrays.xml 文件 2.在 arrays.xml 文件中添加名为 names 的子项 <resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 values 文件夹下创建 arrays.xml 文件
2.在 arrays.xml 文件中添加名为 names 的子项
<resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用: @ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<resources> <array name="names">1, 2, 3</array> </resources> 3.在需要的地方如下调用:
@ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。 AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@ArrayRes public int returnArray() { return R.array.names; 如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.array.names;
AttrRes 1.在 attrs.xml 文件中添加名为 CircleView 的子项 <resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 attrs.xml 文件中添加名为 CircleView 的子项
<resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用: @AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<resources> <declare-styleable name="CircleView"> <attr name="circle_color" format="color"/> </declare-styleable> </resources> 2.在需要的地方如下调用:
2.在需要的地方如下调用:
@AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。 BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@AttrRes public int returnAttr() { return R.attr.circle_color; 如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.attr.circle_color;
BinderThread 1.表明指定的元素只能运行在 Binder 线程: @BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.表明指定的元素只能运行在 Binder 线程:
@BinderThread public void test() { // ... BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@BinderThread public void test() { // ...
BoolRes 1.在 values 文件夹下创建 bools.xml 文件 2.在 bools.xml 文件中添加名为 isHide 的子项 <resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 values 文件夹下创建 bools.xml 文件
2.在 bools.xml 文件中添加名为 isHide 的子项
<resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用: @BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<resources> <bool name="isHide">true</bool> </resources> 3.在需要的地方如下调用:
@BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。 CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@BoolRes public int returnBool() { return R.bool.isHide; 如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.bool.isHide; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.bool.isHide;
CallSuper 1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作: public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化操作:
init()
public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作: public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
public class BaseActivity extends AppCompatActivity { // ... @CallSuper public void init() { // Activity 共有的初始化操作... 2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作:
2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化操作:
public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。 CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
public class MainActivity extends BaseActivity { // ... @Override public void init() { // super.init(); 如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。
如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。
super.init()
CheckResult 1.创建一个 add() 方法: @CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.创建一个 add() 方法:
add()
@CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值: add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@CheckResult public int add() { return 666; 2.调用该方法的地方不能忽略它的返回值:
2.调用该方法的地方不能忽略它的返回值:
add(); // error int num = add(); // ok ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
add(); // error int num = add(); // ok
ColorInt ColorLong ColorRes 1.在 colors.xml 下添加名为 colorAccent 的子项 <resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 colors.xml 下添加名为 colorAccent 的子项
<resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用: @ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<resources> <color name="colorAccent">#FF4081</color> </resources> 2.在需要的地方如下调用:
@ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。 DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@ColorRes public int returnColorRes() { return R.color.colorAccent; 如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.color.colorAccent;
DimenRes 1.在 dimens.xml 下添加名为 textview_height 的子项 <resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在 dimens.xml 下添加名为 textview_height 的子项
<resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用: @DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<resources> <dimen name="textview_height">25dp</dimen> </resources> 2.在需要的地方如下调用:
@DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。 Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@DimenRes public int returnDimenRes() { return R.dimen.textview_height; 如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.dimen.textview_height; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.dimen.textview_height;
Dimension 1.在需要的地方如下调用: @Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.在需要的地方如下调用:
@Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关 DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Dimension(unit = Dimension.DP) public int returnDimenRes() { return 666; 注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关
注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关
DrawableRes 1..在 drawable.xml 文件中添加名为 btn_test 的子项 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1..在 drawable.xml 文件中添加名为 btn_test 的子项
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用: @DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focused" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_normal"/> </selector> 3.在需要的地方如下调用:
@DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。 FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@DrawableRes public int returnDrawRes() { return R.drawable.btn_test; 如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。
如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。
return R.drawable.btn_test;
FloatRange 1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如: @FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如:
@FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@FloatRange(from = -0.5F, to = 0.5F) public float returnFloat() { // return 0.8F; // error return 0.2F; // ok
FractionRes 同 ColorRes 等。 IdRes 同 ColorRes 等。 IntDef 1.用该注解修饰一个注解: @IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 ColorRes 等。
1.用该注解修饰一个注解:
@IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素: @Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@IntDef({LAST, NOW, NEXT}) @Retention(RetentionPolicy.SOURCE) public @interface Year { int LAST = 2016; int NOW = 2017; int NEXT = 2018; 2.再用被修饰的注解去注解指定元素:
2.再用被修饰的注解去注解指定元素:
@Year public int returnYear() { // return 666; // warning return Year.LAST; // ok IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Year public int returnYear() { // return 666; // warning return Year.LAST; // ok
IntegerRes 同 BoolRes 等。 InterpolatorRes 同 ColorRes 等。 IntRange 同FloatRange 1.对于不希望被混淆的代码我们使用该注解: @Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 BoolRes 等。
同FloatRange
1.对于不希望被混淆的代码我们使用该注解:
@Keep public void test() { // ... LayoutRes 同 ColorRes 等。 MainThread 同 BinderThread,表指定元素只能运行在主线程。 MenuRes 同 ColorRes 等。 NonNull 1.如果被注解的元素不可以取空值的话,我们使用该注解: public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 BinderThread,表指定元素只能运行在主线程。
1.如果被注解的元素不可以取空值的话,我们使用该注解:
public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning: public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent; 2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning:
2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning:
public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
public void test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull
Nullable 同 NonNull,意义相反,表被注解的元素可为空。 PluralsRes 同 BoolRes 等。 实际等同于 Dimension 中 unit 取 PX 时的意义。 RawRes 同 BoolRes 等。 RequiresApi 1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明: @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 NonNull,意义相反,表被注解的元素可为空。
实际等同于 Dimension 中 unit 取 PX 时的意义。
1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明:
@Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解: @Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三: 使用 RequiresApi 注解:
2.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
使用 RequiresApi 注解:
@Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解: @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Override @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 Target 注解:
使用 Target 注解:
@Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块: @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 使用 if 包裹相应代码块:
使用 if 包裹相应代码块:
@Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的! RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的!
注:网上大篇文章提到使用 RequiresApi 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的!
RequiresPermission 1.表注解的元素需要相应的权限: @RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
1.表注解的元素需要相应的权限:
@RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。 RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@RequiresPermission(Manifest.permission.INTERNET) private void netOperation() { 2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。
2.如果你的项目没有在 AndroidMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netOperation:android.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。
Missing permissions required by MainActivity.netOperation:android.permission.INTERNET
RequiresPermission.Read 同 RequiresPermission。 RequiresPermission.Write 同 RequiresPermission。 RestrictTo 1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解: @RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 RequiresPermission。
1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解:
@RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合: public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@RestrictTo(RestrictTo.Scope.SUBCLASSES) public void init() { 2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。 注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码 1.常用于限定数组大小的场合:
2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。
BaseActivity.int() can only be called from subclass
注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码
RestrictTo.Scope.SUBCLASSES
1.常用于限定数组大小的场合:
public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok
StringDef 同 IntDef。 StringRes 同 ColorRes 等。 StyleableRes 同 ColorRes 等。 StyleRes 同 ColorRes 等。 TransitionRes 同 ColorRes 等。 UiThread 同 BinderThread,表指定元素只能运行在 UI 线程。 WorkerThread 同 BinderThread,表指定元素只能运行在工作线程。 XmlRes 同 ColorRes 等。 SuppressLint 1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解: @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
同 IntDef。
同 BinderThread,表指定元素只能运行在 UI 线程。
同 BinderThread,表指定元素只能运行在工作线程。
1.在想要屏蔽 Lint 静态检测工具的提示的地方添加该注解:
@SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ... TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
@SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // ...
TargetApi 见 RequiresApi。 分类: Android 相关推荐 Android 彻底理解Handler的设计之传送带模型 这篇文章引入了一个易理解的正确的模型,以便帮助你自己分析Handler机制的时候减少困惑、更加容易。 219 简绘Android 18小时前 Android 使用VScode阅读Android Kernel代码并调试 本文介绍了如何在VScode上阅读并调试Android Kernel代码,搭建完美的内核开发环境,并拥有良好的内核代码阅读体验 170 layz4android 14小时前 Android Android进阶宝典 -- Kotlin协程分析(创建、取消、超时) 本文详细介绍协程的构建、取消、超时,对于不同作用域内部子协程执行规则做出详细介绍,对于如何取消协程或者超时处理有标准的处理方式 164 Mr_万能胶 Android 太库辣!Netflix Android 客户端开源库大公开 由于前段时间看完了《不拘一格 网飞的自由与责任工作法》,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端究竟使用了哪些开源库?本文给你答案。 2380 Kotlin Android Android自定义View扫码ui控件效果 “我正在参加「掘金·启航计划」” 前段时间做了一个圆形物品扫码相关的需求,要求做一个扫描动画,扫描线只在圆形区域显示 效果图如下: 思路如下: 看到这东西,第一反应就是使用自定义view 画出一个蒙层 162 Android Android深入了解触摸事件(一) 前言 触摸事件已经是老生常谈的事情了,但是可能大部分童鞋都只是知道在ViewTree下的机制,但是事件怎么到ViewTree的,可能处于一种比较空白的状态,这系列文章我希望从InputManagerS 171 乐征skyline 16小时前 Android Android小技巧:在通知RemoteViews中显示动画 在Android Notification显示中,我们通常显示一些静态元素,即便使用自定义布局,也不例外,因为RemoteViews有着诸多限制,例如使用的控件只有那些个基本控件,更新界面也必须通过R 165 Shanghai_Liu Android Android进阶之路 - 字体自适应 很多时候控件的宽度是有限的,而要实现比较好看的UI效果,常见的处理方式应该有以下几种 默认执行多行显示 单行显示,不足部分显示... 自适应字体 静态设置 宽度是有限的,内部文字会根据配置进行自适应 149 二流小码农 Flutter Django Android Flutter私服搭建之package查询 目前客户端查看实现的方案,有官网提供,当然也有一些三方提供,大家可以根据自己公司需求进行选择性使用,这里采用的是自己从0到1开发,旨在一个简单易用 2956 37手游安卓团队 Android Android 逆向之脱壳实战篇 大家好,我叫 Jack Darren,目前主要负责国内游戏发行 Android SDK 开发 写这篇文章的背景 自从上次 Android 逆向入门保姆级教程 发布之后,便冲上了掘金 Android 热 1382 恋猫de小郭 Flutter Android Flutter 小技巧之 InkWell & Ink 你了解多少 今天要介绍一个「陈年」小技巧,主要是关于 InkWell 的基础科普,InkWell 控件相信大家不会陌生, 作为 Flutter 开发中最常用的点击 Widget ,配合 Flutter 自带的 M 1108 京东云开发者 Flutter Android Flutter状态管理新的实践 | 京东云技术团队 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明 1411 流浪汉kylin Android 掘金·金石计划 Android 即将进入大AI时代 本文将介绍最近提出的studio bot工具和bito与Copilot两种插件,带大家简单实用AI辅助开发的效果,并且大话一下AI之后可能会达到的高度。 8117 Android Flutter Flutter 初探原生混合开发 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Compose、Flutter,大前端已经成为了趋势,很多公司为了节省成本,包括一些大厂已经 622 Android 分享Android开发中常见的代码优化方案 首先要做相关优化,就得先要大致清晰影响性能的相关因素,这样可以做针对性调优会比较有条理。 比较常见的性能调优因素有: 内存,网络,异常,CPU等 546 gradle Groovy 写给 Android 开发者的 Gradle 系列(一)基本姿势 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说,对于大部分的 Android 开发者来说 Gradle 是一个强大的工具,它提供便捷的方式帮助开发者构建 app。如果想… 1.3w EventBus 聊一聊 EventBus 源码和设计之禅 笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。 METHOD_CACHE:Map<Class<?>, List<Subscr… 9161 Android gradle 写给 Android 开发者的 Gradle 系列(二)撰写 task task 相当于开发者日常开发中所接触到的函数、方法,它们是相同的一个概念。在前文写给 Android 开发者的 Gradle 系列(一)基本姿势已经提到过 task 的概念,例如 transformClassesAndResourcesWithProguardForRelea… 8546 Android 手摸手第二弹,可视化 RecyclerView 缓存机制 开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼里啪啦,实在有些晦涩难懂,于是笔者想将部分数据可视化,手摸… 8536 gradle Groovy 写给 Android 开发者的 Gradle 系列(三)撰写 plugin 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 新建一个 Androi… 7706 友情链接: Android dev-er @ bytedance 2,154
见 RequiresApi。
友情链接: