2. 可以在任何地方获取数据但应该在另外一个地方请求数据
3. 在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法
8.2 ListView的图文混合显示
8.2.1 异步加载图片基本思想:
1.先从内存缓存中获取图片显示(内存缓冲) 2.获取不到的话从SD卡里获取(SD卡缓冲)
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示) 8.2.2 具体优化
优化一:先从内存中加载,没有则开启线程从SD卡或网络中获取,这里注意从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅。
优化二:在adapter里新建一个busy变量,表示listview是否处于滑动状态,如果是滑动状态则仅从内存中获取图片,没有的话无需再开启线程去外存或网络获取图片。
优化三:利用线程池在从网络获取图片时,先是将其保存到sd卡,然后再加载到内存,这么做的好处是在加载到内存时可以做个压缩处理,以减少图片所占内存
资料与源码实现(见附件) 8.2.3 关于图片错位的处理
图片错位问题的本质源于我们的listview使用了缓存convertView,假设一种场景,一个listview一屏显示九个item,那么在拉出第十个item的时候,事实上该item是重复使用了第一个item,也就是说在第一个item从网络中下载图片并最终要显示的时候其实该item已经不在当前显示区域内了,此时显示的后果将是在可能在第十个item上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。在ImageLoader里有个imageViews的map对象,就是用于保存当前显示区域图像对应的url集,在显示前判断处理一下即可。
9 JNI
9.1 快速智能开发步骤
1. 配置NDK目录结构(只需一次)
2. 添加本地支持:右键选中工程,Android Tools—>Add native support 3. 将cpp代码改成c代码,注意Android.mk文件也要修改,刷新工程,删
除obj目录 4. 声明本地方法,实现对应c代码实现:Javah+全类名 生成本地方法标头
文件,把头文件剪切到jni目录下,c代码引用头文件,实现头文件里的方法。
5. 实现对应的c代码
6. 交叉编译,一锤子敲下去
7. 使用静态代码块,引用库函数,调用方法
9.2 开发中常见的JNI问题
9.2.1 错误一
10-31 06:42:33.645: E/AndroidRuntime(805): java.lang.UnsatisfiedLinkError: Native method not found:
com.example.ndk2.MainActivity.hello_From_C:()Ljava/lang/String;
1. 引入的函数库名字不对,或者没有引入 2. java方法和c方法不对应 3. 部署的平台有问题 9.2.2 错误二
当前工程报错,但是没有任何文件有错误,有可能Android.mk有问题 在Android.mk文件中 不要用到全角空格或者回车 9.2.3 错误3
在C代码中有编译时异常 , 在控制台上会提示
9.2.4 错误4
10-31 06:53:23.165: A/libc(2075): Fatal signal 11 (SIGSEGV) at 0x476a415c (code=2), thread 2075 (om.example.ndk2)
下面打印一大堆debug信息 C代码中 有运行时异常
9.3 应用场景
1. 2. 3. 4. 5.
输出日志
收集用户反馈信息 用户登录 加密算法 电商数据加密
10 静默安装
10.1 方式一:定制ROM
Google的安全策略要求任何应用应该提示APK安装包的权限,对于一些内置特定厂商应用,可以跳过安装过程的信息加快安装,或者运营商强制安装。
10.2 方式二:查看系统源码
10.2.1 基本原理
在窗口中点击一个APK时,触发单击事件,PackageInstaller接收系统服务PackageManagerService传来的intent信息,传来的Intent信息中有APK的一些参数。实现的关键是区分一般APK和特定APK。
通过传给PackageManagerService的intent中添加特别的参数,PackageInstaller接收后进行判断,进行特别的隐藏安装流程。这个实现只能通过程序调用的方式安装。
安装过程的信息窗口在PackageInstallActivity.java中实现的。安装过程的信息窗口有4个:需要实现一个PakkageInstallActivityHide.JAVA的文件,去掉下面的dialog和窗口
安装权限确认窗口:installPermissionConfirm 安装进度条:installProgress 安装结果窗口:installResult 安装错误提示对话框 10.2.2 具体实现(方法一)
1. 在Androidmainfest.xml声明一个特定的intent:
android.intent.action.VIEW.HIDE,由PackageInstallActivityHide.java
来接受 注意:
2. 3. 4. 5.
实现PakkageInstallActivityHide.java,UninstallerActivityHide.java。 只需把PakkageInstallActivity.java修改去掉dialog和对话框。 安装程序调用者发一个上面定义的intent即可。如下例子,静默安装/sdcard/hello.apk 卸载的方法类似。
注意,这个方法需要PackageInstall这个apk必须与系统一起编译。这个apk在/system/app/目录下面;android.intent.action.VIEW.HIDE 这个静默安装的接口需要开放给第三方。
10.2.3 具体实现(方法二)
1. 从模拟器System\\framework目录下提取framework.jar
2. 将framework.jar后缀名改为zip,解压后提取其中的classes.dex文件 3. 用dex2jar工具将classes.dex转成classes.dex.dex2jar.jar(注意新版本
的dex2jar工具无法转换Android2.2的framework,建议使用dex2jar-0.0.7.8-SNAPSHOT,该工具可以从google官方站上下载到)
4. 将classes.dex.dex2jar.jar改名为classes.dex.dex2jar.zip解压取出
android/content/pm/目录下的PackageManager.class,IPackageInstallObserver.class,IPackageDeleteObserver.class及相关的几个class文件备用
5. 找到android-sdk目录下的android.jar,改名为android.zip(注意改名前
先备份一下),解压后将步骤4中取得的class文件覆盖到android对应的目录下, 6. 这个时候你的android.jar已经是一个更新过的SDK了,重新打开eclipse
工程,你已经可以调用方法:
void android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)
11 Android中数据的存储方式
11.1 方式
1. Shared Preferences:主要用于保存程序的系统配置信息。用来存储
“key-values paires”。一般用于保存程序启动时设定的信息,以便在程序下一次启动时继续保留前一次设定的信息。 2. xml 3. Files:用文件的形式保存信息。可以通过对文件的读写来获取或保存相
关信息。 4. SQLite:用数据库的形式保存信息。SQLite是一个开源的数据库 系统。 5. NetWork:将数据保存于网络。
11.2 区别
1. Shared Preferences:
Android提供用来存储一些简单的配置信息的一种机制,例如,一些默认欢迎语、登录的用户名和密码等。其以键值对的方式存储,
SharedPreferences是以XML的格式以文件的方式自动保存的,在DDMS中的File Explorer中展开到/data/data/
在Android中,其提供了openFileInput 和 openFileOuput 方法读取设备上的文件,下面看个例子代码,具体如下所示:
String FILE_NAME = \确定要操作文件的文件名 FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); //初始化
FileInputStream fis = openFileInput(FILE_NAME); //创建写入流 上述代码中两个方法只支持读取该应用目录下的文件,读取非其自身目录下的文件将会抛出异常。需要提醒的是,如果调用 FileOutputStream 时指定的文件不存在,Android 会自动创建它。另外,在默认情况下,写入的时候会覆盖原文件内容,如果想把
新写入的内容附加到原文件内容后,则可以指定其模式为Context.MODE_APPEND 3. SQLite
SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库 4. NetWork:
将数据上传到网络 补充:
1. Shared Preferences底层使用xml,xml也可以保存数据,但是Shared
Preferences只能保存键值对方式,xml能保存复杂数据
2. Content provider底部还是使用了Sqlite数据库,也是算一种方式。