admin管理员组

文章数量:1659520

问题一、Bitmap 如何保存成为一个 bmp  文件

很多人可能发现了 Android 的 Bitmap 对象无法保存成为一个 bmp 文件,即提供的方法只有compress(Bitmap.CompressFormat format, int quality, OutputStream stream) ,可以存为 png 和 jpg,png 可能还好说,但是 jpg 是有损压缩会降低图片的质量,其实 Google 还提供了一个 API 在 Bitmap 类,通过 copyPixelsToBuffer(Buffer dst) 这个方法来解决,Buffer 类型,和前几天我们说到的 NIO 中的ByteBuffer 处理方式一样,需要说明的是 java 中的 Buffer 在内存中是连续成块的,同时底层有 C++支持效率还是很高的。

通过 copyPixelsToBuffer(Buffer dst) 方法将会返回一个 RGB8888 格式的 DIB 文件,DIB 位图和设备无关,这里提醒大家,如果想显示出位图,还需要将其加上位图的文件头才行。

问题二、ByteBuffer 的 flip,clear 及 rewind 区别

下面给大家这三种方法的源码,方便记忆。

1. public final Buffer clear() {
2. position = 0; //设置为 0
3. limit = capacity; //极限和容量相同
4. mark = -1; //取消标记
5. return this;
6. }
7.
8. public final Buffer rewind() {
9. position = 0;
10. mark = -1;
11. return this;
12. }
13.
14. public final Buffer flip() {
15. limit = position;
16. position = 0;
17. mark = -1;
18. return this;
19. }

从上面对比来看 flip 和 rewind 的区别就是 flip 会制定极限和位置相同,所以我们写数据时不多不少正好,而 clear 则清空缓冲区。

问题三、 Android 都支持哪些 Java 特性

很多 Java SE 或 EE 的程序员想转到 Android 平台上进行开发,对于 Android 平台上到底对 Java 支持有多少呢?目前来看 JDK 的高级特性均支持,比如说 1. Java 的反射、2.NIO (New I/O)、3. JNI (Java NativeInterface)

相对而言 对于 OpenGL 和 SQLite 的支持比较强大,但是 AWT 和 JDBC 这些东西都不支持。在 Xml 解析上,兼容 DOM、XmlPull 和 SAX,同时数据交换格式上,Android 虽然不支持 LINQ 但对于Java 来说 JSON 同样支持。对于 Http 处理方面,提供了轻量级的 Http 处理类,以及更完善的Apache 库支持。音频方面 Android 比较强大,使用了 OpenCore 库,很多地方我们可以自己编写编码、解码器进行扩展。Android 在文件系统上基本山和 Java 是相同的,不过对于高效率的内存影射文件而言提供了android.os.MemoryFile 这个类。

总体而言,Java 程序员转入 Android 开发只需要了解平台特有的,Intent,Service,Receiver 和Activity 就差不多了,深入了解下 AIDL 和 UI 控件和自定义 Widget 基本上可以胜任常规的工作。

问题四、EditText 控件无法代码设置 

ReadOnly 只读我们可能发现 Android 的EditText 控件有个设计 bug,就是无法使用 Java 代码方式设置 ReadOnly只读方式,但是 提示大家通过 xml 代码可以设置 android:editable="false" ,相关的setEnabled 方法这里不适用,同时 android.text.Editable.Factory 也无法设置可编辑,该类相关方法只有 static Editable.Factory getInstance() 和 Editable newEditable(CharSequence source) 两个。

目前还没有很好的解决方法,EditText 控件这种设计缺陷确实比较麻烦,可以通过父类 TextView 的 addTextChangedListener(TextWatcher watcher) 方法,设置一个 listener 监控文字修改后立即恢复原来内容即可。

问题五、 使用 xml 让你的 Activity 无标题方法

如何不在 onCreate 中设置无标题,其实方法比较简单,在 androidmanifest.xml 中找到需要设置的 Activity,加一个属性内容为android:theme="@android:style/Theme.NoTitleBar" 即可,比如说 这样子 android123_cwj 这个窗口在运行时就没标题了。是不是很简单,同时大家使用 onCreate 中的 Java 代码如何设置,注意一定要在setContentView 之前执行 requestWindowFeature(Window.FEATURE_NO_TITLE);这句,顺序不要搞颠倒,代码如下:

1.requestWindowFeature(Window.FEATURE_NO_TITLE);

2. setContentView(R.layout.mainj)

问题六、Android 应用完全退出终极篇

Android 应用如何完全退出,给大家介绍一种方法,制造异常退出。

1. 首先我们可以制造一个空指针的异常,比如 TextView.setText 方法中执行一个 int 型的内容,由于 setText 方法重载了 R.string.xxx 这样的资源 int 型内容,但是我们没有声明这个资源,仅仅把 String写成了 int 的值,就会产生一个异常,这时系统 Dalvik VM 会直接关闭你的进程,这招十分有效。

