Android 内存泄漏的十大原因

解决 Android 开发中的内存泄漏对于创建高效可靠的应用程序至关重要。当不再需要对象但由于未正确释放而仍然占用内存时,就会发生内存泄漏。以下是 Android 中十种常见的内存泄漏,以及 Kotlin 代码示例和解决方案:

1.非静态内部类

  • 问题:Kotlin 中的内部类可以保存对其外部类的隐式引用。

例子

class MyActivity : AppCompatActivity() {
     private inner class MyThread : Thread() {
         override fun run() {
             // 任务
         }
     } 
}
  • 解决方案:将内部类设为静态或使用单独的类。如果需要,请传递对外部类的弱引用。

2. 处理程序和运行对象

  • 问题:如果处理程序持有对外部类的引用,则可能会导致内存泄漏。

例子

class MyActivity : AppCompatActivity() {
     private val handler = Handler(Looper.getMainLooper())
     private val runnable = Runnable { /* Task */ }
     override fun onDestroy() {
         super.onDestroy()
         handler.removeCallbacks(runnable)
     } 
}
  • 解决方案:删除onDestroy方法中的所有回调。

3. 匿名Listeners

  • 问题:匿名侦听器可能会无意中保留对活动或视图的引用。

例子:

class MyActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         findViewById<Button>(R.id.myButton).setOnClickListener {
             // 点击操作
         }
     } 
}
  • 解决方案:在onDestroy方法中清除监听器或者使用静态类。

4. 静态视图或上下文

  • 问题:静态视图或上下文引用可能导致内存泄漏。

例子

class MyActivity : AppCompatActivity() {
     companion object {
         private var staticView: View? = null
     }
     override fun onCreate(savedInstanceState: Bundle?) {
         staticView = findViewById(R.id.myView)
     } 
}
  • 解决方案:避免静态引用视图或上下文;如有必要,请使用弱引用。

5. 不正确的实时数据观察

  • 问题:观察 LiveData 而不考虑生命周期。

例子

class MyActivity : AppCompatActivity() {
     private val viewModel: MyViewModel by viewModels()
      override fun onCreate(savedInstanceState: Bundle?) {
         viewModel.myLiveData.observe(this, { data ->
             /* 更新 UI */ 
          })
     }
}
  • 解决方案:使用生命周期感知组件观察 LiveData,例如viewLifecycleOwner在 Fragments 中。

6. 带有上下文的单例

  • 问题:持有上下文引用的单例可能会导致泄漏。

例子

object MySingleton {
     var context: Context? = null 
}
  • 解决方案:将应用程序上下文传递给单例,而不是活动或视图上下文。

7. 位图

  • 问题:如果管理不当,大位图可能会消耗大量内存。

例子

class MyActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         val bitmap = BitmapFactory.decodeResource(resources, R.drawable.large_image)
         // 使用位图
     } 
}
  • 解决方案:明智地使用位图并recycle()在完成后调用;考虑使用 Glide 或 Picasso 等图像加载库。

8. 网页视图

  • 问题:WebView 可以保存对上下文的引用。

例子

class MyActivity : AppCompatActivity() {
     private lateinit var webView: WebView 
     override fun onCreate(savedInstanceState: Bundle?) {
         webView = findViewById(R.id.myWebView)
         // 设置 WebView
     } 
}
  • 解决方案:在 onDestroy 方法中清除 WebView,并尽可能使用应用程序上下文。

9. 广播接收器

  • 问题:不取消注册广播接收器可能会导致泄漏。

例子

class MyActivity : AppCompatActivity() {
     private val receiver = MyReceiver()
      override fun onStart() {
         registerReceiver(receiver, IntentFilter("SOME_ACTION"))
     }
     override fun onStop() {
         unregisterReceiver(receiver)
         super.onStop()
     } 
}
  • 解决方案:始终在相应的生命周期方法中注销接收器。

10. RecyclerView 适配器中的事件监听器

  • 问题:RecyclerView 适配器中的事件侦听器可以保存对 Activity 或 Fragment 的引用。

例子

