更多问答 >>
-
每日一问 Android 有哪些 位运算 的例子很值得借鉴?
2019-08-13 21:56 -
2019-08-18 21:42
-
每日一问 今天聊一下Gradle 相关,BuildConfig这个类是如何生成的?
2019-08-20 23:27 -
每日一问 Parcelable 为什么效率高于 Serializable ?
2019-08-26 00:02 -
2019-09-01 23:16
-
每日一问 事件分发机制大家应该都熟记于心,默认事件分发是逆序的,有哪些方法可以修改分发顺序?
2019-08-11 21:18 -
每日一问 匿名内部类访问的外部类局部变量为什么要用final 修饰,jdk8为啥不需要了? 2/3
2019-08-08 23:51 -
每日一问 AppCompatTextView 与 TextView 1/3
2019-08-07 01:29 -
每日一问 大家应该都有泛型在编译期会被擦除的概念,那么为什么我们在运行时还能读取到呢? 3/3
2019-08-04 19:44 -
2019-08-01 21:44
apk体积相比之前增加了500KB,资源没变,依赖也没变,只是拆分了module,修改了一些build.gradle的配置. 在多dex的情况下,如何分析这种问题哪?或者是大家有什么好的方式分析dex影响包大小的问题哪?
先diff看哪块变多了,大概率是dex文件变多了,R文件增加。 例如:A模块有1000个资源,会生成R文件,内部包含1000个资源id;假设现在B从不依赖A改成依赖A,那么B的R文件里面也会增加10 ...查看更多
先diff看哪块变多了,大概率是dex文件变多了,R文件增加。 例如:A模块有1000个资源,会生成R文件,内部包含1000个资源id;假设现在B从不依赖A改成依赖A,那么B的R文件里面也会增加1000个资源id。 可以拖到AS里面看看。
分析结果还真是R文件的问题,忽略了这块,感谢鸿洋大大回复
意思是如果做模块化,把资源文件统一放到一个base module中,其他依赖它的module的R文件也会相应的增加?如果是的话,有什么好的解决方案吗
你可以打包确认下,如果agp版本不高,确实是这样,R文件爆炸,可以参考:https://github.com/bytedance/ByteX/blob/master/README_zh.md 里面的 ...查看更多
你可以打包确认下,如果agp版本不高,确实是这样,R文件爆炸,可以参考:https://github.com/bytedance/ByteX/blob/master/README_zh.md 里面的shrinkR 插件
针对方法的输入参数是对象的这种情况:
void method(Person person){
person.name="xxx";}以上方法会修改person对象的值,对于此,如何理解java的参数传递都是值传递这句话?看下这个文章 https://mp.weixin.qq.com/s/VDvX537kH_Qxi4hHT49ODw
HandlerThread中的run和getLooper方法都给对象上了锁,如果getLooper比run方法更快拿到锁,会不会一直等待造成死锁问题?
isAlive() 方法可以避免这种情况吧。
即使先拿到锁,在判断到looper为null的时候,也会调用wait()方法释放掉锁,进入等待状态,等待notifyAll()的唤醒。
懂了!
Android webView框架AgentWeb 当webView页面切换到后台时,再返回前台回到AgentWeb页面会重新加载一次页面,有什么方式解决嘛?
想要在应用内监控卡顿和ANR,但是有时候并不是应用自身问题造成的,而是系统资源不足导致的,想要实时的profile系统资源,大家有什么工具或者方式去获取系统资源耗用。不考虑线上的话,工具当然很多,例如:perfetto, simpleperf,systrace, atrace这些,但是基本上都有selinux限制,有没有能在线上监控的工具?
kotlin 协程,CoroutineScope 调用 cancel() 后,无法再次执行 launch,如何理解这块。如下代码
“after cancel” 这里的代码是不会执行的~
如上代码,运行闪退。
问:为什么?报错信息里面怎么写的?
大佬们,我在 linux 上使用命令行 gradle clean build编译 android 项目一直报错,同样的项目在 windows 上就是构建过的。不知道有没有遇到过的?错误信息如下:
因为要执行静态代码扫描,所以不得不在 linux 服务器上通过命令行来构建项目通过才行。不知道有没有大佬遇到过这样的问题。
已经解决了。问题是 res.srcDirs = ['/src/main/res', '/src/main/res-light'],应该是 res.srcDirs = ['src/main/res', ...查看更多
已经解决了。问题是 res.srcDirs = ['/src/main/res', '/src/main/res-light'],应该是 res.srcDirs = ['src/main/res', 'src/main/res-light']。
Android中前后台切换监听,如果涉及到多进程如何完美的解决?
kotlin与java耗时差异问题,有如下代码:
运行结果如下:
main:0main:15请问耗时差异为啥如此之大
我觉得应该不是Java和Kotlin的区别。因为Kotlin的setOf方法,内部采用了高级for循环进行add;而Java是直接add进去;这中间就少了循环的指令开销。 ...查看更多
我觉得应该不是Java和Kotlin的区别。因为Kotlin的setOf方法,内部采用了高级for循环进行add;而Java是直接add进去;这中间就少了循环的指令开销。
因为你 排除kotlin类加载耗时干扰 这个步骤没有实现相应的作用。 SetsKt.setOf("1");这个方法调用的是SetsJVM.kt文件中的方法: public fun <T> ...查看更多
因为你 排除kotlin类加载耗时干扰 这个步骤没有实现相应的作用。 SetsKt.setOf("1");这个方法调用的是SetsJVM.kt文件中的方法: public fun <T> setOf(element: T): Set<T> = java.util.Collections.singleton(element) Kotlin的setOf方法调用的是Sets.kt文件中的方法: public fun <T> setOf(vararg elements: T): Set<T> = if (elements.size > 0) elements.toSet() else emptySet() 可以将SetsKt.setOf("1");语句替换成SetsKt.setOf("1", "2");语句,运行后可以得到相同的时间0ms。
Android中的匿名binder是何时调用IPCThreadState.joinThreadPool()方法的,
或者是说,android中的匿名binder的server端是在何时挂起自己等待客户端唤醒的?例如bindservice时,传入的ServiceConnection这个匿名的Service。每个进程对应一个ProcessState,在Service进程初始化的时候就会初始化ProcessState,调用startThreadPool,最后追溯到IPCThreadState的joinThr ...查看更多
每个进程对应一个ProcessState,在Service进程初始化的时候就会初始化ProcessState,调用startThreadPool,最后追溯到IPCThreadState的joinThreadPool bindService时,如果进程未存在,在创建Service进程时就执行了joinThreadPool
嗯。可能我的问题表达的有问题。例如我在Activity中创建了ServiceConnect,然后调用bindService。我是想问,当Service进程通过ServiceConnection通信时, ...查看更多
嗯。可能我的问题表达的有问题。例如我在Activity中创建了ServiceConnect,然后调用bindService。我是想问,当Service进程通过ServiceConnection通信时,那么这个在Activity中创建的这个ServiceConnection其实就是Server端,那么,我想知道这个ServiceConnection在创建的时候是何时调用joinThreadPool的?
你理解有问题,首先需要搞清楚binService这种方式进行跨进程通信时,到底是谁在传递数据,谁和谁交互,应该是Binder.Stub和Binder.Proxy通信,和ServiceConnectio ...查看更多
你理解有问题,首先需要搞清楚binService这种方式进行跨进程通信时,到底是谁在传递数据,谁和谁交互,应该是Binder.Stub和Binder.Proxy通信,和ServiceConnection没有关系,ServiceConnection只是当框架成功获取Binder.Proxy以后回传Binder.Proxy的一个Callback而已,而joinThreadPool是创建这次Binder线程的时候把新线程放进Binder线程池执行的操作,即获取Binder.Proxy对象时执行的
前提条件:
mView为VISIBLE状态执行:现象:
view会先执行完动画完后才GONE问题:查看源码:view.isVisible = GONE
会经历下面的流程startAnimation
会经历下面的流程:而动画执行的时机是在draw()中的
但此时不是已经为GONE了吗,为啥仍然能够显示并执行完动画才消失呢。
其实把顺序调换了,现象也是一样。感觉跟view的绘制流程有关系,但无法分析透彻,请问why?使用Flutter开发项目,进行路由跳转的时候使用Navigator.push()是无法跳转控制台输出
When the exception was thrown, this was the stack:#0 Navigator.push (package:flutter/src/widgets/navigator.dart:1793:3)
#1 Navigator.push (package:flutter/src/widgets/navigator.dart:1795:22)
#2 Navigator.push (package:flutter/src/widgets/navigator.dart:1795:22)
#3 Navigator.push (package:flutter/src/widgets/navigator.dart:1795:22)
#4 Navigator.push (package:flutter/src/widgets/navigator.dart:1795:22)
...Handler: "onTap"Recognizer: TapGestureRecognizer#b91c7 debugOwner: GestureDetector state: ready won arena finalPosition: Offset(87.3, 109.7) finalLocalPosition: Offset(40.3, 17.7) button: 1 sent tap down[√] Flutter (Channel stable, 2.2.3, on Microsoft Windows [Version 10.0.19043.1165], locale zh-CN)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)[√] Chrome - develop for the web[√] Android Studio (version 4.1.0)[√] Connected device (3 available)• No issues found!
有大佬在Google play遇到过这样的问题吗?用apk打包的时候可支持下载的Android设备有17000左右,最近Googleplay强制实行aab的打包方式,结果一提审可支持的Android设备只有2300种了,这个下跌有点恐怖啊,有大佬解决过这样的问题嘛?
代码如下
xml文件如下:
问题:当点击button时,事件传递的流向?会不会回调OnClickListener()?为什么?
``` @Override public boolean dispatchTouchEvent(MotionEvent ev) { findViewById(R.id.container).dis ...查看更多
``` @Override public boolean dispatchTouchEvent(MotionEvent ev) { findViewById(R.id.container).dispatchTouchEvent(ev); return false; } ``` 在上述代码中,看似事件分发分两步: 1.将事件分发给container ViewGroup 2.表明Activity不处理事件 ### Activity不处理事件 追踪Activity dispatchTouchEvent调用,可以看到,其来源于DecorView的dispatchTouchEvent,代码如下所示: ``` @Override public boolean dispatchTouchEvent(MotionEvent ev) { final Window.Callback cb = mWindow.getCallback(); return cb != null && !mWindow.isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); } ``` [PS:这里的cb就是Activity] 可以看出: * 如果返回false,事件将会在DecorView的父布局处理,接着向其他子节点分发; * 如果返回true,则证明Activity消耗事件,事件也不会继续向下传递 综上所述:无论这里Activity dispatchTouchEvent返回true还是false,事件均会终止,不会在想ContentView部分传递,进而这里不会触发onClick事件。 ### Container dispatchTouchEvent container对应的控件未自定义,古调用其dispatchTouchEvent,会调用其父类ViewGroup的dispatchTouchEvent方法,ViewGroup dispatchTouchEvent一共分为三大步骤: 1. 判断是否拦截事件,处理DISALLOW_INTERCEPT_TOUCH_EVENT flag和onInterceptTouchEvent 2. ACTION_DOWN事件时构建mFirstTouchTarget链表,该链表是由消耗事件的子View以及递归得到的子View的父布局构成,其中消耗事件的子View判定,是通过将屏幕坐标点转化成View坐标系后,判断该点有没有落在View内来得到结果的 3. 在经过2后,存在两种情况: * mFirstTouchTarget不为空:则说明找到了消耗事件的子View,后面来的move up事件均向该子View分发,此时遍历mFirstTouchTarget链表即可 * mFirstTouchtarget为空:说明没有子View消耗事件,那么就会将当前ViewGroup当作View来处理,事件分发至View的onTouchEvent方法中 清楚了以上dispatchTouchEvent,乍一看,这里应该可以触发onClick事件,因为我们每一步都符合要求,其实不然,我们进一步回溯mFirstTouchTarget的形成过程可以发现,一个View或者ViewGroup能进入mFirstTouchTarget肯定会造成一个唯一后果---------其父布局必然在mFirstTouchTarget链表中,假设能够正常响应onClick事件,那也就意味着button控件在链表中,进而根container ViewGroup,乃至再往上的ContentFramelayout(android.R.id.content),DecorView也在链表中,但实际情况是我们根本没有执行到DecorView的superDispatchTouchEvent方法,显然不可能构建mFirstTouchTarget链表,进而事件会被container调用view的onTouchEvent直接处理掉。 前面已经介绍了按mFirstTouchTarget链表进行推理,那么问题究竟发生在那一步呢? 没错,发生在第二步,在将屏幕坐标点转化成View坐标点后,由于缺乏关联数据,判断出来点击事件没有落在container的任何子View上,导致container调用父类的onTouchEvent消耗事件。
复制出来markdown转一下,我实在没找到怎么在这里回复的时候使用markdown
!!🆙呱呱
。。。。。
这里描述有点问题,mFirstTouchTarget是View列表,但是是多指事件的View列表,单指的情况下mFirstTouchTarget 指向的是响应DOWN事件的View ...查看更多
这里描述有点问题,mFirstTouchTarget是View列表,但是是多指事件的View列表,单指的情况下mFirstTouchTarget 指向的是响应DOWN事件的View
如何用Jetpack compose实现三角形的按钮?
图片不显示,我直接发链接吧:https://imgtu.com/i/Rs1lqK想要的效果如图。现在的UI控件不是矩形就是圆形,想做点不一样的奈何技术有限。现在的主要问题是,就算画出了三角形,阴影以及点击后的波纹依旧围绕矩形。然后因为两个控件重叠了,一定有一个控件覆盖住另一个,所以焦点的处理也是一个问题,View还好说,compose里面我还没找到完美处理焦点的方法......有没有了解compose的大佬看一下。现在开源的插件化框架有好多都挺长时间没有更新了, 还活跃的就是shadow了. 插件化技术遇到什么瓶颈了吗, 还是有了其他替代技术出现. 现在开发新项目还推荐继续使用插件化吗(国内), 有哪些推荐框架?
我觉得恰恰相反, 插件化反而没有遇到什么瓶颈, 而是太成熟了, 开源社区不那么活跃是因为技术上没什么瓶颈了, 很多公司根据业务场景从开源的上面二次开发一下成本已经很低了 ...查看更多
我觉得恰恰相反, 插件化反而没有遇到什么瓶颈, 而是太成熟了, 开源社区不那么活跃是因为技术上没什么瓶颈了, 很多公司根据业务场景从开源的上面二次开发一下成本已经很低了
JDK1.8 hashMap红黑树的删除操作removeTreeNode()的方法删除疑惑
根据(s == pr)知道s是p的右节点,是比p更大的,为什么s的右节点指向p,这样不是矛盾了吗,右节点现在比父节点更小了????
下边逻辑应该还会进行左旋操作吧,猜的
as打出来的debug包(全量包)一般比relase包要大,那么debug包比relase包多什么信息导致包体积更大?
代码压缩,移除无用资源
看如下单例实现:
volatile关键字是必须的嘛?有什么作用?不加可能会有什么问题?
自然是必须加的,主要作用就是禁止指令重排序
这东西好比去卫生间,就一个坑。坑要随时去随时能用就没必要加门把手,俩人去了抢坑又不想一起蹲那得加一个
bitmap对象的像素值在不同的系统版本里,存放的地方不一样,有的存在java层,有的存在native层,如何理解google对他的行为的变更?低版本的处理方式有什么不合理之处?如何使用高版本的处理思路优化低版本的bitmap?
先说一个事实,低版本系统硬件内存普遍较小,到了Android8之后才逐渐暴增了。 为什么说这个,因为在Android8之前,内存资源是宝贵的。 将敏感资源放到容易崩溃的地方会迫使程序员优化内存的使用, ...查看更多
先说一个事实,低版本系统硬件内存普遍较小,到了Android8之后才逐渐暴增了。 为什么说这个,因为在Android8之前,内存资源是宝贵的。 将敏感资源放到容易崩溃的地方会迫使程序员优化内存的使用,这样系统压力小很多,不然会造成别人以为安卓系统不行(那么iOS系统为什么流畅),其实是将压力施加到程序员身上。 而在Android8之后,内存资源没那么宝贵,说白了就是浪费一点没什么,同时将64位系统提上日程。
关于kotlin的可空与非可空:
1.在写代码的时候感觉是两种类型,那么他们在字节码上是不同的类型吗?2.方法的调用分为a.b(),a?.b(),a!!.b(),他们有什么区别?Android里某个子View发起重新布局或绘制时,整棵View树重新布局和绘制的上界和下界是哪里(范围)?
最近在看flutter的布局和绘制原理,flutter里某个子控件重布局或重绘时,最终都会找到布局屏障和重绘屏障以此来确定一次重布局或重绘的范围。
那么在Android中是如何的,我们知道Android里一个子View发起重布局或重绘时也是层层向上调到ViewRootImpl里开始遍历整棵树,那么最终是如何确定哪些View的layout和draw方法是需要重新被调用的?
有个dirty区域,重绘dirty区域,而且invalidate并不会引起measure,layout,draw的全流程,需要调用requestlayout才行
AndroidStduio中自动提示是如何实现的,如果我要添加一些自己的自动提示逻辑应该如何实现?
比如定义了颜色资源:
<color name="first_orange">#ff6f00</color>在xml布局文件中输入ff6f00的时候要跳出自动提示"first_orange"。
咦,这个想法很好诶,类似的还有string资源,过年回来可以考虑做个这样的插件。不过又感觉很鸡肋,应该没几个人用。。。
应该很多人想用的,但是又没人去做,比如我们项目里UI有一套视觉规范,特别需要这样一个插件
可以加个联系方式吗,如果之后有做的话哈
到时候如果做的话,做完肯定会发出来的~
一个全屏的页面(比如闪屏页)跳往一个非全屏页面(就是有状态栏的页面,比如首页),在非全屏页打开时会出现状态栏突然弹出来的闪动效果。
有没有办法让它们可以平滑过渡啊?
一个
Activity
,重复打开关闭,为什么会出现onCreate()
,onDestroy()
不相邻的情况(会出现交叉)?这是正常的吗?我是新建了一个空的工程,在
MainActivity
里一个按钮,打开MyActivity
;而在MyActivity
里有一个按钮关闭自己。然后,打印了MyActivity
的onCreate()
和onDistroy()
日志。onDestory不是立即执行的,可以参考 https://www.wanandroid.com/wenda/show/13244
谢谢大神。
怎么在线程里执行一行代码?平时直接new个Thread,专业的写法是什么
大部分博文多说 RecyclerView 替代 ListView, 通过 UI Automator viewer 发现微信的 “微信”tab fragment 中的列表还在使用 ListView。 为啥微信不用RecyclerView。
斗胆做个猜测: 微信是2011推出的App,早期的很多App都只能用ListView,至于为什么一直没替换,可能是ROI不高,即替换成本大,而且替换后并不会带来很大的收益(因为ListView本身也可 ...查看更多
斗胆做个猜测: 微信是2011推出的App,早期的很多App都只能用ListView,至于为什么一直没替换,可能是ROI不高,即替换成本大,而且替换后并不会带来很大的收益(因为ListView本身也可以手动实现一套不错的缓存机制)。 即痛点不够,还没到一定要去优化的程度,这样团队就应该去做当下最有价值的事情和解决最棘手的问题,而不是去追新。
直接调用的方法和反射调用的方法区别在什么地方,为什么同样的方法直接调用的时候不行,反射调用反而可以。
直接调用的时候api28的时候可以,29不可以,测试机是8.1,下面是示例代码:感觉好有意思,确认两个问题哈: 1. 反射的代码就是常规反射吧,没有走支持hidden api的代码吧? 2. 反射的调用在28,29都没问题,而API调用在28可以,29报错,报错是NoSuchMe ...查看更多
感觉好有意思,确认两个问题哈: 1. 反射的代码就是常规反射吧,没有走支持hidden api的代码吧? 2. 反射的调用在28,29都没问题,而API调用在28可以,29报错,报错是NoSuchMethodError?
1.或许不是认为的常规反射吧,是com.android.internal.widget.LockPatternUtils#saveLockPassword, 在https://developer.an ...查看更多
1.或许不是认为的常规反射吧,是com.android.internal.widget.LockPatternUtils#saveLockPassword, 在https://developer.android.google.cn/distribute/best-practices/develop/restrictions-non-sdk-interfaces?hl=tr&authuser=0中hiddenapi-flags.csv文件里面是黑名单 2.测试机是8.1,也就是api27,编译使用的是28,都正常运行,使用29的话,反射调用正常,直接调用崩溃。错误是: java.lang.NoSuchMethodError: No virtual method saveLockPassword(Ljava/lang/String;Ljava/lang/String;II)Z in class Lcom/android/internal/widget/LockPatternUtils; or its super classes (declaration of 'com.android.internal.widget.LockPatternUtils' appears in /system/framework/framework.jar!classes2.dex)
不知道我上面表达清楚了没有,没说明白的话,我录了个视频,https://github.com/Reginer/File/raw/master/%E6%8F%90%E9%97%AE%E8%AF%B4%E ...查看更多
不知道我上面表达清楚了没有,没说明白的话,我录了个视频,https://github.com/Reginer/File/raw/master/%E6%8F%90%E9%97%AE%E8%AF%B4%E6%98%8E.zip 传在github上,下载不了的话,私信我直接发文件
查看源码可知,8.1/9.0中该方法的返回类型为void,10.0中改为了boolean,这会影响方法签名导致找不到对应的方法
没听明白, lockPatternUtils.saveLockPassword用29来编译,怎么能调用成功
好像突然了解了,lockPatternUtils.saveLockPassword 29编译的是Boolean方法,8.1的设备对应方法是void,所以提示找不到方法 ...查看更多
好像突然了解了,lockPatternUtils.saveLockPassword 29编译的是Boolean方法,8.1的设备对应方法是void,所以提示找不到方法
哈哈,看样子解决了~
RecyclerView.Adapter setHasStableIds(true) 在什么情况下/什么场景/怎样的数据会有问题,能举个例子吗
public long getItemId(int position) { return position;}为什么 hasStableIds 默认是 false 而不是 true布局性能方面:
实现同样的圆角背景卡片 1.通过cardView实现 2.通过给布局设置shape背景实现 哪种方式性能更高呢?还可以使用Canvas 通过clipPath实现
每个问题,没人回答的能不能来一个官方回答
目前没有没人回答的问题,官方也是人呀,不一定比回答者回答的好。
小缘可能会迟到,但永远不会缺席
接口与实现的隔离,如何设计易用,健壮,可拓展的基础隔离库,例如站长的okhttputils,若切换到Retrofit即做到无缝切换也能调用如OkHttp简洁丝滑。
协程的异常捕获是怎样的?
try可以捕获所有异常么?CoroutineExceptionHandler呢?遇到了同样的问题
这个问题我也遇到了,无论是使用第三方的axios还是鸿蒙原生的Http请求都不行,可以十分确定的是账号和密码一定是对的。
众所周知,遇到双十一切换launcher icon的代码是这样的,但是代码动态切换,系统会强制关闭app才生效。
直到我看到了百度云盘的丝滑切换而且不需要重启app。是如何做到的呢在 Android 系统的开发者选项中,有一个名为“停用HW叠加层”(Disable HW overlays)的选项,如何指定某个应用或者某个 SurfaceView单独启用这个功能而不影响整个系统的设置,重金悬赏!
Android 开发SDK,如何实现SDK内部自己的联网请求,如果要用okhttp,如何避免app和SDK依赖冲突?
使用Shading, Shading可以将依赖库重新打包到一个不同的命名空间中.使用工具如shadowJar插件来实现这个功能。配置如下: 1. 添加shadowJar插件依赖 在SDK的`bui ...查看更多
使用Shading, Shading可以将依赖库重新打包到一个不同的命名空间中.使用工具如shadowJar插件来实现这个功能。配置如下: 1. 添加shadowJar插件依赖 在SDK的`build.gradle`文件中,添加`shadow`插件依赖: plugins { id 'com.github.johnrengelman.shadow' version '7.1.0' } 2. 配置shadowJar任务: shadowJar { relocate 'okhttp3', 'com.yourcompany.yoursdk.shaded.okhttp3' relocate 'okio', 'com.yourcompany.yoursdk.shaded.okio' } dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.3' implementation 'com.squareup.okio:okio:2.10.0' } 3. 在代码中使用重定位后的包名: import com.yourcompany.yoursdk.shaded.okhttp3.OkHttpClient; import com.yourcompany.yoursdk.shaded.okhttp3.Request; import com.yourcompany.yoursdk.shaded.okhttp3.Response; import java.io.IOException; public class NetworkHelper { private OkHttpClient client; public NetworkHelper() { client = new OkHttpClient(); } public String get(String url) throws IOException { Request request = new Request.Builder().url(url).build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); } return response.body().string(); } } }
有没有鸿蒙版的玩安卓,想学习一下
OpenHarmony已经开放这么久了,大家对转鸿蒙开发怎么看?
都说动态代理可以,我试了好像不行啊
View.post 和 View.postOnAnimation 都是 Android 中用于处理 UI 线程中异步任务的方法,但它们在触发执行的时机上有一些不同。
View.post:
View.post 方法允许你将一个 Runnable 对象提交到 UI 线程的消息队列,以便稍后执行。该任务将在 UI 线程的消息队列中的其他任务之后执行,但无法保证执行的时机。
这意味着,如果主线程有其他任务正在执行,post 中的任务可能要等到前面的任务完成后才会执行。javaCopy codeview.post(new Runnable() { @Override public void run() { // 在 UI 线程中执行的任务 }});View.postOnAnimation:View.postOnAnimation 是在 View 上引入的一种用于处理动画任务的方法。它允许你将一个 Runnable 对象提交到 UI 线程的消息队列,但与 View.post 不同,它会在下一帧的时候执行,通常用于处理 UI 动画的逻辑。
这可以确保任务在下一帧渲染之前执行,从而与动画的刷新频率同步。javaCopy codeview.postOnAnimation(new Runnable() { @Override public void run() { // 在下一帧的 UI 线程中执行的任务,通常用于处理动画逻辑 }});总的来说,postOnAnimation 更适用于需要与 UI 动画同步的场景,而 post 适用于一般的 UI 线程异步任务。在使用时,根据具体的需求选择合适的方法。在 ConstraintLayout 中使用 Barrier 时, 如果 Barrier 所包含的控件有 visibility 属性为 gone 的情况, Barrier约束会失效,有解决的办法吗?
最近在做SplashScreen的适配,遇到一些问题,有没有大佬指点一下。我看了一些介绍SplashScreen的文章,似乎没有办法使用一张图片作为启动图,类似微信那样的
另外我手上有一个iqoo的手机,针对SplashScreen有独立的开关,如果关闭SplashScreen,项目中使用SplashScreen就会黑屏,无法进入主页,各位大佬都是怎么适配的?
我还在用java和view画界面。。。
Android原生系统设置开发,Android O之后支持用户对应用单通知渠道(NotificationChannel)进行管理,请问有大佬知道对单渠道进行管理采用什么方式吗?小白看源码真是找不着啊。。
https://cs.android.com/android/platform/superproject/main/+/refs/heads/main:frameworks/base/services ...查看更多
https://cs.android.com/android/platform/superproject/main/+/refs/heads/main:frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java;l=3939;drc=0494b5c794ff8a9a4310c53861d905a3dd1ba1e5;bpv=1;bpt=1
SOS!c⌒っ゚Д゚)っ上述代码能够触发拦截,但是拦截后为什么不会出发onTouchEvent呢?同样的问题,下面的方式为什么就能够触发onTouchEvent?
自定义RecyclerView.ItemDecoration时,outRect.set(left, top, right, bottom),这里的left可大于right,top可大于bottom, 而按照 Rect 的官方文档说的注意事项是要调用者确保left <= right,top <= bottom, 那不是冲突了吗?这应该怎么理解?
关于java的泛型,或者是kotlin也是一样:
为何
getActivityClass2
这个的实现需要强制转换才行?如何实现使用T extends
这种模式不需要强转的方式。奔溃异常的每一行最后为什么会带有TbsSdk.java的字眼,只集成了Sentry这一类奔溃捕获框架,google了TbsSdk也没有搜索出结果,只搜索到腾讯tbs服务,但是没有继承这一框架。通过
./gradlew app:dependencies --scan --configuration normalDebugRuntimeClasspath
分析了第三方依赖,也没有看出是哪一个sdk直接或者间接引入的。堆栈如下:阿里云SDK的异常,https://github.com/aliyun/aliyun-oss-android-sdk/issues/119
最近在做html富文本渲染的内容。有多组html图文混排的富文本需要渲染,图片尺寸不一定,可能满宽也可能只有几十px。
可能这是比较老的内容了,找的很多richText都停止了维护,选用的HtmlSpanner也无法满足图片尺寸自测量的要求。
甚至还出现了严重的渲染延迟问题
有没有什么好的思路,或者有好的项目可以参考呢?
字节码相关 编译相关
最近发现一些某些第三方的 aar 包存在 this 指针被覆盖的情况比如下面这个 fragment 的 onResume() 方法,正常 this 应该是 fragment 对象,但在 64 行 astore_0 被覆盖了 mediaUtil想了解为什么会出现 this 被覆盖的情况?什么条件(编译环境)可以复现出这种情况
最后这个方法是 com/xxx/xxx/d.b:()V是 medeiaUtil的么? 这个例子,0被覆盖貌似没有逻辑被影响吧,后面没有this相关调用了。
最后这个方法是 com/xxx/xxx/d.b:()V是 medeiaUtil的 涉及到插桩兼容性的问题,如果在方法末行插桩使用 this,会报 VerifyError ...查看更多
最后这个方法是 com/xxx/xxx/d.b:()V是 medeiaUtil的 涉及到插桩兼容性的问题,如果在方法末行插桩使用 this,会报 VerifyError
那感觉只能在method enter的时候就存一下this,供后面使用了; 确实0后续不再使用了,被占用好像也合理;
测试一下提问题
哈哈,如果我说拿 targetSdkVersion 进行if,else返回对应的api是不是有点傻~不过看着是可以的
有没有大佬知道为什么Gravity的START, END这些变量的位运算做这么复杂是为啥?或者说是什么设计思路?
主要还是考虑LEFT|END,LEFT|START这种组合取值的情况吧
SurfaceView打洞的一些疑惑
我们都知道,SurfaceView是通过【打洞】的方式,使他的内容能从Activity透过来,然我们能看见。具体做法是获取当前Activity中需要透明的区域然后设置给SurfaceFlingger进行裁剪。
但是SurfaceView还有个特性是,在View层级中,在SurfaceView之上的View不会被裁剪,在它之下的会被裁减,这是如何实现的?
以上代码在创维电视机上遇到AIDL连接失败的问题,bindService直接返回false。
ActivityManager( 2469): Unable to launch app com.xxx.xxx/10035 for service Intent { act=com.xxx.xxx.service.IAAAService pkg=com.com.xxx.xxx }: process is bad
这是Android系统的限制,还是厂商自己的限制呢?有没有解决方案?
Android版本是8.0
但是之前在其他小米、TCL或者是创维其他型号的电视机上都能正常使用的。
墨水屏pad,类似一个白板功能,可以在上面写一些简单的文字之类的,但再一个笔画画玩完后,不能及时响应,延迟比较严重,正常手机使用没有问题,第一次接触墨水屏相关应用开发,各位有接触过嘛,指点一下
是卡还是延迟,不能即使响应检查下帧率呢,是不是帧率不行
确定是延迟,但系统有个note 软件只能用触控笔,使用没有延迟
延迟就说明是硬件侧识别效率的问题啊,你自己的页面,换成用触控笔,可能也没问题,手指触摸和触控笔触摸在硬件底层的识别阈值不一样估计,可以用触控笔测试下,没问题的话找厂商优化下 ...查看更多
延迟就说明是硬件侧识别效率的问题啊,你自己的页面,换成用触控笔,可能也没问题,手指触摸和触控笔触摸在硬件底层的识别阈值不一样估计,可以用触控笔测试下,没问题的话找厂商优化下
如果触控笔也有问题,那就反编译下系统的note软件看他在绘制侧是怎么实现的
发现google play上的一款应用在首次安装未打开的情况下,就能显示常驻通知,很好奇是怎么实现的,app链接:https://play.google.com/store/apps/details?id=bible.kjvbible.audio.plan.verse
2023年安卓情况
已失业
android retrofit 2.0 post请求报retrofit2.HttpException: HTTP 500 异常
小程序waiting 10多秒怎么解决啊 ,要被老板炒了
网络请求的时候
接口的问题吗
类似这样的nativie崩溃 apex/com.android.runtime/lib64/bionic/libc 该如何分辨查找或处理寻找问题的原因和如何解决
可以看看这个 https://mp.weixin.qq.com/s/IryCVONDtHS_0CJc9q63XA
Android 启动 Activity 为什么要设计成跨进程的到 AMS
在组件化过程中,会将资源文件迁移到组件中,但是这部分资源文件依然保留在主项目中成为废弃资源,大家有什么好办法或者思路高效的删除这些资源
这是跳转浏览器的多个选择,但部分手机可以实现多个浏览器选择,部分手机自动跳转默认浏览器,不能选择(是我代码写错了,还是Android高版本的修改,还是国内厂商魔改的问题)。谢谢大哥们
直接用匿名intent启动即可,为什么要将创建的匿名Intent扔进createChooser转发一道,createChooser有可能会弹出选择窗体,也有可能直接跳转 ...查看更多
直接用匿名intent启动即可,为什么要将创建的匿名Intent扔进createChooser转发一道,createChooser有可能会弹出选择窗体,也有可能直接跳转
createChooser不是可以有多个浏览器选择吗?需求就是要可以自己选择,而不是使用默认浏览器跳转(⊙o⊙)…
当有多个应用注册同一个Action响应时,你通过匿名Intent启动的时候本来就会弹框让用户选啊。你甚至可以考虑先查有没有目标浏览器,有的话指定指定调用,用默认浏览器在异常处兜底 ...查看更多
当有多个应用注册同一个Action响应时,你通过匿名Intent启动的时候本来就会弹框让用户选啊。你甚至可以考虑先查有没有目标浏览器,有的话指定指定调用,用默认浏览器在异常处兜底
最近在折腾AOSP,想到一个问题,framework.jar是APP的还是底层的,如果我们在AOSP中的Activity类中加入一行代码(打印日志),而APP不作任何调整,APP是否会运行并输出这一行日志。
通过Android Studio可以看到apk的classes.dex是包含Activity.class文件的。
然后我们修改ASOP中:/frameworks/base/core/java/android/app/Activity,新增一句日志输出测试的结果是APP都会输出这一行日志。
想不通这是为什么,毕竟被编译进APP的dex的Activity.class是没有这一行代码的。再而,如果这个Activity,或者说APP里的framework.jar 根本不会被用到,那么被编译进apk文件里的作用又是什么。并不会被编译到apk,你反编译下就知道了
谢谢大佬,反编译了一下,确实没有被编译进去。
App里面编译进的FrameWork相关类只是用于编译,apk在设备上运行时,这些类已经被加载完成了,不会再重新从应用的dex里面去加载这些类
明白,学到了!
想了解具体的加载时机可以看下AndroidRuntime.cpp的startVM方法,在这个方法里面启动虚拟机,Heap初始化的时候直接加载对应的odex和art文件 ...查看更多
想了解具体的加载时机可以看下AndroidRuntime.cpp的startVM方法,在这个方法里面启动虚拟机,Heap初始化的时候直接加载对应的odex和art文件
收到,好嘞
1.想要实现中断某一任务后续的执行。例如 Thread.interrupt()。 try catch break 跳出任务 这种操作。有什么比较优雅的实现方式吗。
thread.interrupt只是设置一个状态位,表示线程被中断,实际上线程停止需要手动在run中判断isinterrupted做处理,具体参考Thread.java源码 ...查看更多
thread.interrupt只是设置一个状态位,表示线程被中断,实际上线程停止需要手动在run中判断isinterrupted做处理,具体参考Thread.java源码
除了线程中断,有没有其他优雅的方案,你说的这个我当然知道百度一查一大堆。
emmm。 可以用rxjava 的 dispose。 dispose 可以停止事件的发送流。我之前一直以为不可以。知识学错了哎T-T
使用最新版本的webtrc集成到项目里,app启动就奔溃报错 ,错误如下
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/datatransport/runtime/dagger/internal/Factory; 请问大神们有遇到这样的错误吗,查了号多资料都没法解决反编译产物apk,看dex中是否存在包名类名相同的该文件,如果不存在,则引入implementation "com.google.android.datatransport:transport-run ...查看更多
反编译产物apk,看dex中是否存在包名类名相同的该文件,如果不存在,则引入implementation "com.google.android.datatransport:transport-runtime:3.1.8"
以前的demo,之前好好的,有一天突然就不行了,运行就崩了,错误很明显,可没搞懂为啥会这样。
报错原因是setContentView,我布局也没啥问题,错误提示如下然后我去源码里看了下,如下
瞅了下,是这个库里的
想起来我改过库的版本,赶紧改回1.4.1,问题解决。。
谁知道这咋回事,1.5.1是正式版,咋能出这么严重的错误没你的代码不能确定问题,但基本能确定的是不是库的问题,subDecor在findViewById之后肯定不为空了,而且1.4.1和1.5.1这段代码是相同的
嗯嗯,确实不是这个库的问题。因为库版本好久没更新,那天把gradle里的库版本按照提示都更新到最新,完事就出问题了。 后来发现是activity-compose库的问题,这个库的版本必须和:appco ...查看更多
嗯嗯,确实不是这个库的问题。因为库版本好久没更新,那天把gradle里的库版本按照提示都更新到最新,完事就出问题了。 后来发现是activity-compose库的问题,这个库的版本必须和:appcompat一样。
现在Google搞的这些库之间,版本之间往往有依赖关系,尽量不更新吧,如果必须要更新,建议关联的库都更新到最新版
这种代码就HandlerThread调用start方法后立马再获取looper,looper有没有为null的风险。
没有,你看下源码就清楚了。
应该可以
Android apk瘦身如何量化收益?
如更小的apk产生更大的下载量从而降低投放到目标人数成本的收益之类的,当然可能还有其他维度,如更新率等。
有现成的能参考的数据吗?最好是类似于 apk 小了 30M投放成本预估低 10% 之类的这种精细化参考数据。android13 手机的应用怎么设置强制竖屏?
我用手机测试,开启了自动旋转功能按照网上的代码都没效果,求指点 https://imgur.com/4RUdGIx
android:configChanges="orientation|keyboardHidden" //加这个也没效果
我的gradle
minSdkVersion 29 targetSdkVersion 29 versionCode 1 versionName "1.0"$ ssh -L 2080:corp-server:80 -L 2443:corp-server:443 tunnel-host -N
上面命令通过 SSH 跳板机,将本机的2080端口绑定内网服务器的80端口,本机的2443端口绑定内网服务器的443端口。上边是ssh教程里的内容,有点问题想请教下:
tunnel-host 跳板机不用账号密码的吗?用的话在哪里设置,不用的话那不是随便找个外网ip就行了?我有个外网ip好像就提供了ssh连接,还能用在这里吗?另外端口的话是上边固定的还是按自己需求的修改?比如我要浏览器上网,其他软件上网
View
的post
,postInvalidate
,postOnAnimation
,postInvalidateOnAnimation
这几个方法的区别是什么,在实际开发中如何选用?https://wanandroid.com/wenda/show/22845 有个类似的问答,可以先享用~
谢谢洋神。之前看过这个问答了,但是觉得没有说清楚了。真想把这些东西搞清楚了,使用时就不会稀里糊涂了。
为什么单击事件的任务需要判断 post 后返回 false 的情况,而长按事件的任务却不需要判断 post 后返回 false 的情况?
单击事件:
长按事件:
Boolean option¼ ç æ æ ä¸ å ¾ä¸ç :app:kaptGenerateStubsDebugKotlinç æ ¶é ´
. Using default valuetrue
instead.kapt.use.worker.api
was set to an invalid value:true //å¹¶è¡ è¿ è¡ kapt1.2.60ç æ ¬ä»¥ä¸ æ ¯æ
. Using default valuetrue
instead.Boolean optionkapt.incremental.apt
was set to an invalid value:true //å¢ é ç¼ è¯ kapt1.3.30ç æ ¬ä»¥ä¸ æ ¯æ
. Using default valuetrue
instead.Boolean optionkapt.include.compile.classpath
was set to an invalid value:false //kapt avoiding å¦ æ ç ¨kaptä¾ èµ ç å 容没æ å å ï¼ ä¼ å® å ¨é ç ¨ç¼ è¯ å å®¹ï¼ ç æ æ ä¸ å ¾ä¸ç :app:kaptGenerateStubsDebugKotlinç æ ¶é ´
. Using default valuetrue
instead.Boolean optionkapt.use.worker.api
was set to an invalid value:true //å¹¶è¡ è¿ è¡ kapt1.2.60ç æ ¬ä»¥ä¸ æ ¯æ
. Using default valuetrue
instead.Boolean optionkapt.incremental.apt
was set to an invalid value:true //å¢ é ç¼ è¯ kapt1.3.30ç æ ¬ä»¥ä¸ æ ¯æ
. Using default valuetrue
instead.`不生效的解决方式
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"}-Dfile.encoding=UTF-8
等有缘人来指导
使用V2签名 如果META-INF中的
.SF
、.MF
、.RSA
文件丢失 apk还能正常安装和使用吗?有人回答下不.
没人吊我。。。ai
因为协程的域结束了,这个协程已经结束了,下次创建的时候,建议重新创建新的。 还是有人吊你的
好的,似乎明白了.
各位好,麻烦请教几个问题,感谢大家回复:
怕是你的上下文被引用,也就是可能内存泄漏,可以找下这方面的问题。 可以看下这篇文章的第三个问题:什么时候 ViewModel#onCleared() 会被调用 https://juejin.cn/p ...查看更多
怕是你的上下文被引用,也就是可能内存泄漏,可以找下这方面的问题。 可以看下这篇文章的第三个问题:什么时候 ViewModel#onCleared() 会被调用 https://juejin.cn/post/6975869273138790430 希望可以帮到
我再看下,现在主要是没有被调用
Java版本 在使用 BaseRecyclerViewAdapterHelper 这个库时 重写这个方法时
@Overridepublic void onViewHolderCreated(@NotNull BaseViewHolder viewHolder, int viewType) { DataBindingUtil.bind(viewHolder.itemView);}github也有人类似的问题
DataBindingUtil.bind(viewHolder.itemView) 很奇怪,使用android studio Arctic fox 以上版本都会报错,但能正常运行, 这个版本及其一下都没问题。哪位大神知道原因 不止这一个方法 很多方法都找不到了 如在 convert 中 找不到 holder.getLayoutPosition()方法也是同样的问题新建工程,写个简单的 demo,是不是还有这样的问题?
会有,使用kotlin 任何版本android studio 都没问题
为什么动态代理生成的实例equals自己返回false
印象中,这个o.toString()返回的是null
不是toString问题,是equals应该如何实现,才能在容器中去重,目前想到的是重写equals方法,使用hashcode比较。 另外o的类型是com.sun.proxy.$ProxyX和thi ...查看更多
不是toString问题,是equals应该如何实现,才能在容器中去重,目前想到的是重写equals方法,使用hashcode比较。 另外o的类型是com.sun.proxy.$ProxyX和this的类型不一致,但hashcode和toString是一致的
o.equals(o) 调用的是动态代理类里面的 equals 方法: public final boolean equals(Object var1) throws { t ...查看更多
o.equals(o) 调用的是动态代理类里面的 equals 方法: public final boolean equals(Object var1) throws { try { return (Boolean)super.h.invoke(this, m1, new Object[]{var1}); } catch (RuntimeException | Error var3) { throw var3; } catch (Throwable var4) { throw new UndeclaredThrowableException(var4); } } 接着会调用处理器的invoke方法,在 invoke 方法里面,this 是调用处理器对象,args 里面是 o(动态代理对象)。所以返回 false。
targetSdkVersion和compileSdkVersion这两个有什么区别呢,网上很多文章说没有关系。比如Android 12上的蓝牙权限我不想适配,targetSdkVersion保持28,compileSdkVersion升到31,但是在12的设备上还是崩溃了。只有compileSdkVersion降到31以下才正常。但是不是应该跟targetSdkVersion有关才对嘛
targetSdkVersion是你最想保证在哪个版本下(以下)正常运行,在系统内,有部分framework的api会判断这个版本,做区别对待,如果没做区别对待呢,那么大部分都是异常,而现在的系统基本 ...查看更多
targetSdkVersion是你最想保证在哪个版本下(以下)正常运行,在系统内,有部分framework的api会判断这个版本,做区别对待,如果没做区别对待呢,那么大部分都是异常,而现在的系统基本很少做区别对待,所以提出的建议是,用你能达到的最高的版本做targetSdkVersion。 compileSdkVersion是采用哪个版本的sdk来参与编译apk,设置的话compileSdkVersion只会比targetSdkVersion高,但是推荐它俩相同,用最高的sdk版本
Databinding每次使用都是binding.控件名称大量重复代码,有什么方法可以像kotlin-android-extensions一样直接id找到控件呢?
目前还是没有别的方法,bingding算是一个官方支持吧
CameraService中在android S上新增了Camera3Device::Camera3DeviceInjectionMethods文件,请问关于这个文件的是为了解决什么问题做的
使用MediaCodec编码MediaProjection生成的录屏数据,在推送这些帧数据的时候怎么控制码率,在我的同屏项目中很容易就会达到1M多每秒,请问需要如何配置才能降低?现在我如果同屏几十台的话会明显的延迟严重。
我编码时的format配置:可以问一些冷门 API 比如 android:directBootAware 这个属性~
附上官方文档 https://developer.android.com/training/articles/direct-boothttps://source.android.google.cn/security/encryption/file-based.html?authuser=1想请教下一个场景,假如说统计项目中所有Button的点击事件,大佬们一般都是怎么解决的,来讨论下,最好的话代码量少,入侵小甚至是无入侵
你如果只是做测试的话可以用我的库, https://github.com/canyie/pine ,hook View.performClick 这个方法就好了
https://github.com/panthole/CanRecyclerView
--- 一个RecyclerView的扩展使用库。可以扩展为viewpager使用注意:只有想法,不懂原理,没有技术,看看想法是否能实现
今天看到这个,用RecyclerView实现ViewPager的效果,是不是可以用RecyclerView嵌套RecyclerView替代ViewPager+Fragment,
1.懒加载可以获取当前可见的Item实现
2.生命周期可以根据RecyclerView Item的状态,位置实现?3.RecyclerView的优点就不用说了,但是这些优点是否能成为孵化这个项目的缺点?是否能解决?你去看看ViewPager2吧
智慧屏有个渐变的光圈焦点框很好看,请问安卓有实现方法吗
Android中webview加载报错 ERR_SSL_VERSION_OR_CIPHER_MISMATCH,请问各位大神这个该如何解决
我想问个问题,在一个带EditText的DialogFragment中,点击EditText的时候,会弹出软键盘,这个时候软键盘会把整个DialogFragment顶起来,我不希望它被顶起来,目前试了很多SoftInputMode都无效 ,该怎么办?
SoftInputMode 设置在外层activity上,还是dialog的getWindow()上?
外层Activity在AndroidManifest.xml中配置 和 dialog里面getwindow()动态设置的方式都不行,两者同时设置也不行。
android如何动态更新logo图标?服务器图片更换。
目测现有技术只能通过activity-alias内置发应用版本解决,应该不能做到不发版自动替换,低版本可能能使用ShaortCut的功能实现
Activity onCreate中有如下代码
打印日志如下:
Activity源码如下:
performResume方法中第一行代码已经优先执行并回调了onActivityPreResumed,后面才去回调了preOnStart,onStart,postOnStart,为什么我打印的日志出来执行的顺序跟代码执行顺序是不一样的????求解答!!困扰两天了,没找到相关代码
求大佬解答!!
附带下源码版本吧~
是我源码解读的有问题,早上来重新略了一遍,发现问题了, 我上边说的执行逻辑是不对的,onStart相关的是在TransactionExecutor这个类里边的performLifecycleSeque ...查看更多
是我源码解读的有问题,早上来重新略了一遍,发现问题了, 我上边说的执行逻辑是不对的,onStart相关的是在TransactionExecutor这个类里边的performLifecycleSequence去执行的,这新版源码写的是真好(* ̄︶ ̄)
如果你看的代码版本是28之后的,那就是onActivityPreStarted、onActivityStarted这些方法会在TransactionExecutor的performLifecycleS ...查看更多
如果你看的代码版本是28之后的,那就是onActivityPreStarted、onActivityStarted这些方法会在TransactionExecutor的performLifecycleSequence方法里先回调。原因当system_process那边发过来resume信号,这边会判断出中间空缺的生命周期,会在处理resume之前补上,这个问题的第四个回答有详细分析:https://www.wanandroid.com/wenda/show/12574。至于你说的performRestart在dispatchActivityPreResumed之后调用,请注意:performRestart方法主逻辑,是在mStopped==true的前提下才会执行,也即是在Activity下次stop之前,主逻辑只会执行一次,所以如果performRestart在performResume之前就执行过一次,这里自然就不会继续执行了。
打完字发现你已经知道了。。。
哈哈哈哈 谢谢大佬帮助分析,理解的更透彻了一些
获取手机型号厂商等信息,如何判断是伪装机型?怎样可以判断是应用分身?
如图所示,我们的应用结构可能和 pad 有点类似,中间一个 container 是经常被替换的。othder fragment 是常驻的,例如左侧的菜单动画效果和底部唱片旋转效果都是在 othder fragment 常驻,这个时候 container 里面的 fragment 如果是没有常驻在内存里面去(冷启动),页面打开的一瞬间是执行的动画会卡顿的,卡顿一瞬间正常恢复,不知道对于这种常驻动画被其他页面启动时候所占用的资源开销导致的卡顿有没有好的办法或者建议?
第一次加载Fragment进ContarinerFragment时,进行比较多的耗时操作了吧
最近新建项目使用databinding总是这个错但程序可以正常运行看着很烦是as的bug嘛?错误提示:Cannot access 'androidx.databinding.Observable' which is a supertype of 'com.russ.beatbox.databinding.MainActivityBinding'. Check your module classpath for missing or conflicting dependencies
https://blog.csdn.net/qq_26413249/article/details/118544920
之前就看过了 然而并没有什么卵用
sourceSets { main{ java.srcDirs += ['build/generated/data_binding_base_c ...查看更多
sourceSets { main{ java.srcDirs += ['build/generated/data_binding_base_class_source_out/debug/out'] } }
想问一下在Android10之后,getProcessMemoryInfo.getTotalPss()这个方法每5分钟才能刷新一次内存信息。有没有什么方法能够绕过这个限制或者强行获取?(dumpsys meminfo就能做到,但是这个会造成其他影响,所以这边不考虑这个)
Debug.getMemoryInfo(memoryInfo);
这个确实是可以,但是不能够获取指定的包名或者pid的内存,类似dumpsys meminfo <package-name/pid>这种。想问问有没有什么办法。之前我用的app_proces ...查看更多
这个确实是可以,但是不能够获取指定的包名或者pid的内存,类似dumpsys meminfo <package-name/pid>这种。想问问有没有什么办法。之前我用的app_process也没法绕过5分钟刷新信息的问题。
PostInvalidateOnAnimation 和 postInvalidate 有啥区别
R.layout.inflate_layout
Java
Q: root is instanceof FrameLayout or ViewPager?
RecyclerView 中的观察者模式,是始终只会存在一个观察者嘛?
我在查看 setAdapter() 的过程中,发现会先查看是否设置过 Adapter, 如果设置过会注销观察者,然后注册观察者。如果只存在一个观察者的话,那么我想请问 RecyclerView 中使用观察者的思想是?Java 中的密码优先使用 char[] 而不是 String(memory dump 泄密),那么从 EditText 到与服务器交互该如何传递密码才能规避这个安全问题?
真要较真的话,目前倒是有两个思路,不过都要协同后台修改。 1. 使用校验码(短信、邮箱、电话实时下发) 2. 使用md5
想做一个半透明的遮罩层,控制夜间的亮度,看了已经上架的几个应用都使用到了无障碍服务来是遮罩层覆盖下拉的通知栏和虚拟导航条,请问这是怎么实现的?
开启后开启前构建了一个android模块库,它的接口声明如下:
编译项目,然后从build/outputs/aar/目录中获取.aar文件。然后将.aar导入到带有import.jar或.aar包的项目中。将它设置为一个模块依赖项,并将接口导入到一个要使用它的类中。
问题是,当使用导入的接口时,自动完成功能不会使用我在构建库时设置的描述性名称来完成接口变量。在导入的.aar文件中的接口声明中,发现:
怎样才能得到接口方法参数为
String returnedId
,而不是String var1
?之前一直以为是混淆导致的,实际上跟混淆没有关系,因为不混淆的aar也是这样的。
ViewGroup
的measureChild
方法和measureChildWithMargins
方法的区别是什么,如何在实际开发中决定选择使用哪一个?这个方法一般在自定义viewGroup用到,用的是后者带margin, 前者基本没什么作用,毕竟margin需要考虑进去以计算总的尺寸。
1.低功耗蓝牙连接时,在 onConnectionStateChange 方法中 status 返回133,出现的原因及处理方法?
2.低功耗蓝牙通信时,在 onCharacteristicWrite 方法中 status 返回134,出现的原因及处理方法?
想问一下,为什么设备时间不对,获取到下载文件的 content length 就为 -1;而把设备时间调整好,获取到下载文件的 content length 就正常了?
要不你先问问你们后台?
大佬请教个问题:activity的启动流程(从Launcher到activity的onCreate)用了几种跨进程通信方式?以及为什么要这么做?
这是你该考虑的问题吗
android button 给定宽高,里面显示的文字超过一行的宽度,为什么有的长度文字可以换行,有的长度文字就不会换行?
上面的代码会有什么问题?
为什么会出现这种问题?这个问题的本质是什么?线上数据库,大量的-mj 后缀文件是日志文件吗
java方法里的MAXSTACK具体代表啥啊?
一道Google工程师被坑过的题:
binder中,一个线程发起同步(非oneway)的跨进程调用一定会 block 到远端进程返回之后才能执行其他代码吗?如果不一定,什么时候会发生这种情况?(^_^)
Object和null取值的区别吧
null 有可能是一个初始化后的值
View.setVisibility()和Drawable.setVisible()
View.getVisibility()和Drawable.isVisible() 有啥区别?望大神们指教JVM中的synchronize关键字,如果锁的是对象的话是通过对象中的monitor锁实现的,如果锁的是类,底层的实现原理是什么?
锁普通对象和class对象底层原理一样,反编译字节码都有monitorenter和monitorexit指令。synchronize关键字的区别在于是修饰代码块还是方法,修饰方法是在它的访问标志符上添 ...查看更多
锁普通对象和class对象底层原理一样,反编译字节码都有monitorenter和monitorexit指令。synchronize关键字的区别在于是修饰代码块还是方法,修饰方法是在它的访问标志符上添加一个ACC_SYNCHRONIZED标志。访问方法时,会检查这个标志。
android{
resourcePrefix 'somePrefix'}请问加了这个之后如何使得编译期若有不符合要求的终止编译呢添加自定义lint检查
面试有人问我,聚合sdk 依赖 a b c d 四家广告 sdk,怎么样实现动态打包不同家的聚合sdk?
打包命令传入不同的配置参数
Android退到后台,过一段时间后回到前台,Application可能重走onCreate,那么Application具体是如何重建的?重建会重新从启动页开始还是会恢复到之前退到后台之前的Activity?
Application重走onCreate意味着已经进入冷启动过程了歪
如下kotlin代码:
1.如上代码执行会报空指针吗?在哪一步包空指针
2.为什么会报空指针?3.如何规避这个问题?4.这算是kotlin编译的bug吗?开发的小程序登录api为什么在本地写的登录项目中一直提示错误为 账号和密码不匹配,错误为 -1
建议先通过postman等跑通接口,再实际使用。 不匹配确实是不匹配。
已经解决了,是请求头格式的问题
想到一个问题,为什么android要通过接口去拿数据,自己直接去请求数据库不可以吗?仅仅是因为安全的原因吗?
想知道 Retrofit 为什么要使用运行时注解, 而不是使用编译期注解,百度和谷歌都查过但是没有很好地解释,唯一一个答复说是, 运行时反射的耗时和 网路请求的耗时相比可以忽略不计,就算是湖绿不计但是编译期的注解应该也能更好,所以想在这里提出我的问题"Retorfit 为什么不在编译期处理注解,而是要是运行时进行处理"
日志:
运行时间1:2349 ms运行时间2:71 ms这是为什么?理论上 String.format效率应该高于+肯定不是啦,理论上也是 + 效率高于format,+的原理你应该也知道,编译之后会替换成StringBuilder。String.format内部同样也是通过StringBuilder来拼接的,相比于 ...查看更多
肯定不是啦,理论上也是 + 效率高于format,+的原理你应该也知道,编译之后会替换成StringBuilder。String.format内部同样也是通过StringBuilder来拼接的,相比于 + 直接拼接,它还要处理%d %s这些占位符,会创建很多辅助的对象。如果你很看重这点效率,那就不应该使用String.format。format的优势是可以很方便地使用模板字符串,特别是对于那些有多个变量的字符串
编译器只能够做到显示的字符串加的时候用StringBuilder,循环体字符串添加不会被优化。比如下面这个就不会优化: for(int i = 0; i < 100; ++i) { a ...查看更多
编译器只能够做到显示的字符串加的时候用StringBuilder,循环体字符串添加不会被优化。比如下面这个就不会优化: for(int i = 0; i < 100; ++i) { a = a + i; }
循环体里+字符串不会被优化,指的是在编译成class后不会替换成StringBuilder?谁说的?肯定会替换的啊,不然怎么实现的拼接
我怀疑是因为注解里面的值可以不是final,所以用的运行时注解。
刚哥你是不是回复错地方了啊?
卧槽,我记得我回复的是个什么retrofit运行时注解啊
大佬,注解 和 final 有啥 关联 或者有啥约束关系? 百度了一下没查到
为啥淘宝、闲鱼使用LibChecker app 查看是同时使用了Flutter、ReactNative
在 groovy 中,有一个 methodMissing 的机制,主要是为了灵活性,防止调用者想使用的方法没有被添加/申明 而导致异常,比如我们的 compile,api 等都是通过这种机制做的转换,有同学清除官方为啥要用这种机制,而不是直接采用直接编写方法么?
安卓可以禁用第三方键盘,只用系统键盘吗
可以,DevicePolicyManager#setPermittedInputMethods
具体咋搞啊
使用RandomAccessFile保存20多个1M左右的图片合适吗?不合适的话为什么?合适的话怎么做?
网络请求回来的ByteArray,可能是我使用方式有问题,对比使用标准IO流,使用RandomAccessFile保存操作很慢。
众所周知,SQLite是不可以进行多线程读写的,大概的冲突是:
读 + 写 = 冲突
读 + 读 = 不冲突写 + 写 = 冲突那么请问,在Google官方的数据库框架 Room中,是用什么样的方案处理这个冲突的呢?或者大家都在用哪种方案来解决这种冲突的呢?
各位在Android里写model的时候是习惯加private 然后生成get set方法吗
打印一个touch事件具体消费的view,要求实时打印,可作为组件注入到App中,方便调试使用
每当内存不足页面被杀死时会调用onSaveInstanceState方法,outState大小都会增加,最终会导致产生TransactionTooLargeException异常,请问是怎么回事?我现在的做法是当outState大小达到300k时调动outState.clear()来处理
很迷惑,感觉是 FragmentController#saveAllState 导致的
Recycler列表的item中嵌套一个Recycler做翻页的组件效果,现在我滑动任意一个item的这个翻页,所有的item要同步滑动翻页,这个有没有什么思路?能不能用PagerSnapHelper来做?
求解答:
首页面A设置了android:launchMode="singleTask"然后跳转到第二个页面B,点击home键回到桌面。
然后找到app的图标点击再次进入,会发现不是页面B而是页面A。
这种情况咋解决?
google 黄油计划通过 vsync 和多缓冲来解决掉帧问题,其中的多缓冲指的是 framebuffer 还是图像绘制缓冲区呢?
喔?居然没有人回答?我自己研究了一下,不知道正不正确。粗略来看,我觉得黄油计划的多缓冲机制就是指的绘制缓冲区,即 BufferQueue,准确一点来讲应该是 BufferQueue 和 framebu ...查看更多
喔?居然没有人回答?我自己研究了一下,不知道正不正确。粗略来看,我觉得黄油计划的多缓冲机制就是指的绘制缓冲区,即 BufferQueue,准确一点来讲应该是 BufferQueue 和 framebuffer 一起构成的。framebuffer 是当前显示缓冲区,一般由 backbuffer 和 frontbuffer 组成;BufferQueue 组成绘制缓冲区队列,一般有两到三个缓冲单元,绘制完成的帧要从 BufferQueue 合成到 backbuffer 然后再和 frontbuffer 交换显示。可以说,backbuffer 和 BufferQueue 中最近的一个缓冲单元是重合的。具体的细节比这更复杂,简单描述了一下大概。
子view消费了down事件后,后续的事件序列是否都会经过ViewGroup的onInterceptTouchEvent?
在viewGroup的源码中:关于拦截有如下代码
简单来说,down事件或者mFirstTouchTarget!=null,在子view没有设置禁止拦截标志的情况下会调用onInterceptTouchEvent方法,也就是viewGroup可以拦截子view的move事件。这个mFirstTouchTarget就是子view和触控点绑定的对象。当一个view消费了down事件后,viewGroup就会为他生成一个TouchTarget,并连接到mFirstTouchTarget后(这个mFirstTouchTarget是个链表)。所以在没有设置禁止拦截标志的情况下,消费了down事件的子view接下来的事件都会经过onInterceptTouchEvent,事实上真的如此吗?我做了一个日志打印。
布局很简单,外层是LinearLayout,我重写了onInterceptTouchEvent方法,仅仅加入日志打印代码,如下:
内层是ListView,重写了dispatchTouchEvent方法,加入了日志打印和设置禁止标志位false:
按照正常的情况,两个打印的数量应该是一致的,结果如下图(我特意设置了其中一个打印的级别是error,这样可很明显看出两者的数量差别):
从上图我们可以看到,在子view消费了第一个和down位置不同的move事件之后,接下来的move事件不会再经过onInterceptTouchEvent方法了。嗯??这怎么跟我们的源码分析的结论不同?那这是怎么回事呢?
经过验证是内部listView导致的外部viewGroup无法拦截事件,那么问题来了,到底是listView的什么原因导致的?
主要是因为在滑动事件时,ListView调用了requestDisallowInterceptTouchEvent
可以修改系统默认弹起白名单的对话框吗?一点击就消失了,样式也和项目对话框风格不一致
线程请求数据等待3秒,收到数据立马响应并进行ui操作,3秒之后提示请求超时。
想知道我这样写有没有啥问题,有没有更好的办法Android获取通话记录在双卡机型上有什么办法判断该条通话记录是属于哪张卡的吗?
有在TV上用过bugly热修复的同学吗?手机和模拟器都能下发成功,也能修复bug生效,但是TV和盒子上一直运行失败???提示下发成功,就是没有生效~~
我想 debug androidx 下面的
ViewPager
模块的代码,现在是把 androidx 下面的ViewPager
代码按照原来的目录放在一个 module 里面依赖,期望地是,在这个module里面打印的日志可以出来,以及点击主工程的ViewPager
可以直接跳转到这个 module 里面,但是实际上日志也打不出来,跳转还是跳转到 external libraries 的依赖里面去了。其实,就是想让自己的这个 module 替代依赖的ViewPager
源码,请问有没有什么解决办法?自己尝试的办法是:
但是,不起作用。
发现自己 exclude 部分写错了,下面这样是好的: ```gradle api ('androidx.appcompat:appcompat:1.2.0') { exclude group ...查看更多
发现自己 exclude 部分写错了,下面这样是好的: ```gradle api ('androidx.appcompat:appcompat:1.2.0') { exclude group:'androidx.viewpager',module:"viewpager" } api ('com.google.android.material:material:1.2.1') { exclude group:'androidx.viewpager',module:"viewpager" } ```
Android如何判断进程是开机之后的第一次启动??
SurfaceFlinger进程为什么不是通过Zygote进程的fork创建,而是由init进程创建?
每日一问 | 当Unsafe遇上final,超神奇的事情发生了?
先来看一段代码:
问题来了:
1. Test.a
能被替换吗?2. Test.
a
能被替换成B对象的实例吗?3. 如果问题2成立,在成功替换对象之后,调用Test.a.
selfIntroduction
方法,返回的是什么? 为什么会这样?把代码稍微改一下:
4. 在成功替换对象之后,调用Test.a.
selfIntroduction
方法,返回的是什么? 为什么?再把代码改一下:
5. 在成功替换对象之后,调用Test.a.
selfIntroduction
方法,会报错吗? 为什么?继续改一下代码:
6. 在成功替换对象之后,调用Test.a.
selfIntroduction
方法,会报错吗? 如果不会报错,返回值是什么? 为什么会这样?再改一次代码吧:
7. 在成功替换对象之后,调用Test.a.
selfIntroduction
方法,会报错吗? 为什么?属性动画repeatMode = ValueAnimator.REVERSE做重复动画,为什么有时animatedValue无法返回设置的终点值?使用的插值器是AccelerateInterpolator
想请教个问题,关于Android10作用域的
Android10开了作用域分区存储,我们app原本有一个缓存文件夹是放在SD卡上的,这样用户卸载了,重装的时候,数据可以还原回来。到Android10,沙盒机制,如果放到沙盒里面,用户数据肯定还原不回,知道Android10还可以配置“android:requestLegacyExternalStorage="true"”,打开兼容模式,这样还是可以继续用之前的。但公司要求必须适配... 没办法,知道除了沙盒,可以存放数据在公共目录下(图片、视频、音频、下载这些),尝试了一圈,应用自身的可以正常增删改查,但是有个坑爹的问题,如果用户卸载了应用,重装安装,之前的缓存文件就没有访问权限了,要访问,需要申请“READ_MEDIA_IMAGES”之类的权限,会弹出到前台,等待用户授权,我们只是为了缓存用户数据,这样感觉侵入性很大。而且这样适配下来,如果用户不授权的话,感觉不如直接缓存在内部了,sp之类,没有存储在外置SD卡的补充。比如在下载目录缓存了一份文件“cache.txt”,用户卸载重装之后,对“cache.txt”这个文件没有了访问权,读取不出里面的缓存数据 (下载目录还没有相关的请求权限,必须使用系统的选择器...) 所以主要是几个点: 1、最主要的需求点,是希望在Android10上面,用户卸载重装了,不需要用户另外授权,可以正常读取缓存数据,和Android10之前,数据存储在SD卡上一致。这点可不可行? 2、如果可行,具体应该选择哪个公共目录 3、怎么进行实现?给出的解决方案可能不是你想要的,但是是这种问题的可行性解决方案,如果你的app只是个普通应用的话。 谷歌之所以增加这个限制,就是为了杜绝类似你的这种想法。 一种解决办法是,将想重装后直接读取的数据传到 ...查看更多
给出的解决方案可能不是你想要的,但是是这种问题的可行性解决方案,如果你的app只是个普通应用的话。 谷歌之所以增加这个限制,就是为了杜绝类似你的这种想法。 一种解决办法是,将想重装后直接读取的数据传到服务器,重装之后同步下来
这种方法是一直方案,只是可行性可能不是很大。重装之后,服务器同步下来,这有个前提,服务器必须可以辨识出来用户的设备,知道它是谁。这种应该就必须结合用户机制之类的来进行,不然在Android10已经很难 ...查看更多
这种方法是一直方案,只是可行性可能不是很大。重装之后,服务器同步下来,这有个前提,服务器必须可以辨识出来用户的设备,知道它是谁。这种应该就必须结合用户机制之类的来进行,不然在Android10已经很难标识出设备了
之前想到一个简单但是挺好玩的问题:
大家都知道的,在java中,异常分为两类,一类叫Checked Exception,一类叫Unchecked Exception;但是如下代码可无视checked exception限制强行抛出异常:它的原理是什么?
这个问题没有看明白~~
比如throw new IOException(),一般情况下需要在方法上加throws IOException或者加try-catch捕获住,但是使用我这个throwNoCheck就不需要这些,可以 ...查看更多
比如throw new IOException(),一般情况下需要在方法上加throws IOException或者加try-catch捕获住,但是使用我这个throwNoCheck就不需要这些,可以像RuntimeException一样直接抛出
在当前页面调用上一个页面里的ListView的smothScrolltoPosition滚动到指定位置,为什么等到我返回上个页面后才执行滚动效果,这背后是什么原理?延伸出来,如果我在当前页面操作了上个页面的一个动画,那么会怎么表现呢?
能不能系统的讲一下Android是怎么调度允许的。比如说启动一个activity的大致流程,系统做了什么?不需要太详细,有一个主要的流程就可以
若干个问答之间有衔接性,组成一个知识点。
考虑出api吗?想在app上看问答。或者网页试配下手机端。
如何才能让动画更流畅?我遇到的问题是,我想在一个平移动画上加入缩放动画(不是同一个View),都是通过不断修改属性然后requestLayout来实现动画,但这样动画不流畅,请问怎样才能让多个动画流畅运行不互相影响呢?
我怎么发起提问?
android 中还有哪些好用的辅助类,例如ViewDragHelper这样的
建议来点性能优化方向的探讨。
emmmm.... 问题挺多的。先这样。
在 Android 的事件传递机制中, 假如一个页面有大量的控件(比如100个),如何快速查找到当前消费事件的 的 控件的? 又如何快速查找控件会消费事件? Google 是如何设计的?