2. 但是有的说了,有 Force Close 的对话框怎么办,其实我们通过重写 Android 应用程序的Application 基类自己实现 Thread.UncaughtExceptionHandler 接口的 uncaughtException 方法是可以避免出现 FC 窗口的,用户感觉直接退出了一样。

问题七、 View 类中setPadding 和setMargins 区别

对View类中提供的setPadding和setMargins两个方法有什么区别不是很了解,其实在Android自绘控件时我们需要计算控件大小,使用过 getMeasuredWidth() 和 getMeasuredHeight()方法计算和父容器之间的距离可以用 setMargins 方法, 对整个屏幕的间距计算我们可以使用 getWidth()和getHeight()这两个方法获得。

有关Padding和Margins的最好解释,可以在一个Layout中放上多个Button,设置Button的 Padding 和 Margins 同时设置 Button 父 View 的这两个属性来观察下按钮位置和按钮文字显示位置就可以简单区分不同了。

问题八、 Android 最简单播放 GIF 动画方法

GIF 动画竟然 Android 无法播放,其实 GIF 动画的原理就是逐帧播放,在 Android 中提供了 AnimationDrawable 类可以实现,有的写过 GIF89A 的解码方法在过去的 J2ME 平台移植到 Android平台也能用,其实在 Google Android 上面开发目前 2.2 以后的固件支持的方法除了 Flash Player 外,更好的兼容方法就是使用万能的 webkit 浏览器了,我们直接在工程中内嵌一个 webView,当然了路径大家可以换成本地的,对于浏览器使用本地资源 url 为 file://开头。不过 webView 的资源消耗也不小,开个webView 对象可能占用了至少 8MB 的 RAM 吧,保守估计,当然更多的要看插件和以及 html 的复杂程度所决定。

问题九、 Binder invocation to an incorrect interface 错误

有时候我们可能发现Android的版本不同,有些AIDL的调用可能会爆ERROR/AndroidRuntime(28520):java.lang.SecurityException: Binder invocation to an incorrect interface 这样的错误,表面上看是安全问题,但出现 Binder invocation to an incorrect interface 这样的错误,可能是由于 API 变动导致了 AIDL 的声明有出入,为了防止执行意外出现空指针,Android 平台默认保护了进一步的执行,从错误的提示来看就是不正确的接口异常,一般我们检查时可以查看源代码参考解决。

问题十、 Android 上开发手机浏览器原理

如何开发一款 Android 上的手机浏览器呢? 目前Google的Android平台上有几款比较热门的产品,比如说Opera Mini、Dolphin Browser、Firefox、UC 以及手机 QQ 浏览器等,他们之间还是有一定的区别:

1. Opera Mini 使用的是自己的渲染引擎,页面经过重新排版处理,需要中间服务器干预好处就是压缩数据,省流量。

2. Dolphin Browser 在国外用的比较多,国内用户较少,这里不做过多介绍。

3. Firefox 在 Android 平台上是因为 Google 推出了 NDK,使用了 mozilla 自己的渲染引擎,支持Javascript 解析,效率直逼 Webkit 内核,不过整体对 W3C 的支持大于桌面平台的 IE。

4. UC 是国内大家较熟知的产品前身为 UCWEB,当初是为节省流量而设计类似 Opera Mini,但对于 JS脚本的支持无能为力,内部使用了自己的 HTML 解析器,当然现在的版本已经由服务器中转压缩数据,不过渲染效果不如 webkit 和 firefox 的效果好。

5. 手机 QQ 浏览器的实现类似 UCWEB,比较山寨但 UCWEB 主要的功能都包含了在内。

6. GO 浏览器是 3G 门户推出的一款手机浏览器,和 UC 差不多,可以说是模仿。

经过上面的分析来看,Android 开发网将手机浏览器定为两大类三种情况。

1. 高效内核、功能全面,比如 Android 自带的 Chrome Lite,或 iPhone 上的 Safari 浏览器,Firefox、IE。

2. 模拟浏览器,Opera 其实自己有解析引擎,但 Opera Mini 更像一个 html 解析器,并不能真正的算浏览器和桌面上差距很大,UC、QQ 以及 GO 类似 Opera 其实他们没有自主的 JavaScript 的支持,对 W3C 标准支持有限和 PC 上的浏览器设计原理有很大的不同。

3. 增强型,基于 Android 的 Webview 或修改 WebView 设计的基于 webkit 的产品,这类浏览器开发轻松,更像重新定制系统的浏览器,可以加入很多辅助功能,或者说更好的 UI。

本文标签: 集锦卓开发