
Android高级进阶
augfun
旧博客遗失,新博客凑活着用吧
展开
-
Android 实现搜索历史(2)
该demo使用了自定义的流式布局+AutoCompleteTextView+SharedPreferences实现了各大APP常用到的搜索历史记录的功能,代码简单实用。废话不多说,上效果图为证:上代码:第一步:自定义流式布局ZFlowLayout(让标签自动换行)package cn.cnpp.searchhistory;import android.content.Context;import android.util.AttributeSet;import android转载 2021-03-12 20:48:38 · 392 阅读 · 0 评论 -
Android 实现搜索历史(1)
SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空1. 判断搜索内容是否含表情,不需要可以不判断 /** * 校验字符串是否含有表情 * @param content * @return */ public static boolean hasEmoji(String content){ Pattern pattern = Pattern.compile("[\ud83c\udc00.转载 2021-03-12 20:44:29 · 732 阅读 · 0 评论 -
Android高级面试题
一、性能优化App稳定性优化你们做了哪些稳定性方面的优化? 性能稳定性是怎么做的 业务稳定性如何保障? 如果发生了异常情况,怎么快速止损?App启动速度优化启动优化是怎么做的? 是怎么异步的,异步遇到问题没有? 启动优化有哪些容易忽略的注意点? 版本迭代导致的启动变慢有好的解决方式吗? 开放问题:如果提高启动速度,设计一个延迟加载框架或者sdk的方法和注意的问题App内存优化你们内存优化项目的过程是怎么做的? 你做了内存优化最大的感受是什么? 如何检测所有不合理的地方?原创 2020-09-19 16:32:50 · 824 阅读 · 1 评论 -
性能优化LeakCanary使用
1.引入库在App下的build.gradle 中加入引用:debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'截图在 Application 中原创 2020-05-11 00:57:27 · 804 阅读 · 0 评论 -
Glide使用总结
首先,添加依赖implementation 'com.github.bumptech.glide:glide:4.5.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'之后添加访问网络权限<uses-permission android:name="android.permission.INTER...转载 2020-05-07 00:26:41 · 6912 阅读 · 1 评论 -
获取View的子View数
1.递归方式 public static int getViewCountByRecursive(View root){ int viewCount = 0; if (null == root){ return 0; } viewCount++; if (root inst...转载 2020-04-28 22:57:00 · 1130 阅读 · 0 评论 -
Android SDK相关
Android SDK是个啥?如何开发Android SDK,SDK开发流程SDK如何使用SDK开发的概念原创 2020-04-12 03:36:28 · 256 阅读 · 0 评论 -
搭建jeety服务器
关键代码:class StartRunnable implements Runnable { @Override public void run() { try { File JETTY_DIR = new File(Environment.getExternalStorageDirectory(), "jetty"); // Set jetty.home ...原创 2020-04-10 00:54:06 · 341 阅读 · 0 评论 -
onSaveInstanceState()与onPause()的区别
当用户在开启一个新activity时,当前的activity可能在内存中处于停止状态也可能由于新activity需要更多内存而被系统杀掉了,但不论怎样,当用户在新activity上按返回键时,他希望看到的是原先的activity的界面。原先的activity如果是被重新创建,那么它要恢复到用户最后看到它的样子。那么我们怎么做呢?在onPause()或onStop()或onDestyroy()中保存...原创 2020-04-01 02:21:04 · 466 阅读 · 0 评论 -
Android Framework原理
App启动过程App启动过程点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求 system_server进程接收到请求后,向zygote进程发送创建进程的请求 Zygote进程fork出新的子进程,即App进程 App进程,通过Binder IPC向sytem_server进程发起attachApp...转载 2020-03-31 02:21:27 · 777 阅读 · 0 评论 -
Android 架构篇----------Framework初识
Android架构图Android的架构大概有四层,(1)Application (2) Application FrameWork (3)LibraryAndroid Runtime (4)Linux Kernel今天主要聊聊 FrameWork层 对于android开发来说我们有必要认识一下所谓的 EIT模型 Eengine (发动机) I interface (接口)...转载 2020-03-31 02:16:01 · 434 阅读 · 0 评论 -
Android性能优化–Systrace工具
SystraceSystrace是一个平台提供的工具,可以在很短的时间内记录设备活动。该工具生成一个报告,该报告结合了Android内核中的数据,例如CPU调度程序,磁盘活动和应用程序线程。报告可帮助您确定如何最好地改善应用或游戏的性能。chrome查看trace报告报告提供了Android设备在给定时间段内的系统进程的总体情况。该报告还检查捕获的跟踪信息,以突出显示它所观察到的问...转载 2020-03-01 03:27:44 · 1154 阅读 · 0 评论 -
Android性能调优工具TraceView
Android自带的TraceView堪比java的性能调优工具visualvm线程视图,可以方便的查看线程的执行情况,某个方法执行时间、调用次数、在总体中的占比等,从而定位性能点。1、生成日志,运行TraceView运行TraceView有两种方式a、调用Debug类在开始调试的地方,如Activity的OnCreate函数,添加Debug.startMethodTraci...转载 2020-03-01 03:10:58 · 1459 阅读 · 0 评论 -
Android电量优化
首先搭建docker + battery historian环境(不了解的可以去度娘一下,有时间我会弄一篇环境搭建的);工具准备好了开始撸了;adb shelltop -m 5运行后 发现 耗电前五名 app高举榜首(汗颜);分析数据发现 在H5动画运行界面。CPU占用率始终是在30%左右,大家都知道 CPU运行时很耗电的,所以大致原因已发下;接着导出adb bugrepor...转载 2020-02-26 01:43:40 · 224 阅读 · 0 评论 -
Android常用框架
1.缓存框架1.1DiskLruCache:Java实现基于LRU的磁盘缓存,DiskLruCache不是google官方所写,但是得到了官方推荐,DiskLruCache没有编写到SDK中去,如需使用可直接copy这个类到项目中去。使用场景:如“清除缓存”,DiskLruCache一句话就可以搞定!github https://github.com/JakeWharton/Di...转载 2020-02-26 00:48:33 · 2895 阅读 · 0 评论 -
Android的优化BaseActivity统一管理Activity
用一个集合管理所有的activity,销毁的时候,同时杀死当前的进程,来清理所有的内容BaseActivity.javapackage com.ldw.market;/* * 基类Activity实现ActionBar的一些共性方法 */import java.util.LinkedList;import java.util.List;import android.os....原创 2020-02-10 00:08:04 · 778 阅读 · 0 评论 -
Android studio权限使用相关相关
Android Studio高SDK版本的权限获取和eclipse有一些不一样,下面的例子使用了2个权限,操作方法如下Android studio按钮详细介绍https://www.open-open.com/lib/view/open1468121363300.htmlprivate static final int PERMISSION_REQUEST_CODE = 1;if (...原创 2019-12-10 17:28:37 · 431 阅读 · 0 评论 -
Service组件和BroadcastReceiver实现组件通信
组件通信示例,一个Activity,一个Service,Service是通过startService启动,通常Activity与通过startServiece()方法启动的Service无法通信,借助于BoadcastReceiver实现组件通信。开发一个基于Service组件的音乐盒,后台的Service负责播放,后台的播放状态发生变化的时候,程序通过发送广播前台Activity更新界面,当...转载 2019-04-08 06:07:09 · 1255 阅读 · 0 评论 -
service的onStartCommand和防止service多次执行onStartCommand
(1):onstart()方法和onStartCommand()方法的区别:onstart()方法是在android2.0一下的版本中使用。而在android2.0以上则使用onstartCommand()方法。它们两个方法放在一起使用时,不会产生冲突。(2):onStartComand使用时,返回的是一个(int)整形。这个整形可以有四个返回值:start_sticky、...转载 2019-04-08 04:58:57 · 5060 阅读 · 0 评论 -
Android JNI
eclipse的使用方法:JNI简单使用eclipse--hello worldeclipse的使用方法:JNI简单使用eclipse--相加eclipse的使用方法:JNI简单使用eclipse---javaheclipse的使用方法:JNI简单使用eclipse---配置NDK路径eclipse的使用方法:JNI简单使用eclipse--java反射和c反射调用java代码...原创 2019-03-25 05:54:48 · 475 阅读 · 0 评论 -
Android和H5交互
hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?1、webView加载页面我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同://例如:加载assets文件夹下的test.html页面mWebView.loadUrl("file:///andr...转载 2019-03-24 23:24:57 · 1009 阅读 · 0 评论 -
RecyclerView在Android studio3.5.3版本的使用
第一步:在布局中使用:activity_main.xml<android.support.v7.widget.RecyclerView android:id="@+id/recycleview" android:layout_width="match_parent" android:layout_height="match_pare...原创 2019-03-20 04:53:36 · 801 阅读 · 0 评论 -
Android终止线程的方法
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象。但有时run方法是永远不会结束的。例如在程序中使用线程进行Socket监听请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。当需要结束线程时,如何退出线程呢?有三种方法可以结束线程:1. 使用退出标志,使线...转载 2019-03-17 03:35:07 · 3242 阅读 · 0 评论 -
Android电量和插拔电源状态广播监听
Android电量广播状态有3种,电量低,电量充满,电量发生改变。Action是:Intent.ACTION_BATTERY_CHANGEIntent.ACTION_BATTERY_LOWIntent.ACTION_BATTERY_OKAYAndroid的插拔电源广播的Action是:Intent.ACTION_POWER_CONNECTEDIntent.ACTION_P...转载 2019-03-16 16:21:39 · 2939 阅读 · 0 评论 -
android端实现断点续传下载---改进版
添加监听package com.ldw.multiDownload; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io...原创 2019-03-13 06:36:54 · 1694 阅读 · 0 评论 -
BitmapRegionDecoder加载大图实现
前言BitmapRegionDecoder类是Android系统提供的用来操作超大图片的工具类,它能够根据用户指定的区域大小部分加载图片数据。我们知道Android里的图片加载是有要求的,必须要小于某个特定阈值,如果图片尺寸特别大解析到内存中就会超出这个阈值导致图片无法加载,BitmapRegionDecoder类能够很好的辅助开发者在手机小屏幕上展示超大尺寸图实现过程先从网络上下载一...转载 2019-03-12 02:17:36 · 826 阅读 · 0 评论 -
解决Android加载大图片时内存溢出的问题
BitmapRegionDecoder尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitma...原创 2019-03-12 02:04:51 · 897 阅读 · 0 评论 -
Android数据库升级,数据迁移
版本迭代时难免需要对数据库字段进行增加,删除与修改操作。这时便需要对原有的数据进行迁移,以保证不丢失数据。对数据库的迁移我们需要做一下几个步骤:创建临时表,将原来的数据复制到临时表中。 删除原表,原表数据已经备份至临时表中,不再需要,进行删除。 创建新表,调用创建新表的方法,创建所有的新表。 恢复原表的数据,将临时表中的数据恢复至新表中。 删除临时表,完成所有的步骤。具体步骤:1...原创 2019-03-12 02:01:49 · 1083 阅读 · 0 评论 -
Android中的线程
Android中的线程形态除了传统的Thread以外,还包含AsyncTask、HandlerThread以及IntentService,这三者的底层实现也是线程,但是它们具有特殊的表现形式,同时在使用上也各有优缺点。AsyncTaskAsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。从实现上来说,Asyn...原创 2019-03-06 03:07:04 · 323 阅读 · 0 评论 -
Android刘海屏适配
如何适配刘海屏由于Android p正式版前两天才发布, 当前市面上的Android 刘海屏手机还不能用Android 官方提供的方案来解决,那怎么办呢?还好几个厂商自己给出了适配方案(文末会接受使用Android P来适配刘海屏)。华为P20华为早在iPhone X发布后不久就推出了“刘海屏”P20,华为刘海屏适配官方文档: https://devcenter-test.huawe...转载 2019-02-26 02:12:33 · 381 阅读 · 0 评论 -
多线程下载文件(支持暂停、取消、断点续传)----添加监听
多线程下载文件(支持暂停、取消、断点续传)多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可。涉及的知识及问题请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait()、notifyAll()、syn...转载 2019-02-26 00:32:02 · 1972 阅读 · 1 评论 -
关于Android Activity之间传递数据的6种方式
一.使用Inten的putExtra传递第一个Activity中//创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent);第二个Activity中// 获取意图对象 ...原创 2019-02-24 16:17:10 · 1171 阅读 · 0 评论 -
Android数据存储五种方式总结
本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据第一种: 使用SharedPreferences存储数据SharedPreferencese的使用:http...原创 2019-02-24 16:07:48 · 14148 阅读 · 1 评论 -
如何安全退出已调用多个Activity的Application
退出Activity 直接调用 finish () 方法即可,退出activity 会执行 onDestroy()方法 。但是某些情况下,我们在应用中开启了很多的Activity,并且我们希望能直接一键退出整个应用,而不是一层一层的向外退出Activity。抛异常强制退出: (暴力、偏门、不建议采用)通过抛异常,使程序Force Close,如100/0。 但是,需要解决的问题是,如何使程...原创 2019-02-24 15:03:27 · 691 阅读 · 0 评论 -
在Android Service组件里面弹出Toast
方法一:常用方法原理:其原理是通过Handler将一个自定义的线程运行于主线程之上/** * 在Service里面弹出Toast * * @param txt 需要显示的文字 */ public void showToast(final String txt) { if (txt == null) { ...原创 2019-02-24 02:17:06 · 2559 阅读 · 0 评论 -
Android 通过点击浏览器或者内部WebView加载URL 唤起App
首先在AndroidManifest.xml中被拉起的Activity下添加如下代码:<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <ca...原创 2019-02-24 02:09:46 · 3641 阅读 · 0 评论 -
Android虚拟机的理解和内存管理
虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M ,谈谈加载图片的时候怎么处理大图片的,outmemoryExceptionBitmapFactory.option 垃圾回收,没有引用的对象,在某个时刻会被系统gc掉 .Dalvik和标准Java虚拟机(JVM)首要差别Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行...原创 2019-02-24 01:10:56 · 489 阅读 · 0 评论 -
Android的消息机制
概述Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MessageQueue的中文翻译是消息队列,顾名思义,它的内部存储了一组消息,以队列的形式对外提供插入和删除的工作,插入和读取对应的方法分别为enqueueMessage和next,其中enqueueMessage的作用是往消息队列中插入一条消息,而nex...原创 2019-02-23 00:37:26 · 367 阅读 · 0 评论 -
【Android】常见的内存泄漏场景分析
内存泄漏场景资源性对象未关闭。比如Cursor、File文件等,往往都用了一些缓冲,在不使用时,应该及时关闭它们。 注册对象未注销。比如事件注册后未注销,会导致观察者列表中维持着对象的引用。 类的静态变量持有大数据对象。 非静态内部类的静态实例。 Handler临时性内存泄漏。如果Handler是非静态的,容易导致Activity或Service不会被回收。 容器中的对象没清理造成的...原创 2019-02-21 02:50:35 · 374 阅读 · 0 评论 -
android如何判断应用是否在前台
git中总结了5种方法:https://github.com/wenmingvs/AndroidProcess方法一ActivityManager:通常情况下,我们判断app是否在前台都是通过 ActivityManager。/** * Activity是否在前台 * @param context * @return */ private boolean ...原创 2019-02-21 02:42:50 · 12863 阅读 · 3 评论