- 博客(249)
- 收藏
- 关注
原创 android studio签名打包详解,android内存优化方案
意思我们需要给release版本绑定签名文件,如图,把签名的配置填写完整,点击ok之后会在build.gradle里面生成一个signingConfigs {release {storeFile file(‘buildkey/xxxx’)storePassword “xxxxx”keyAlias “xxxx”keyPassword “xxxx”}buildTypes里面的release 里面加上 signingConfig signingConfigs.release然后就会正常了!!
2022-03-07 19:34:59 409
原创 Android Studio真机 设置 和 错误排查,2021Android大厂面试经验
(拿小米(5X)手机为例)到手机设置 - 我的设备 - 全部参数 - 连续点击MINU版本即可开启开发者模式(针对未开启 开发者模式)到手机设置 - 更多设置(系统和设备)- 开发者选项 - USB调试 - 勾选 - USB安装 - 勾选。第二步:Android Studio设置开启Android Studio,新建一个简单的工程。选择Edit ConfigurationsDeployment Target Options 选择USB Device - 点击OK,保存更改第三步:运行程
2022-03-07 19:33:34 437
原创 Android Studio中配置及使用OpenCV示例(一),安卓开发自学技巧
1)compileSdkVersion2)buildToolsVersion3)minSdkVersion4)targetSdkVersion(将其内容与app文件夹下的build.gradle中信息相一致)如下图所示:然后点击Gradle进行同步(Sync Gradle)。4、添加Module Dependency=========================选择File —>Project Structure,在app module的Dependencies一栏中,点击右上
2022-03-07 19:32:09 774
原创 Android PackageInstaller:安装应用的应用,移动终端开发
mAppInfo = null;}} catch (NameNotFoundException e) {mAppInfo = null;}mInstallFlowAnalytics.setReplace(mAppInfo != null);mInstallFlowAnalytics.setSystemApp((mAppInfo != null) && ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0));star
2022-03-07 19:29:18 1096
原创 Android 人脸识别,2021大厂Android知识点总结+面试题解析
}}).show();}public void showMessage(String message) {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage(message).setPositiveButton(“Ok”, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterfac
2022-03-06 14:57:42 563
原创 Android Touch事件分发(源码分析),android蓝牙开发框架
* 1、如果事件为DOWN事件,则调用onInterceptTouchEvent进行拦截判断;* 2、mFirstTouchTarget!=null,代表已经有子View捕获了这个事件,子 View 的 dispatchTouchEvent 返回true就是代表捕获touch 件。*//*** 二、将事件分发给子View* 满足条件canceled和intercepted都为false,既不取消也不拦截*
2022-03-06 14:53:26 246
原创 Android SDK 提供的3套音频播放的API之玩转SoundPool,面试流程4轮技术面+1轮HR
1、SoundPool的使用1.1、准备音频资源将准备的音频文放入assets文件夹下或者res下的raw文件夹下:assets下可以再新建文件夹批量加载,而raw只能同级存放单个加载;在assets内部单个文件超过1m时可能存在bug,在raw资源目录下不会存在;SoundPool的音频文件大小不能超过1M同时时间超过5-6秒可能会出错。1.2、SoundPool的构造方法SoundPool(int maxStreams, int streamType, int srcQua
2022-03-06 14:52:01 4940
原创 Android Q深色模式及源码解析,实战解析
//frameworks/base/libs/hwui/renderthread/RenderProxy.cppvoid RenderProxy::setForceDark(bool enable) {mRenderThread.queue().post(this, enable { mContext->setForceDark(enable); });}这里从MainThread post了一个调用CanvasContext成员函数setForceDark的任务到RenderThread渲染
2022-03-06 14:50:36 4909
原创 Android MemoryFile内存文件 + Ashmem匿名共享内存,flutter瀑布流布局加载更多
} finally {endAccess();}}JNI:./frameworks/base/core/jni/android_os_MemoryFile.cppnamespace android {static jboolean android_os_MemoryFile_pin(JNIEnv* env, jobject clazz, jobject fileDescriptor,jboolean pin) {int fd = jniGetFDFromFileDescriptor(env,
2022-03-06 14:49:11 376
原创 Android Jetpack 架构组件最佳实践之“网抑云”APP,2021吊打面试官系列
一、初识ConstraintLayout之实现登录页面1.创建项目2.沉浸式的布局3.富文本4.属性动画二、Navigation实践之实现APP主框架以及Navigation的相关介绍1.搭建 Bottom Navigation Activity2.导航界面跳转3.Navigation传值4.Navigation跳转动画5.导航文件拆分6.Deeplink导航三、使用 Coroutines, Retrofit, Moshi实现网络数据请求1.kotlin - Corout
2022-03-06 14:46:21 269
原创 Android Jetpack Compose Paging+SwipeRefresh实现分页和下拉刷新
implementation (“androidx.paging:paging-compose:1.0.0-alpha08”)implementation (“com.google.accompanist:accompanist-swiperefresh:0.9.0”)定义Item内容非常简单的一个标题和内容data class Content(val title:String,val content: String)定义RetrofitServiceinterface RetrofitServ
2022-03-06 14:44:55 473
原创 Android BLE 蓝牙通信库,android面试数据结构算法
public class BeaconItem {/**广播中声明的长度*/public int len;/**广播中声明的 type*/public int type;/**广播中的数据部分*/public byte[] bytes;}然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte
2022-03-05 17:03:26 429
原创 AndroiAndroid程序员最大的悲哀是什么?d程序员最大的悲哀是什么?
AOP 编程实现,包括 JDK 动态代理实现,ASM 直接操作字节码、CGLIB 实现,其原理封装了 ASM,使用更方便。Javassist:在字节码加载前直接修改需要切入的方法,以及注解处理器 APT,这在 Android 中开源的库应用较多,比如 DataBinding , ButterKnife, EventBus3 等等。异常处理 Exception,包括检查性异常、运行时异常处理。IO 流相关,包括堵塞型 IO 和非堵塞型 IO。Java 的一些高性特级,比如反射、代理、泛型、枚举、正则表
2022-03-05 16:57:46 1959
原创 adb操作命令,移动互联网app开发
Revision 8f855a3d9b35-android查看连接设备输入以下命令可以查询已连接的设备与模拟器:$ adb devicesList of devices attached02ae0c1021089daf device安装一个apk,执行以下命令:adb install // 如: adb install demo.apk如果不是当前目录,则后面要跟路径名:adb install /Users/storm/temp/demo.apk
2022-03-05 16:56:21 110
原创 ActivityGroup,Activity,TabHost注意问题,flutterui设计
@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (event.getAction() == event.ACTION_DOWN) {switch (event.getKeyCode()) {case KeyEvent.KEYCODE_BACK:String activityName = getCurrentActivity().getClass().getSimpleName();if (activityName.equ
2022-03-05 16:54:56 122
原创 9次Android面试经验总结,已收字节,阿里,Android研发岗必问30+道高级面试题
4.Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR?5.Handler.sendMessageDelayed()怎么实现延迟的?结合Looper.loop()循环中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。五、AsyncTask源码分析优劣性分析,这个网上一大堆,不重述。六、如何保证Service不被杀死?如何保证进程不被杀死?这两个问题我面试过程有3家公
2022-03-05 16:53:31 209
原创 90%的开发者都不知道的UI本质原理和优化方式,android组件化架构
可以看见,上面这些导致卡顿的原因都是我们平时开发中非常常见的。有些人可能会觉得自己的应用用着还蛮OK的,其实那是因为你没进行一些瞬时测试和压力测试,一旦在这种环境下运行你的App你就会发现很多性能问题。下面就分享给大家几种常见的UI 优化方式。所谓UI优化,就是拆解渲染过程的耗时,找到瓶颈的地方,加以优化。前面分析了UI原理,Activity、Window、DecorView、ViewRootImpl之间的关系,以及XML布局文件是如何解析成View对象的。耗时的地方:View的创建在主线程
2022-03-05 16:52:06 258
原创 8年老Android开发谈;简化UI都没弄明白凭什么拿高薪?,安卓移动开发基础案例教程
v(LinearLayout.class,orientation(LinearLayout.VERTICAL),v(TextView.class,text(someText)),v(Button.class,text(“Click me”),onClick(someClickHandler)));第一个 v() 方法返回了一个虚拟布局,每一次调用后它会返回当前应用状态的实际展示(不是实际的 View!)当一些文字变量被改变 - 虚拟树会获得一个被用于下次渲染的发生了改变的结点值,然后调用 s
2022-03-05 16:50:41 117
原创 Android ANR日志分析指南,android查看网络请求和响应
既然不是CPU负载的原因,那么到底是什么原因呢? 这时就要看我们的终极大杀器——traces.txt。二、 traces.txt 日志分析当APP不响应、响应慢了、或者WatchDog的监视没有得到回应时,系统就会dump出一个traces.txt文件,存放在文件目录:/data/anr/traces.txt,通过traces文件,我们可以拿到线程名、堆栈信息、线程当前状态、binder call等信息。通过adb命令拿到该文件:adb pull /data/anr/traces.txttrace:
2022-03-04 16:02:21 2385
原创 android Alarm闹钟发送广播播放音乐,androidstudio开发文档
package com.yqy.yqy_alarm;import java.util.Calendar;import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.app.TimePickerDialog;import android.content.Intent;import android.content.SharedPreferenc
2022-03-04 16:00:56 390
原创 Android 118道基础面试题,面试途中不卡题,你还看不明白
39、数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移。40、编译期注解跟运行时注解41、bitmap recycler 相关42、强引用置为null,会不会被回收?43、Bundle传递数据为什么需要序列化?44、广播传输的数据是否有限制,是多少,为什么要限制?45、是否了解硬件加速?46、ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控 制)。47、Fragment状态保存48、直接在Activity中创建一个thread跟
2022-03-04 15:59:31 233 1
原创 android -- NDK 编译环境搭建,kotlin开发快速入门与实战PDF
5.选中工程,右键->build project(如果没有,取消主菜单Project->build automaticly)6.选中工程,右键->Android application(如果没有AVD设备则需要配置)3、配置C/C++的编译器1.右键单击项目名称,点击Properties,弹出配置界面,之后再点击Builders,弹出项目的编译工具列表,之后点击New,新添加一个编译器,点击后出现添加界面,选择Program,点击OK按钮出现了添加界面,首先给编译配置起个名字,如:
2022-03-04 15:58:06 822
原创 Android - 带着问题看源码之 ViewModel,安卓软件android
(2) 页面配置修改后如何保存数据源码: Android API 29 查看顺序:AppCompatActivity—>FragmentActivity—>ComponentActivityAppCompatActivity.java 同样的这里也只是委托了事件@Overrideprotected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);get
2022-03-04 15:56:41 304
原创 Activity的启动模式,挑战阿里社招
Android提供四种Activity的启动模式来进行入栈操作。standard:默认值,启动Activity都会重新创建一个Activity的实例进行入栈。此时Activity可能存在多个实例。singleTop:当Activity处于栈顶时,再启动此Activity,不会重新创建实例入栈,而是会使用已存在的实例。singleTask:根据taskAffinity去查找是否存在这个任务栈,默认情况下taskAffinity为应用package name,也就是应该默认创建的任务栈,之后在这个任务
2022-03-04 15:55:16 87
原创 @Android程序员:总是说Android凉了,层层深入
很多年前,他和一群国际顶尖的开发者围绕着:组件化开发、性能监控、Android 演进式架构等等做了深入的讨论。这让他意识到:Android 开发并不是单纯的实现业务逻辑,而是一整套架构的搭建。比如自动化测试、性能监控、组件解耦等。从这之后,他开始刻意培养团队的架构意识,“App 的崩溃率是多少?” “埋点怎么做?” “架构中基础组件之间通信是怎么玩的?”等等。但一上升到架构的层面,很多人对 Java 虚拟机、Dalvik 字节码的理解的欠缺就暴漏出来了。在实现性能监控、组件化/插件化、编译插桩时举步维艰
2022-03-04 15:53:50 80
原创 7个你应该知道的Gradle实用技巧,flutter厂商推送
implementation rootProject.ext.dependencies[“cardview-v7”]implementation rootProject.ext.dependencies[“design”]implementation rootProject.ext.dependencies[“constraint-layout”]annotationProcessor rootProject.ext.dependencies[“glide_compiler”]…}这样虽然实现了
2022-03-04 15:52:25 104
原创 Android AIDL 传递对象(Parceable),深度解读Netty
import xj.musicserver.MusicInfo;interface IPlayListener {/**Demonstrates some basic types that you can use as parametersand return values in AIDL.*/void onError(int code);void onSuccess(int code,in MusicInfo musicInfo);}接下来我们再来看一下我们的实体类 Musi
2022-03-03 13:33:32 986
原创 Android --- 5G网络,flutter下拉选择
3.not_restricted_rrc_idle:设备驻留在支持5G网络上、使用不受限制,无需连接小区基站、且RRC处于闲置状态4.not_restricted_rrc_con:设备驻留在支持5G网络上、使用不受限制,无需连接辅助的小区基站、且当前RRC处于已连接的状态5.restricted:设备驻留在支持5G网络上、但受限制检测5G网络连接网络后,要对网络进行检测,判断是否连接了5G网络。Android 11及之后的版本添加了5G API,可以调用此API来检测设备是否连接了5G网络(这是5
2022-03-03 13:30:42 508
原创 Android - 沉浸式状态栏,腾讯后台开发
/**Enable tinting of the system status bar.If the platform is running Jelly Bean or earlier, or translucent systemUI modes have not been enabled in either the theme or via window flags,then this method does nothing.@param enabled True to e
2022-03-03 13:27:51 187
原创 90%的开发者都不知道的UI本质原理和优化方式,android音视频开发视频课程
requestLayout 一旦发起,最终会调用 performTraversals 方法,里面将会调用View的三个measure、layout、draw方法,其中View的draw 方法需要一个传一个Canvas参数。最后通过relayoutWindow 方法将Surface跟当前Window绑定,通过Surface的lockCanvas方法获取Surface的的Canvas,然后View的绘制就通过这个Canvas,最后通过Surface的unlockCanvasAndPost 方法提交绘制..
2022-03-03 13:22:11 222
原创 5年内被辞退3次,35岁程序员该何去何从?百度,写的太详细了
大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员。在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量。对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些“自我修养”,是最基础的,是普世的。所以今天的话题面向的程序员,就是所有的正在写代码或者曾经写过代码的程序员,也包括广义上的程序员,例如项目经理、架构师等等。做任何事都是有明确目的,那么再谈一谈,程序员提高自我修养是为了什么?程序写的好有人崇拜,有妹子喜欢?还是
2022-03-02 18:49:45 458
原创 5年Android开发诉苦:47天21家面试,半年空档期觉得整个人生都被毁了
二、高级UIUI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!三、Framework精编内核解析众所周知,Android是一个基于Linux实现的操作系统。但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别。所以Android也需要运行环境,需要Linux内核在启动完成后加载Andro
2022-03-02 18:48:20 137
原创 35岁以上求职没市场?阿里P8告诉你,做到这三点,flutter蓝牙打印
为什么35岁会成为一个人生的标志点呢?35岁一个不上不下的尴尬年纪,说你年轻吧,却缺少年轻人应有的“初生牛犊不怕虎”的闯劲。说你老吧!又毕竟经历了快10年的职场磨练,贪恋舒适区,技术多是半瓶子晃荡。一、为什么公司不招35岁以上的人1、没有闯劲,乐于 奉献的精神因为公司想要招的是一个全心全意能干活的人,这种人民必须把自己的精力放到工作上,需要加班时,能立即响应。[图片上传失败…(image-34777c-1598540142711)]在职场上,刚毕业的应届毕业生,因为刚进入社会,对职场上的一切都比较
2022-03-02 18:44:05 376
原创 257,flutterrun第三方路径
curl_easy_setopt(curl, CURLOPT_URL, “http://101.200.190.150:7777/login”);//2 开启post请求开关curl_easy_setopt(curl, CURLOPT_POST, true);//3 添加post数据curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_str);//4 设定一个处理服务器响应的回调函数,deal_response是回调函数curl_easy_setopt
2022-03-02 18:39:50 135
原创 2021年,Flutter 与 React Native该如何选择?,安卓app开发教程
一、Flutter 应用的优势===========================================================================1. 热重载 = 快速编码Flutter 允许开发人员使用一种更复杂、更快速的方式来创建应用程序。这是 Flutter 的最大优势之一,也是所有顶级移动应用开发公司都颇为看重的。开发人员可以实时对代码库做出改进,并立刻看到这些改进反映在请求中。这就是所谓的“热重载”特性,更改通常只需几毫秒就能显示出来。这一功能让团队可.
2022-03-02 18:36:59 1218
原创 Android Span详解,android热更新图片
通常使用的套路是样式属性和Span组合使用,可以考虑将设置给TextView的样式属性作为一种“基本”样式,而 Span样式是应用在基本样式“之上”并且会覆盖基本样式的样式。例如,当给一个 TextView 设置了 textColor=”@color.blue” 属性且设置开头4个字符应用了 ForegroundColorSpan(Color.PINK),则开头4个字符会使用 span 设置的粉色,而其他文本使用 TextView 属性设置的颜色。具体API使用,自行google,或者查看github的S
2022-03-01 19:52:05 341
原创 Android Library上传到JCenter仓库实践,android开发入门和实战
这里示例创建一个myutils的包,如下图所示:ok,这个时候你创建好了package,后面就可以准备我们开发好的Library,然后上传到maven仓库,继续耐心看下面的步骤。创建一个Android Library===================新建一个android project,然后new 一个module,选择android library,项目结构如下:这里我只是为了演示,创建了一个简单的类:应用bintray插件===========如果想通过bintrayUpl
2022-03-01 19:50:40 293
原创 Android Kotlin Jetpack Compose UI框架 完全解析,这些年我所经历的所有面试
下面是开启了 资源缩减 的最小化发布版 APK (使用了 R8) 通过 APK Analyzer 所测量的结果:关于上述数字的说明:1、使用了 APK Analyzer 报告的 “APK file size” (而不是下载时的大小)。 APK 大小分析2、在使用了 Compose 后,我们发现 APK 大小缩减了 41%,方法数减少了 17%1.2.2 代码行数源代码行数虽然不能作为衡量软件好坏的标准,但是可以对比出一个实验在“瘦身”上面做了多大的努力,为观察实验变化提供了一个统计视角。从
2022-03-01 19:49:15 351
原创 Android Kotlin Jetpack Compose UI框架 完全解析(1),终于搞明白了
在此模式下,你可以与界面组件互动、点击组件,以及查看状态如何变化。通过这种方式,你可以快速获得有关界面如何反应的反馈,并可快速预览动画。如要启用此模式,只需点击“互动”图标 ,系统即会切换预览模式。如需停止此模式,请点击顶部工具栏中的 Stop Interactive Preview。以上是AndroidStudio对Compose的支持,可以说是大手笔了。1.2 Jetpack Compose 使用前后对比你以为Compose只是添加了预览功能?那可不是。从普通应用切换到Compose应用,
2022-03-01 19:47:50 1246
原创 Android JSON基础,基于kotlin的android开发实例
“name”:“小猫”},{“id”:“003”,“name”:“小狗”}],“total”:3,“success”:true}其中这里的root对应的值是数组数据,total对应的值是一个int类型数据,success对应的是一个布尔类型数据;其中root对应的值里面还有很多数据,json字符串最外层是大括号的,大括号:{}解析jsonObject代码try {JSONObject jsonObject1 = new JSONObject(jsonStr);JSONArra
2022-03-01 19:46:25 244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人