class  MyAdapter ( private  val items: List<Item>, private  val Activity: AppCompatActivity) : RecyclerView.Adapter<MyViewHolder>() { 
     // 适配器实现
}
  • 解决方案:使用接口或 lambda 函数进行回调,并避免将活动或片段上下文传递给适配器。

一般建议

  • 定期检查 Android 应用程序中的内存泄漏,尤其是在对涉及上下文、视图或后台任务的代码进行更改之后。
  • 在开发阶段使用 LeakCanary 等工具来检测内存泄漏。
  • 了解和管理 Android 组件的生命周期是防止内存泄漏的关键。
  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
应用名称:内存加速 应用版本:5.9.3 应用大小:1.5MB 系统要求:Android 2.1+ 发布日期:2014-02-10 内存加速器Memory Booster是款专门为Android手机用户设计的强大的内存&RAM优化工具。它主要是为了帮助用户解决Android手机内存管理上的各种问题。它通过整理内存碎片、修复因某些程序导致的内存泄漏问题来进行内存回收。 主要功能: - 及时报告与监测内存状态:内存加速器会通过及时更新图表显示手机的总内存,以及现有可用内存和已用内存。 - 后台自动优化:为自动优化设置时间间隔,内存加速器将在后台运行,并根据所设时间间隔自动进行优化。 - 设置性能目标:为自动优化设置阈值,内存加速器会将手机的可用内存保持在该阈值以上,并在内存低于该阈值时立即进行优化。 - Android系统保护:内存加速器持续关注系统资源并在系统内存过低时进行内存回收。 - 一键快速优化:除自动优化功能以外,内存加速器也具备手动一键快速优化功能。 - 其他:其他功能如任务杀手,白名***理,优化等级管理和内存优化日志,对于内存加速器的有效运作都起着举足轻重的作用 V5.9.3 升级点: - 修复白名单问题,重组白名单界面(beta) - 改版About界面 - 优化内存检测曲线图在高清屏幕的显示效果 - 优化日志页面新增内存优化统计 - 其他改进
注意:本项目基于android studio开发,eclipse可能无法直接导入。 本项目是一个煎蛋网的非官网安卓客户端项目源码,API用的是煎蛋官方的。 项目虽小,五脏俱全,学习这个项目,你将学到 Android Studio开发Android的基本配置 对MD风格的Theme兼容 对Volley网络请求库的封装和自定义 Application、Activity和Fragment基类的基本设计 MVC架构的使用 对超长图片加载的解决方案 WebView与JS通信,及加载本地缓存图片的实现 RecyclerView自动加载、加载完成回调,以及item进入动画 多楼层回复自定义控件的实现 严格模式(StrictMode)的设置及用法 使用GreenDao对数据进行本地缓存 对网络状态的实时检测 对UIL的个性化设置、封装和基本使用 使用LeakCanary检测内存泄露 优化的功能 添加加载等待动画 添加加载失败提示 添加评论楼层过多隐藏 添加网络状态检测 优化无聊图列表显示,非WIFI状态下,显示GIF缩略图,点击后下载 加载模式全自动智能切换,显著提高加载速度,节省大量流量 修改图片详情页为完全沉浸效果 添加图片列表滚动检测,滚动状态暂停加载,进一步提高加载速度,减少卡顿 添加图片加载默认图片 添加当前栏目标志,避免重复切换 修改新鲜事列表页效果为CardView 由于小视频接口有问题,当加载成功的数据少于10条时,会自动加载下一页,直到大于10条为止 添加新鲜事大图模式切换功能 使用到的开源框架 Volley Universal Image Load butter knife EventBus material-dialogs gson GreenDao Loading LeakCanary
1.GsonFormat(GsonFormat) 快速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。 使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat 2.Android ButterKnife Zelezny 配合ButterKnife实现注解,从此不用写findViewById,想着就爽啊。在Activity,Fragment,Adapter中选中布局xml的资源id自动生成butterknife注解。 使用方法:Ctrl+Shift+B选择图上所示选项 3.Android Code Generator 根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。 4.Android Parcelable code generator JavaBean序列化,快速实现Parcelable接口。 5.Android Methods Count 显示依赖库中得方法数 6.Lifecycle Sorter 可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序,快捷键Ctrl + alt + K 7.CodeGlance 在右边可以预览代码,实现快速定位 8.findBugs-IDEA 查找bug的插件,Android Studio也提供了代码审查的功能(Analyze-Inspect Code…) 9.ADB WIFI 使用wifi无线调试你的app,无需root权限 也可参考以下文章: Android wifi无线调试App新玩法ADB WIFI 10.AndroidPixelDimenGenerator Android Studio自动生成dimen.xml文件插件 11.JsonOnlineViewer 在Android Studio中请求、调试接口 12.Android Styler 根据xml自动生成style代码的插件 13.Android Drawable Importer 这是一个非常强大的图片导入插件。它导入Android图标与Material图标的Drawable ,批量导入Drawable ,多源导入Drawable(即导入某张图片各种dpi对应的图片) 14.SelectorChapek for Android 通过资源文件命名自动生成Selector文件。 15.GenerateSerialVersionUID 实现Serializable序列化bean 16.genymotion 速度较快的android模拟器 17.LeakCanary 帮助你在开发阶段方便的检测出内存泄露的问题,使用起来更简单方便。 可以参考以下文章: LeakCanary 中文使用说明 18.Android Postfix Completion 可根据后缀快速完成代码,这个属于拓展吧,系统已经有这些功能,如sout、notnull等,这个插件在原有的基础上增添了一些新的功能,我更想做的是通过原作者的代码自己定制功能,那就更爽了 19.Android Holo Colors Generator 通过自定义Holo主题颜色生成对应的Drawable和布局文件 20.dagger-intellij-plugin dagger可视化辅助工具 21.GradleDependenciesHelperPlugin maven gradle 依赖支持自动补全 22.RemoveButterKnife ButterKnife这个第三方库每次更新之后,绑定view的注解都会改变,从bind,到inject,再到bindview,搞得很多人都不敢升级,一旦升级,就会有巨量的代码需要手动修改,非常痛苦 当我们有一些非常棒的代码需要拿到其他项目使用,但是我们发现,那个项目对第三方库的使用是有限制的,我们不能使用butterknife,这时候,我们又得从注解改回findviewbyid 针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦) 所以,这种有规律又重复简单的工作为什么不能用一个插件来实现呢?于是RemoveButterKnife的想法就出现了。 具体介绍 23.AndroidProguardPlugin 一键生成项目混淆代码插件,值得你安装~(不过目前可能有些第三方项目的混淆还未添加完全) 24.otto-intellij-plugin otto事件导航工具。 25.eventbus-intellij-plugin eventbus导航插件 26.idea-markdown markdown插件 27.Sexy Editor 设置AS代码编辑区的背景图 首先点击界面的设置按钮 进入设置界面,选中Plugins,右边选择 Browser … ,输入Sexy … 下面自动弹出候选插件,右边点击Install 安装 安装成功 后需要重启AS 重启完成之后 进入设置界面 选择other Setting 下的Sexy Editor , 右侧 insert 一张或多张图片即可,上面的其他设置可以设置方位 间隔时间 透明度等等,设置完成后,要关闭打开的文件,重新打开项目文件即可在代码编辑区显示插入的图片,作为代码编辑区的背景图。 28.folding-plugin 布局文件分组的插件 29.Android-DPI-Calculator DPI计算插件 30.gradle-retrolambda 在java 6 7中使用 lambda表达式插件 修改编译的jdk为java8: 31.Android Studio Prettify 可以将代码中的字符串写在string.xml文件中 这个插件还可以自动书写findViewById 32.Material Theme UI 添加Material主题到你的AS 33..ignore 我 们都知道在Git 中想要过滤掉一些不想提交的文件,可以把相应的文件添加到.gitignore 中,而.gitignore 这个Android Studio 插件根据不同的语言来选择模板,就不用自己在费事添加一些文件了,而且还有自动补全功能,过滤文件再也不要复制文件名了。我们做项目的时候,并不是所有文 件都是要提交的,比如构建的build 文件夹,本地配置文件,每个Module 生成的iml 文件,但是我们每次add,commit 都会不小心把它们添加上去,而gitignore 就是解决这种痛点的,如果你不想提交的文件,就可以在创建项目的时候将这个文件中添加即可,将一些通用的东西屏蔽掉。 34.CheckStyle-IDEA CheckStyle-IDEA 是一个检查代码风格的插件,比如像命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,你们可以遵从像Google Oracle 的Java 代码指南 ,当然也可以按照自己的规则来设置配置文件,从而有效约束你自己更好地遵循代码编写规范。 35.Markdown Navigator github:Markdown Navigator Markdown插件 36.ECTranslation Android Studio Plugin,Translate English to Chinese. Android Studio 翻译插件,可以将英文翻译为中文。 37.PermissionsDispatcher plugin github:PermissionsDispatcher plugin 自动生成6.0权限的代码 38.WakaTime github:WakaTime 记录你在IDE上的工作时间 39.AndroidWiFiADB 无线调试应用 40.AndroidLocalizationer 可用于将项目中的 string 资源自动翻译为其他语言的 Android Studio/IntelliJ IDEA 插件
Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。, 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 目录 第1章 Activity的生命周期和启动模式 / 1 1.1 Activity的生命周期全面分析 / 1 1.1.1 典型情况下的生命周期分析 / 2 1.1.2 异常情况下的生命周期分析 / 8 1.2 Activity的启动模式 / 16 1.2.1 Activity的Launch Mode / 16 1.2.2 Activity的Flags / 27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 2.4 Android中的IPC方式 / 61 2.4.1 使用Bundle / 61 2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL / 71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 View的事件体系 / 122 3.1 View基础知识 / 122 3.1.1 什么是View / 123 3.1.2 View的位置参数 / 123 3.1.3 Motion Event和Touch Slop / 125 3.1.4 VelocityT racker、Gesture Detector和Scroller / 126 3.2 View的滑动 / 129 3.2.1 使用scroll To/scroll By / 129 3.2.2 使用动画 / 131 3.2.3 改变布局参数 / 133 3.2.4 各种滑动方式的对比 / 133 3.3 弹性滑动 / 135 3.3.1 使用Scroller / 136 3.3.2 通过动画 / 138 3.3.3 使用延时策略 / 139 3.4 View的事件分发机制 / 140 3.4.1 点击事件的传递规则 / 140 3.4.2 事件分发的源码解析 / 144 3.5 View的滑动冲突 / 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / 177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 / 200 4.4.2 自定义View须知 / 201 4.4.3 自定义View示例 / 202 4.4.4 自定义View的思想 / 217 第5章 理解Remote Views / 218 5.1 Remote Views的应用 / 218 5.1.1 Remote Views在通知栏上的应用 / 219 5.1.2 Remote Views在桌面小部件上的应用 / 221 5.1.3 Pending Intent概述 / 228 5.2 Remote Views的内部机制 / 230 5.3 Remote Views的意义 / 239 第6章 Android的Drawable / 243 6.1 Drawable简介 / 243 6.2 Drawable的分类 / 244 6.2.1 Bitmap Drawable / 244 6.2.2 Shape Drawable / 247 6.2.3 Layer Drawable / 251 6.2.4 State List Drawable / 253 6.2.5 Level List Drawable / 255 6.2.6 Transition Drawable / 256 6.2.7 Inset Drawable / 257 6.2.8 Scale Drawable / 258 6.2.9 Clip Drawable / 260 6.3 自定义Drawable / 262 第7章 Android动画深入分析 / 265 7.1 View动画 / 265 7.1.1 View动画的种类 / 265 7.1.2 自定义View动画 / 270 7.1.3 帧动画 / 272 7.2 View动画的特殊使用场景 / 273 7.2.1 LayoutAnimation / 273 7.2.2 Activity的切换效果 / 275 7.3 属性动画 / 276 7.3.1 使用属性动画 / 276 7.3.2 理解插值器和估值器 / 280 7.3.3 属性动画的监听器 / 282 7.3.4 对任意属性做动画 / 282 7.3.5 属性动画的工作原理 / 288 7.4 使用动画的注意事项 / 292 第8章 理解Window和Window Manager / 294 8.1 Window和Window Manager / 294 8.2 Window的内部机制 / 297 8.2.1 Window的添加过程 / 298 8.2.2 Window的删除过程 / 301 8.2.3 Window的更新过程 / 303 8.3 Window的创建过程 / 304 8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 / 316 9.1 四大组件的运行状态 / 316 9.2 Activity的工作过程 / 318 9.3 Service的工作过程 / 336 9.3.1 Service的启动过程 / 336 9.3.2 Service的绑定过程 / 344 9.4 Broadcast Receiver的工作过程 / 352 9.4.1 广播的注册过程 / 353 9.4.2 广播的发送和接收过程 / 356 9.5 Content Provider的工作过程 / 362 第10章 Android的消息机制 / 372 10.1 Android的消息机制概述 / 373 10.2 Android的消息机制分析 / 375 10.2.1 Thread Local的工作原理 / 375 10.2.2 消息队列的工作原理 / 380 10.2.3 Looper的工作原理 / 383 10.2.4 Handler的工作原理 / 385 10.3 主线程的消息循环 / 389 第11章 Android的线程和线程池 / 391 11.1 主线程和子线程 / 392 11.2 Android中的线程形态 / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 Intent Service / 403 11.3 Android中的线程池 / 406 11.3.1 Thread Pool Executor / 407 11.3.2 线程池的分类 / 410 第12章 Bitmap的加载和Cache / 413 12.1 Bitmap的高效加载 / 414 12.2 Android中的缓存策略 / 417 12.2.1 Lru Cache / 418 12.2.2 Disk Lru Cache / 419 12.2.3 Image Loader的实现 / 424 12.3 Image Loader的使用 / 441 12.3.1 照片墙效果 / 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露分析之MAT工具 / 502 15.3 提高程序的可维护性 / 506
Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 全书目录 ------------------------------------------------------------------- 第1章 Activity的生命周期和启动模式 / 1   1.1 Activity的生命周期全面分析 / 1   1.1.1 典型情况下的生命周期分析 / 2   1.1.2 异常情况下的生命周期分析 / 8   1.2 Activity的启动模式 / 16   1.2.1 Activity的LaunchMode / 16   1.2.2 Activity的Flags / 27   1.3 IntentFilter的匹配规则 / 28   第2章 IPC机制 / 35   2.1 Android IPC简介 / 35   2.2 Android中的多进程模式 / 36   2.2.1 开启多进程模式 / 36   2.2.2 多进程模式的运行机制 / 39   2.3 IPC基础概念介绍 / 42   2.3.1 Serializable接口 / 42   2.3.2 Parcelable接口 / 45   2.3.3 Binder / 47   2.4 Android中的IPC方式 / 61   2.4.1 使用Bundle / 61   2.4.2 使用文件共享 / 62   2.4.3 使用Messenger / 65   2.4.4 使用AIDL / 71   2.4.5 使用ContentProvider / 91   2.4.6 使用Socket / 103   2.5 Binder连接池 / 112   2.6 选用合适的IPC方式 / 121   第3章 View的事件体系 / 122   3.1 View基础知识 / 122   3.1.1 什么是View / 123   3.1.2 View的位置参数 / 123   3.1.3 MotionEvent和TouchSlop / 125   3.1.4 VelocityTracker、GestureDetector和Scroller / 126   3.2 View的滑动 / 129   3.2.1 使用scrollTo/scrollBy / 129   3.2.2 使用动画 / 131   3.2.3 改变布局参数 / 133   3.2.4 各种滑动方式的对比 / 133   3.3 弹性滑动 / 135   3.3.1 使用Scroller / 136   3.3.2 通过动画 / 138   3.3.3 使用延时策略 / 139   3.4 View的事件分发机制 / 140   3.4.1 点击事件的传递规则 / 140   3.4.2 事件分发的源码解析 / 144   3.5 View的滑动冲突 / 154   3.5.1 常见的滑动冲突场景 / 155   3.5.2 滑动冲突的处理规则 / 156   3.5.3 滑动冲突的解决方式 / 157   第4章 View的工作原理 / 174   4.1 初识ViewRoot和DecorView / 174   4.2 理解MeasureSpec / 177   4.2.1 MeasureSpec / 177   4.2.2 MeasureSpec和LayoutParams的对应关系 / 178   4.3 View的工作流程 / 183   4.3.1 measure过程 / 183   4.3.2 layout过程 / 193   4.3.3 draw过程 / 197   4.4 自定义View / 199   4.4.1 自定义View的分类 / 200   4.4.2 自定义View须知 / 201   4.4.3 自定义View示例 / 202   4.4.4 自定义View的思想 / 217   第5章 理解RemoteViews / 218   5.1 RemoteViews的应用 / 218   5.1.1 RemoteViews在通知栏上的应用 / 219   5.1.2 RemoteViews在桌面小部件上的应用 / 221   5.1.3 PendingIntent概述 / 228   5.2 RemoteViews的内部机制 / 230   5.3 RemoteViews的意义 / 239   第6章 Android的Drawable / 243   6.1 Drawable简介 / 243   6.2 Drawable的分类 / 244   6.2.1 BitmapDrawable / 244   6.2.2 ShapeDrawable / 247   6.2.3 LayerDrawable / 251   6.2.4 StateListDrawable / 253   6.2.5 LevelListDrawable / 255   6.2.6 TransitionDrawable / 256   6.2.7 InsetDrawable / 257   6.2.8 ScaleDrawable / 258   6.2.9 ClipDrawable / 260   6.3 自定义Drawable / 262   第7章 Android动画深入分析 / 265   7.1 View动画 / 265   7.1.1 View动画的种类 / 265   7.1.2 自定义View动画 / 270   7.1.3 帧动画 / 272   7.2 View动画的特殊使用场景 / 273   7.2.1 LayoutAnimation / 273   7.2.2 Activity的切换效果 / 275   7.3 属性动画 / 276   7.3.1 使用属性动画 / 276   7.3.2 理解插值器和估值器 / 280   7.3.3 属性动画的监听器 / 282   7.3.4 对任意属性做动画 / 282   7.3.5 属性动画的工作原理 / 288   7.4 使用动画的注意事项 / 292   第8章 理解Window和WindowManager / 294   8.1 Window和WindowManager / 294   8.2 Window的内部机制 / 297   8.2.1 Window的添加过程 / 298   8.2.2 Window的删除过程 / 301   8.2.3 Window的更新过程 / 303   8.3 Window的创建过程 / 304   8.3.1 Activity的Window创建过程 / 304   8.3.2 Dialog的Window创建过程 / 308   8.3.3 Toast的Window创建过程 / 311   第9章 四大组件的工作过程 / 316   9.1 四大组件的运行状态 / 316   9.2 Activity的工作过程 / 318   9.3 Service的工作过程 / 336   9.3.1 Service的启动过程 / 336   9.3.2 Service的绑定过程 / 344   9.4 BroadcastReceiver的工作过程 / 352   9.4.1 广播的注册过程 / 353   9.4.2 广播的发送和接收过程 / 356   9.5 ContentProvider的工作过程 / 362   第10章 Android的消息机制 / 372   10.1 Android的消息机制概述 / 373   10.2 Android的消息机制分析 / 375   10.2.1 ThreadLocal的工作原理 / 375   10.2.2 消息队列的工作原理 / 380   10.2.3 Looper的工作原理 / 383   10.2.4 Handler的工作原理 / 385   10.3 主线程的消息循环 / 389   第11章 Android的线程和线程池 / 391   11.1 主线程和子线程 / 392   11.2 Android中的线程形态 / 392   11.2.1 AsyncTask / 392   11.2.2 AsyncTask的工作原理 / 395   11.2.3 HandlerThread / 402   11.2.4 IntentService / 403   11.3 Android中的线程池 / 406   11.3.1 ThreadPoolExecutor / 407   11.3.2 线程池的分类 / 410   第12章 Bitmap的加载和Cache / 413   12.1 Bitmap的高效加载 / 414   12.2 Android中的缓存策略 / 417   12.2.1 LruCache / 418   12.2.2 DiskLruCache / 419   12.2.3 ImageLoader的实现 / 424   12.3 ImageLoader的使用 / 441   12.3.1 照片墙效果 / 441   12.3.2 优化列表的卡顿现象 / 446   第13章 综合技术 / 448   13.1 使用CrashHandler来获取应用的crash信息 / 449   13.2 使用multidex来解决方法数越界 / 455   13.3 Android的动态加载技术 / 463   13.4 反编译初步 / 469   13.4.1 使用dex2jar和jd-gui反编译apk / 470   13.4.2 使用apktool对apk进行二次打包 / 470   第14章 JNI和NDK编程 / 473   14.1 JNI的开发流程 / 474   14.2 NDK的开发流程 / 478   14.3 JNI的数据类型和类型签名 / 484   14.4 JNI调用Java方法的流程 / 486   第15章 Android性能优化 / 489   15.1 Android的性能优化方法 / 490   15.1.1 布局优化 / 490   15.1.2 绘制优化 / 493   15.1.3 内存泄露优化 / 493   15.1.4 响应速度优化和ANR日志分析 / 496   15.1.5 ListView和Bitmap优化 / 501   15.1.6 线程优化 / 501   15.1.7 一些性能优化建议 / 501   15.2 内存泄露分析之MAT工具 / 502   15.3 提高程序的可维护性 / 506
比之前的合集更丰富详细的细节;没有最新只有更新! 1、建立GPRS连接 4 2、判断网络状态是否可用 4 3、获得惯性滑动的位置 5 4、横竖屏切换对话框消失 6 5、TextProssBar 显示文字 7 6、TextView的效果 9 1、TextView的Html效果 9 2、TextView实现下划线效果: 10 3、Spanned 实现TextView的各种样式 10 7、通过HttpClient从指定server获取数据 13 8、隐藏小键盘 13 9、响应Touch 15 10、Activity间的通信 15 1、Bundle传值 15 2、利用startActivityForResult与onActivityResult方法 16 11、使程序完全退出 18 12、列出所有音乐文件 18 13、使用Intent ACTION 调用系统程序 19 显示网页: 19 显示地图: 19 路径规划: 19 拨打电话: 19 发送 SMS/MMS 20 发送 Email 20 为程序添加一个“分享” 21 打开多种类型的文件: 21 Uninstall 程序 24 14、将Uri转为绝对路径 24 15、Android支持多种语言 25 16、四种动画的设置属性 25 1、尺寸伸缩动画效果 25 2、translate 位置转移动画效果 27 3、rotate 旋转动画效果 27 4、透明度控制动画效果 alpha 28 17、横竖屏状态获取 28 18、获取手指在屏幕的左右滑动 29 19、解除屏幕锁 30 20、ViewFlippe实现循环的动画 31 21、播放gif动画 31 22、飞行模式转换解析 36 23、实现按home键的效果 38 24、httpget与post 38 Handler+Runnable模式 40 Handler+Thread+Message模式 42 Handler+ExecutorService(线程池)+MessageQueue模式 44 Handler+ExecutorService(线程池)+MessageQueue+缓存模式 45 25、Bitmap操作 49 获得输入流 49 将输入流转化为Bitmap流 49 给ImageView对象赋值 49 获取SD卡上的文件存储路径 50 将图片保存到SD卡上 50 26、TextView垂直滚动 51 27、判断某服务是否开启 56 28、判断SD卡是否已挂载 56 29、文件操作类 57 1、获得文件或目录的大小 57 2、递归删除目录或文件 57 30、手动更新所有Widget 58 31、有关ListView 问题 58 32、在手机上打开文件的方法 59 33、使用系统自带的TabHost的问题 59 34、弹出菜单 61 35、Toast重叠显示时延迟解决 62 36、ADT新特性:ImageView的定义 62 37、MotionEvent 中获取坐标的问题 63 38、添加多个Widget样式 63 39、为Activity添加快捷方式 67 40、点击widget获取ID 68 41、ViewFlipper小动画 69 42、setTextColor的问题 70 43、获取程序信息并kill 70 44、mediaPlayer 与 soundPool 74 45、标题栏添加图标 76 46、 URI 76 案例分析:SD卡插拔事件的匹配 77 47、BroadcastReceiver旧事重提 77 48、从CalendarProvider得到数据的方法: 78 50、屏幕关闭,不睡眠 79 51、Android与 Linux休眠 79 52、防止系统、屏幕休眠(避免服务停止等问题) 83 53、读取office文件 88 1、读取doc文件: 88 2、 读取xls文件: 90 54、设置ListView滚动条属性 92 55、获取Array.xml文件中的值 93 56、获取系统媒体声音文件 93 57、自定义Adapter 94 58、记住listview滚动位置 94 59、更改系统超时休眠的时间 94 60、更改对话框大小 95 61、json数据格式解析 95 62、两种Toast 97 63、控件抖动的实现 98 64、判断媒体文件类型 99 65、编写使用root权限的应用 102 66、获取所有安装了的App的信息 103 67、帧动画 104 68、scrollview 106 1、横向反弹效果 106 2、整个屏幕横向滚动 108 69、内存泄露分析 111 1、内存检测 111 2、内存分析 112 70、避免内存泄露 113 71、屏蔽Home键 118 72、onTouch 和 onClick 事件 118 73、监听某个数据表 119 74、IP地址 120 1、获得IP 120 2、设置IP 121 75、判断Intent是否可用 122 76、软件更换皮肤 122 77、禁止软件盘自动弹出 124 78、EditText设置最大宽度 124 79、搭建流媒体服务器 125 80、获得 LayoutInflater 实例的三种方式 125 81、获得屏幕像素的两种方法 126 82、ShowDialog(int id); 126 83、透明效果的实现 128 84、根据网络或GPS获得经纬度 128 85、TextView 130 90、获取存储卡和手机内部存储空间 130 91、获得当前应用的UID 131 92、图片压缩类 132 93、一次性退出所有Activity 136 95、Java替换字符串,不区分大小写 138 96、Java获得随机数 139 97、MD5加密 141 98、HTTP数据传输 141 从Internet获取数据 141 向Internet发送数据 143 99、Jason解析 146 100、广播 147 101、SQLite清空数据库 147 102、反射机制 148 103、JS 148 104、TextView多行末尾显示省略号 148 105、竖直显示的textView 153
好的,下面是 Android 10 软键盘根据 EditText 位置显示的完整代码: ```java import android.graphics.Rect; import android.os.Bundle; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import androidx.core.widget.NestedScrollView; public class MainActivity extends AppCompatActivity { private EditText editText; private NestedScrollView scrollView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.edit_text); scrollView = findViewById(R.id.scroll_view); View decorView = getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } @Override protected void onDestroy() { super.onDestroy(); View decorView = getWindow().getDecorView(); decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } private final OnGlobalLayoutListener onGlobalLayoutListener = new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); editText.getGlobalVisibleRect(rect); int screenHeight = getResources().getDisplayMetrics().heightPixels; int keyboardHeight = screenHeight - rect.bottom; if (keyboardHeight > 0) { // 软键盘弹出 scrollView.scrollBy(0, keyboardHeight); } else { // 软键盘隐藏 scrollView.scrollTo(0, 0); } } }; } ``` 其中,`editText` 是需要根据其位置调整软键盘显示位置的 EditText 控件,`scrollView` 是包含 `editText` 的 ScrollView 控件。 在 `onCreate()` 方法中,我们注册了窗口布局变化的监听器,以便在软键盘弹出或隐藏时动态调整 ScrollView 的滚动位置。在 `onDestroy()` 方法中,我们移除了监听器,以免造成内存泄漏。 需要注意的是,在 AndroidManifest.xml 文件中要为该 Activity 添加以下属性: ```xml <activity android:windowSoftInputMode="adjustResize" /> ``` 这样,当软键盘弹出时,系统会自动调整 Activity 的布局大小,以便软键盘和 EditText 能够同时显示在屏幕上。 希望这个完整代码对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值