缓存 Bitmap 实现快速访问图片

2016-1-6 chenhui 零散笔记

将单个Bitmap加载到UI是简单直接的,但是如果我们需要一次性加载大量的图片,事情则会变得复杂起来。在大多数情况下(例如在使用ListView,GridView或ViewPager时),屏幕上的图片和因滑动将要显示的图片的数量通常是没有限制的。 通过循环利用子视图可以缓解内存的使用,垃圾回收器也会释放那些不再需要使用的Bitmap。这些机制都非常好,但是为了保证一个流畅的用户体验,我们希...

阅读全文>>

评论(0) 浏览(219)

加载大图

2016-1-6 chenhui 零散笔记

Android 限制每个应用程序所能使用的内存,这就带来一个问题:当我们加载一张大图片的时候,由于内存的不足,容易导致 OOM 错误。 本文介绍如何通过加载一张大图的缩小版本,来防止 OOM 错误。 为了避免java.lang.OutOfMemory 的异常,我们需要在真正解析图片之前检查它的尺寸(除非你能确定这个数据源提供了准确无误的图片且不会导致占用过多的...

阅读全文>>

评论(0) 浏览(163)

[转]Fragment

2016-1-6 chenhui 零散笔记

可以把fragment想象成activity中一个模块化的部分,它拥有自己的生命周期,接收自己的输入事件,可以在acvitity运行过程中添加或者移除(有点像"子activity",可以在不同的activity里面重复使用)。 Fragment 的创建 创建一个fragment,首先需要继承Fragment类,然后在关键的生命周期方法中插入APP...

阅读全文>>

评论(0) 浏览(259)

编写不同的 Layout 来适配不同的屏幕

2016-1-5 chenhui 零散笔记

Android 有: 4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge) 4种普遍分辨率:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 为了针对不同的屏幕去优化用户体验,我们需要为每一种将要支持的屏幕尺寸创建唯一的XML文件。每一...

阅读全文>>

评论(0) 浏览(147)

多媒体

2016-1-4 chenhui 零散笔记

音乐播放 //播放 res/raw 目录中的音频资源(mp3) MediaPlayer mediaplayer = MediaPlayer.create(this,R.raw.music); if (mediaplayer != null) mediaplayer.stop(); //执行一些准备工作 mediaplayer.prepare(); //开始播放 mediaplayer.star...

阅读全文>>

评论(0) 浏览(269)

AIDL Service

2016-1-4 chenhui 零散笔记

AIDL Service 就是可以被其他应用程序访问的 Service。 建立 AIDL Service 的步骤如下: 在 Android 工程中的源文件目录建立一个 *.aidl 文件,他语法类似 Java,支持基础数据类型,不支持访问修饰符,编译后会生成一个 *.java 的接口文件。 定义一个继承了 <...

阅读全文>>

评论(0) 浏览(158)

Service

2016-1-4 chenhui 零散笔记

