自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 Android 安卓 基本 布局

水平布局宽为0,垂直布局高为0.代码案例:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”xmlns:app=“http://schemas.android.com/apk/res-auto”xmlns:tools=“http://schemas.android.com/tools”android:layou

2022-05-08 08:51:45 213

原创 Android 天气APP(六)旋转风车显示风力

*/private int mHei;/**控件颜色*/private int mColor;private MsgHandler mHandler = new MsgHandler(this);public WhiteWindmills(Context context) {this(context, null);}public WhiteWindmills(Context context, @Nullable AttributeSet attrs) {this(context,

2022-05-08 08:49:44 265

原创 Android 图片获取显示照片拍摄时间

//拍照private void fromCarema(OnFilishedListener listener) {if (hasSdcard()) {String path = null;if ( tempFile ==null || !tempFile.exists()) {listener.onFilish(null);return;}path = tempFile.getAbsolutePath();if (TextUtils.isEmpty(path)) {listener.o

2022-05-08 08:47:13 932

原创 android 制作

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】预览右侧的视图发现,图片的边缘处于普通拉伸状态。现在我们在图片边缘点击左键,绘制出黑线,即图片需要被拉伸的部分。如下图,对4条黑线做了注释。如果失误多绘的部分,可按住shift键的同时点击鼠标左键擦除)。如图所见,三种拉伸结果均已完美显示,已实现我们想要的拉伸效果,假设这是一个有显示文字的窗体,那么文字显示的区域,程序也会控制在黑线对应范围。 互联网的一些事以下.

2022-05-08 08:45:16 192

原创 Android 保活措施

Android系统会尽可能的保持应用进程,但是当需要建立新的进程或者运行更重要的进程,便会回收优先级低一些的进程,这个就是lowmemorykiller的工作。而进程的优先级其实就是 /proc/pid/oom_adj进程的优先级排序前台进程(Foreground Process)可见进程(Visible Process)服务进程(Service Process)后台进程(Background Process)空进程(Empty Process)前台进程拥有 用户正在交互的 Activ

2022-05-08 08:43:46 605

原创 Android 代码优化:“这个需求很简单

设计:1.我们是否可以把每件要做的事情抽象成一个节点,每个节点只关心自己的任务是否完成,它并不知道它是第几个,也不知道它前面或者后面的是谁.2.每个节点统一由一个流来管理,它作为全局统筹者,可以控制从任意节点开始、控制整个流的开启与结束等,每个节点的顺序由流来管理.实现:带着以上设计思路,我对代码做了一下重构,代码变成了这样:public class AfterActivity extends AppCompatActivity {private static final int REQUEST

2022-05-08 08:42:07 135

原创 Android Studio中统一管理版本号引用配置

**2.**在根目录下的build.gradle文件中引入我们创建的配置文件**3.**config.gradle中文件内容可以自己定义,如下示例:ext {// 用于编译的SDK版本COMPILE_SDK_VERSION = 23// 用于Gradle编译项目的工具版本BUILD_TOOLS_VERSION = “24.0.2”// 最低支持Android版本MIN_SDK_VERSION = 14// 目标版本TARGET_SDK_VERSION = 23// 设置是否使用混淆.

2022-05-08 08:40:27 528

原创 Android Studio 4

有些文件不是公用的是可以不用上传的,还有一些是编译的文件也不用上传。AS4.0以前,忽略文件是可以在settings-version control里面可视化操作的,但是升级AS4.0之后,这个设置没有了,但是我们可以在根目录的.gitignore文件里添加。*.iml.gradle.idealocal.properties.DS_Store/build*/build/captures.externalNativeBuild.cxx.idea、.gradle、*.iml、*/buil

2022-05-08 08:38:09 345

原创 android RoundedBitmapDrawable最简单方式实现圆角

ImageView mm1 = (ImageView) findViewById(R.id.mm1);ImageView mm2 = (ImageView) findViewById(R.id.mm2);ImageView mm3 = (ImageView) findViewById(R.id.mm3);RoundedBitmapDrawable roundedBitmapDrawable1 = RoundedBitmapDrawableFactory.create(getResources(), B

2022-05-08 08:36:32 617

原创 Android JetPack架构——结合记事本Demo一篇打通对Sqlite的增删改查结合常用jetpack架构应用

static class DeleteAllAsyncTask extends AsyncTask<Note, Void, Void>{private NoteDao noteDao;DeleteAllAsyncTask(NoteDao noteDao) {this.noteDao = noteDao;}@Overrideprotected Void doInBackground(Note… notes) {noteDao.deleteAllNotes();return null

2022-05-08 08:34:58 194

原创 Android 开发经验分享:挺重要的网络基础

四、Cookie上面说了Http协议是无状态的,而Cookie就是用来在本地缓存记住一些状态的,一个Cookie一般都包含domin(所属域)、path、Expires(过期时间)等几个属性。服务端可以通过在响应头里的set-cookies来将状态写入客户端的Cookie里。下次客户端发起请求时可以将Cookie带上。Android开发中遇到的问题及解决:说起Cookie,一般如果平常只是做App开发,比较不经常遇到,但是如果是涉及到WebView的需求,则有可能会遇到。下面就说一下我在项目里遇到过

2022-05-07 11:47:36 153

原创 Android 常用工具类

public Activity mActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(getLayoutId() );mActivity = this;activityManagerUtil = ActivityManagerUtil.getInstance();activityManagerUtil.pus

2022-05-07 11:45:56 739

原创 Android 原生项目集成 Flutter

主题 [Flutter](()了解一下如何在 Android 原生项目中集成 Flutter[](()具体操作[](()生成配置在原生项目根目录执行命令flutter create -t module --org {package_name} {module_name}// 此处 module_name 的命令遵循 Android 子 module 的命名即可。不能有中划线。// 比如,flutter create -t module --org com.engineer.mini.flu

2022-05-07 11:44:16 254

原创 Android 修改EditView输入框的光标颜色、下划线颜色

<EditTextandroid:id=“@+id/ed_pwd”android:textCursorDrawable=“@drawable/cursor_style”android:textColor=“#000”android:textSize=“@dimen/sp_24”android:paddingLeft=“@dimen/dp_15”android:layout_width=“wrap_content”android:layout_height=“@dimen/dp_65”/&

2022-05-07 11:42:36 1462

原创 Android——File数据存储

<Buttonandroid:id=“@+id/button2”android:layout_width=“match_parent”android:layout_height=“wrap_content”android:text=“读取” /><TextViewandroid:id=“@+id/text”android:layout_width=“wrap_content”android:layout_height=“wrap_content”/>FileUti

2022-05-06 12:02:20 260

原创 Android10填坑适配指南,实际经验代码,拒绝翻译

@Deprecatedpublic boolean clipPath(@NonNull Path path, @NonNull Region.Op op) {checkValidClipOp(op);return nClipPath(mNativeCanvasWrapper, path.readOnlyNI(), op.na 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 tiveInt);}private static

2022-05-06 12:00:08 160

原创 Android-第十三节02SharedPreferences详解

,而且优势就是sp读写起来会比文件更加方便,所以像这种情况我们就可以用sp的形式来存储[](()二、SharedPreferences的使用方法=======================================================================================因为sp是存储在data/data/包名目录下的,所以我们不需要动态申请权限1.添加button并添加点击事件核心代码button.findViewById(R.id.bu.

2022-05-06 11:58:37 94

原创 Android-第三方开源框架:Bugly让热修复变得如此简单

baseApkDir是基准包(也称基线包)的目录,在生产补丁时需要根据基准包在bakApk下具体文件夹名字修改,如:bakApk/xxxx,到时生成补丁包时要将baseApkDir的值改为xxxx。(xxxx是Tinker自动生成的,根据时间戳来命名)。3、tinkerIdtinkerId是Bugly热修复方案最最重要的一个因素,一般取值为git版本号、versionName等等(我习惯用versionName),它会将补丁包与基准包产生对应关系,假设基准包的tinkerId为 base-1.0,则.

2022-05-06 11:56:17 923

原创 Android-Q-要来了,一个影响国内-90%-App-的适配项

而国内的 App 里,在启动页里加塞点功能,好像是一种更为普遍的做法。在 Material Design 的设计规范中,也明确定义了启动图的设计规范,其核心就是为了解决冷启动时,那个短暂的白屏不至于显得太突兀,设计的好了,还可以增加品牌的辨识度。启动页面的设计,其重点在于,它仅仅在应用启动的瞬间显示,也就是说,启动页面不应该导致应用的启动变慢,强制显示一段时间广告,更是不应该的做法。毕竟打开 App 是为了它的功能,更快把首屏展示给用户,体验就更好。三. Q 的后台启动建议在 Android Q

2022-05-06 11:54:17 60

原创 Android--SoftReference缓存图片

SoftReference缓存图片=================2012-4-13 09:04| 发布者: [benben](()| 查看: 2426| 评论: 0摘要: Java中的SoftReference即对象的软引用。如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用 …Java中的SoftReference即对象的软引用。如果一个对象具

2022-05-06 11:52:44 90

原创 Android 超好用的播放器——ijkplayer

public VideoPlayerIJK(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {super(context, attrs, defStyleAttr);initVideoView(context);}private void initVideoView(Context context) {mContext = context;//获取焦点,不知道有没有必要。set

2022-05-06 11:50:46 2462

原创 Android 自定义 MarqueeView 实现跑马灯效果 - 使用说明

TextView tv = viewHolder.getView(R.id.tv);tv.setText(item);}}SimpleTextAdapter simpleTextAdapter = new SimpleTextAdapter(mContext, datas);simpleTextAdapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {@Overridepublic void o

2022-05-06 11:49:05 1048

原创 Android 组件化场景下多module依赖优雅实践方案

compileandroidx.appcompatappcompat1.2.0compilecom.google.android.materialmaterial1.2.1compile我们发现,关于测试相关的依赖并没有被收录到pom文件中。这很合理,测试代码是针对该module的,并不需要提供给使用方,其依赖自然也不需要传递。我们知道,AGP中现在有4种声明依赖的方式(除去testXXX这种变种)apiimplementationcompileOnly

2022-05-06 11:46:45 340

原创 Android 热修复原理

[](()二. QZone(插桩方式)该方案基于的是android dex分包方案的, 简单的概括一下,就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当用到这个重复的类的时候,系统会选择哪个类进行加载呢?  让我们来看看类加载的代码:一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dex

2022-05-06 11:44:38 258

原创 Android开发规范:包命名规范

│ LoginActivity.java│ SettingActivity.java│├—bean│ UserBean.java│├—db│ DBManager.java│├—fragment│ NewsFragment.java│ PictureFragment.java│├—net│ RetrofitManager.java│└—serviceBackgroundService.java这也是我们以前开发项目常用的包目录结构。[](()PBL优点项目结构简洁明了

2022-05-05 14:00:52 996

原创 Android开发简记:140M到67M,学而思网校如何在一周内构建一套可持续的瘦身系统

为什么不用插件化?19年团队曾经尝试过插件化技术,经过两个项目试水碰到一系列问题,最终放弃使用插件化,原因如下:插件技术原理是通过Hook或者Reflect技术修改系统libs和framework代码,Android系统版本 设备 ROM众多,Hook Reflect很难100%兼容。学而思网校平台有20+的二级工程,一个工程变更重新打包时,插件资源id的重新分配,整体工程变更导致20多插件变动需要重新维护,维护人力成本有点大。插件技术使用时存在数据传递问题 自定义UI显示问题,权限重复

2022-05-05 13:57:24 119

原创 Android开发的艺术:插件化框架Virtual APK实现原理解析

广播的动态注册[](()二、宿主App的实现======================================================================中心思想:对插件APK进行解析,获取插件APK的信息在框架初始化时,对一系列系统组件和接口进行替换,从而对Activity、Service、ContentProvider的启动和生命周期进行修改和监控,达到欺瞒系统或者劫持系统的目的来启动插件Apk的对应组件。2.1 插件Apk的解析和加载插件Ap.

2022-05-05 13:55:42 481

原创 Android开发之——Profiler-网络分析

print(response)}httpAsync.join()[](()SecondActivityva 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 l httpAsync = “https://www.wanandroid.com/banner/json”.httpGet().responseString { request, response, result ->print(response)}ht

2022-05-05 13:51:10 490

原创 Android底部弹窗的正确打开方式

阅读完本文后,你可以有以下收获利用PopupWindow实现底部弹窗PopupWindow实现底部弹窗时的缺点解决利用PopupWindow实现底部弹窗,无法覆盖状态栏的问题利用dialog实现底部弹窗利用dialogFragment实现底部弹窗利用BottomSheetDialog实现底部弹窗通过阅读源码了解BottomSheetDialog实现底部弹窗的实质实现底部弹窗的方式由于本人水平有限,只知道一下几种实现底部弹窗的方式利用PopupWindow实现底部弹窗。利用Dial

2022-05-05 13:49:30 2576

原创 Android完美获取状态栏高度、标题栏高度、编辑区域高度的获取

获取状态栏高度——方法3应用区的顶端位置即状态栏的高度注意该方法不能在初始化的时候用*/Rect rectangle= new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);//高度为rectangle.top-0仍为rectangle.topLog.e(“WangJ”, “状态栏-方法3:” + rectangle.top);看结果:*注意* 如果单单获取statu..

2022-05-05 13:47:35 6433

原创 Android图片加载框架最全解析(五)

由此我们可以得知,在没有明确指定的情况下,ImageView默认的scaleType是FIT_CENTER。有了这个前提条件,我们就可以继续去分析Glide的源码了。当然,本文中的源码还是建在第二篇源码分析的基础之上,还没有看过这篇文章的朋友,建议先去阅读 [Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程](() 。回顾一下第二篇文章中我们分析过的into()方法,它是在GenericRequestBuilder类当中的,代码如下所示:public Target<

2022-05-05 13:45:51 276

原创 Android——单选多选按钮的使用详解

android:text=“RadioActivity单选” /><Buttonandroid:id=“@+id/button2”android:layout_width=“match_parent”android:layout_height=“wrap_content”android:text=“CheckActivity多选” />MainActivity.javapackage com.example.radioandcheckdemo;import android

2022-05-04 11:12:25 1056

原创 Android-:想进大厂你必须会的APK瘦身(项目体积优化实战笔记

前言移动网络从2G->4G->5G,网速一步步提升,网络资费也逐渐便宜起来了 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 . 记得上高中的时候5块钱/30M流量,能happy一个月.现在给我300M流量,可能撑不过一天。前几年开始Android开发的职业生涯,那会公司对APP的包体积还特别敏感,到了今天,对APP的包体积已经不在是特别敏感了但是对于出海应用APP,非洲,印度那些网络资源匮乏的地方,APP包体

2022-05-04 11:10:06 271

原创 Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制

public class DecorView extends FrameLayout implements RootViewSurfaceTaker, WindowCallbacks {public boolean superDispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);}复制代码我们看到内部又调用了父类 dispatchTouchEvent 方法, 所以最终是交给 ViewGroup 顶

2022-05-04 11:08:05 113

原创 Android-第六节01ListView详解

2.创建ArrayList的Activity3.设置从主Activity跳转到ArrayActivity代码:Button button=findViewById(R.id.btn1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,ArrayListActivity.c

2022-05-04 11:06:34 119

原创 Android-第八节02Fragment详解

android:paddingRight=“@dimen/activity_horizontal_margin”android:paddingTop=“@dimen/activity_vertical_margin”tools:context=“scut.carson_ho.fragment_2_activity.MainActivity”><TextViewandroid:id=“@+id/text”android:layout_width=“wrap_content”androi

2022-05-04 11:04:36 116

原创 Android-架构组件的最新进展

更快的编译速度对开发者来说,处理界面中的数据绑定需要的时间成本不容忽视,我们现在将数据绑定注解处理的速度提高了 20%*。Google 内部实测结果。如果您的工作涉及到协同开发,还有一个好消息,那就是我们增加了对分布式构建缓存的支持。最后,数据绑定支持增量注解处理,能提升增量构建的性能。但这个功能还停留在测试阶段,所以请在 Gradle 配置文件中使用如下代码手动打开:android.databinding.incremental = true和 Android Studio 更紧密地集成

2022-05-04 11:02:54 203

原创 Android-异步消息处理机制-深入理解-Looper、Handler、Message三者关系

mQueue = new MessageQueue(quitAllowed);mRun = true;mThread = Thread.currentThread();}在构造方法中,创建了一个MessageQueue(消息队列)。然后我们看loop()方法:public static void loop() {final Looper me = myLooper();if (me == null) {throw new RuntimeException(“No Looper; Loope

2022-05-04 11:00:35 196

原创 Android 面试精华题目总结

下面的题目都是楼主在android交流群大家面试时遇到的,如果大家有好的题目或者好的见解欢迎分享,楼主将长期维护此帖。某公司高级面试题(2015-03-14)【感谢helder分享】1、详述Android系统架构,包括层与层之间调用、binder、jni、底层文件读写方法2、描述自己的一个项目,要求画出结构图,UML图,详细描述项目种的技术点,技术难点以及解决方案3、一道算法4、谈谈自己项目管理的方法、对敏捷软件开发的理解基础面试题(2014-04-18)1、请解释下在单线程模型中Mess

2022-05-04 10:54:45 71

原创 Android 进阶延伸技术点,你能答出几个?

[](()4、如何通过 Gradle 配置多渠道包?参考回答:首先要了解设置多渠道的原因。在安装包中添加不同的标识,配合自动化埋点,应用在请求网络的时候携带渠道信息,方便后台做运营统计,比如说统计我们的应用在不同应用市场的下载量等信息这里以友盟统计为例首先在 manifest.xml 文件中设置动态渠道变量:接着在 app 目录下的 build.gradle 中配置productFlavors,也就是配置打包的渠道:最后在编辑器下方的 Teminal 输出命令行.

2022-05-04 10:53:02 183

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除