Service 分为两种,一种是独立于其他 Activity 运行的 Service,另一种则是需要通过其他 Activity 绑定的 Activity 并进行控制的 Service。 第一种 Service 非常简单,实例如下: public class Service1 extends Service{ @Override ...

阅读全文>>

评论(0) 浏览(177)

HTTP

2016-1-4 chenhui 零散笔记

发送 GET 请求的简便方法 //要发送的 URL。即 <host><?><x><=><y>... 这种格式 String url = <URL> //创建 GET 对象 HttpGet httpget = new HttpGet(url); //发送 GET 请求 HttpResponse response = n...

阅读全文>>

评论(0) 浏览(155)

WebView

2016-1-4 chenhui 零散笔记

XML 随便定义即可 。 public class MainActivity extends Activity { WebView webview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);...

阅读全文>>

评论(0) 浏览(131)

输入输出(IO)

2016-1-1 chenhui Java

字节流类:     InputStream()     OutputStream()     所有字节输入输出类的基类,抽象类。     FileInputStream(File/FileDescriptor/String) ...

阅读全文>>

评论(0) 浏览(190)

Google 服务的添加

2015-12-31 chenhui ROM

Android 源代码中并不包含比如 Google Play 的谷歌服务,这些谷歌服务也不开源,所以需要我们自己进一步添加。 添加方法也很简单,获取到 Google 服务的 APK 包后,直接放到 system/app 目录里即可。 下载地址如下: GoogleServicesFramework.apk ...

阅读全文>>

评论(0) 浏览(176)

写时复制

2015-12-25 chenhui 程序的运行原理

所谓写时复制技术,即创建子进程时(非创建线程),共享父进程的页框(一个页框就是 4K 物理内存)。 为什么要这么干?这是因为,创建子进程后,其执行的程序和父进程是一样的,只是分支不同而已,所以我们根本不需要重新申请物理内存给新进程,而是让他直接使用父进程已经加载好的程序即可。这会产生一个问题,那就是子进程和父进程是各自独立的,他们不是进程和线程的关系,子进程对某些...

阅读全文>>

评论(0) 浏览(301)

程序的加载和运行

2015-12-25 chenhui 程序的运行原理

在阅读本文前,请先阅读:进程的创建 了解 fork() 的实现原理。 Linux 支持多种可执行文件格式,但通常使用的是 ELF 格式的可执行文件,关于这个格式,可自行往上搜索相关资料进行了解。 先概括一下总流程吧: 读入命令行参数和环境变量参数,以及他们的个数。 为用户栈提前分配好32个页框,并读入命令行参数和环境参数 ...

阅读全文>>

评论(0) 浏览(419)

页表的页描述符

2015-12-24 chenhui 程序的运行原理

之前说明了页表的段描述符的转换原理,段描述符有非常多的不足之处,比如说他以1M为单位来进行映射,这仅仅只能满足最基本的映射要求,而像linux之类的嵌入式操作系统,则一般使用二级页表来实现4K大小的映射。 二级页表分为粗粒度二级页表和细粒度二级页表,本文主要讲解的是粗粒度二级页表,他可以实现以 4K 字节为单位的映射(Linux 里一个页刚好就是 4K),且可以通过操作子页的方式来实现对1...

阅读全文>>

评论(0) 浏览(296)

页表的段描述符

2015-12-24 chenhui 程序的运行原理

前文提到,页表是用来提供 MMU 的地址转换规则的页表项的集合,对于 Linux 来说,他使用了二级页表来管理内存的映射。 所谓的二级页表,就是有两层页表,第一层是称为段描述符的页表项,第二层是称为页描述符的页表项。本文介绍第一种也就是段描述符。 段描述符,他以段为单位映射虚拟内存和物理内存,一个段的段大小为 1M,这个段大小又是怎么回事?这个地方我们得先...

阅读全文>>

评论(0) 浏览(275)

多进程的原理之页表

2015-12-24 chenhui 程序的运行原理

现代操作系统都支持多进程,所谓的多进程,就是系统能够同时运行多个进程。乍一看,好像同时运行多个进程是个很正常的事情,不就是每一个程序都执行一段时间吗?有什么好说的?但只要仔细一想,就会觉得有点匪夷所思。我们知道,程序里面的各自符号的地址在编译时就已经决定了,那么,如果我们同时运行两个程序,他们的地址发生了重叠怎么办?那岂不是后面的进程要覆盖掉之前的进程?这样还怎么实现多进程? ...

阅读全文>>

评论(0) 浏览(298)

根文件系统的挂载之根文件系统镜像挂载

2015-12-23 chenhui 文件系统

流程( 一定要注意:现在是把 rootfs 作为临时的根文件系统 ): 把 devfs 挂载到 /dev 目录 得到存放根文件系统镜像的分区块设备路径,得到块设备的设备号,并再为他创建设备文件 /dev/root 尝试用系统中所有已注册的文件系统来装载块设备上的文件系统到 /root, 只要有一个成功即根文件系统挂载成功 把进程的...

阅读全文>>

评论(0) 浏览(276)

Native 代码回调 Java 代码

2015-12-23 chenhui NDK

C 语言调用 Java 代码和 Java 反射实际上非常相似,或者说在底层上来说根本就是一回事。本文介绍如何使用 C 代码来调用 Java 代码。 void JNICALL Java_xxx_calljava(JNIEnv * env, jobject obj){ //使用 java 的反射得到要使用的 Java 类 jclass dpclazz = ...

阅读全文>>

评论(0) 浏览(153)

NDK 库的开发和应用程序的调用

2015-12-23 chenhui NDK

NDK 程序分两种,一种是以 JNI 库的形式存在,被 Android 应用调用,也就是官方文档中的 hello-jni;这个另一种是完全使用本地代码编写,对应官方文档中的 native_activity。本文介绍第一种 NDK 程序的编写方法,第二种 NDK 程序的编写方法,可以参考本篇译文:freehui.com/?post=165。 先给出编写步骤,然后再给出每一...

阅读全文>>

评论(0) 浏览(192)

应用程序使用 JNI 接口操作硬件

2015-12-22 chenhui HAL

编写完 HAL 库和 Service 库后,驱动部分就算是完成了,接下来的就是应用程序如何去使用 Service 库提供的 JNI 接口的问题。 一般来说,我们都会把调用 Service 库的代码写成一个类,并单独打包成 jar 文件,下面是这么一个类的简单实现。 package com.android; public class ...

阅读全文>>

评论(0) 浏览(151)

Copyright ©2015-2016 freehui All rights reserved