《Android应用开发实战(第二版)》学习记录

本文总结了Android开发中的实用技巧,包括启动画面实现、内容切换、按钮动态创建等,还介绍了如何处理配置变化、图像特效及数据缓存策略等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.splash的实现

实现splash启动画面,最简单都是使用窗口主题(Theme),直接设置背景图片。

  • splash的图层叠加,可以使用<layer_list>标签,每个图像用item标签。(res/drawable/xxx.xml)
  • 创建一个style,来定义启动画面都背景。<style xxxx parent="android.:Theme"> ,通过item指定<item name="android:windowBackground">@drawable/xxx.xml</item>
  • AndroidManist.xml中为Activity指定style
Note:之前我的实现一直都是实现一个splash的activity,进行初始化后,再跳转到main activity

2.内容的快速切换

  • 创建一个FrameLayout,里面定义各种widget,内容切换时,设置各个widget的visibility。

Note:之前我的实现都是进行activity的切换或者动态的inflate view。


3.创建按钮列表

动态创建一系列按钮:

  • 在/res/values/arrays.xml中定义多个array,每个button上的文字,背景和id都分别定义一个array。
  • 在id.xml中预先定义好每个button的id,这样就可以在代码中全局引用。
  • 在java代码中,通过获取array资源,动态inflate每个button后,add到parent view。

Note:以前我都实现是写死在layout文件中,不够灵活。


4.全局访问对象

  • 在AndroidManifest.xml中Application标签,指定自己的Application类。
  • 代码中通过context.getApplicationContext()来访问

Note:以前我都是用单例模式。上面都方法有一个限制,就是必须在context中才能访问,单例可以在任何类中访问。


5.json数据解析

  • 定义类的成员变量,名称与json的key名称完全相同,通过类都反射进行赋值,效率更高。

Note:通过java bean的方式,定义各个成员变量保存json中都值。通过一堆setXXX进行赋值,效率低。


6.text处理

  • 一定要用正则表达式进行查找

7.任务队列的处理

任务处理框架:
  • 建立一个类,保存任务的list,并提供任务list的增,删,查等操作。
  • 建立一个monitor,定期检测任务list的状态,如果有任务,就进行处理。
  • 每一类任务的处理,都有单独的处理实现。
  • 还需要增加一个通知的机制,当任务处理结束以后。(书中未提及)

Note:以前的任务处理框架跟上面差不多,但是使用消息驱动(通过消息机制),而不是通过timer。

8.图像处理时区域选择

  • 实现一个FrameLayoutExt,继承自FrameLayout
  • 在onDraw方法中,绘制特效区域的边框
  • 在onTouch方法中,处理拖拽的实现

9.图像特效处理

灰度:取得bitmap的每个像素点,通过公式:红*0.3+绿*0.59+蓝*0.11,将这个值再设置回像素点
马赛克:将图片分割成小区域,然后用每个小区域中心的像素点,来设置整个小区域。
截图:在Bitmap.createBitmap()方法中,指定矩形大小
旋转:在Bitmap.createBitmap()方法中,传入Matrix对象,matrix里有一些设置方法,比如setRotate等

10.ListView的第一个item显示特殊信息(比如:刷新)

  • 复写getCount方法,返回items.size()+1
  • getView方法中,通过position进行判断:position为0时,表示第一个item,进行特殊layout的inflate

11.缓存api接口

  • 当一些api接口通过json返回数据时,可以将json转换为string后,写入到文件中,保存在本地,文件名称可以是api的url,以保证唯一。
  • 一些简单的key-value的数据,可以通过SharedPreference保存

12.apk签名

  • 命令行:使用JDK中的keytool和jarsinger工具。
  • ADT插件:通过android tool

13.onSaveInstanceState与onRestoreInstanceState

两个方法被调用的条件:
  • Activity中的变量被回收
  • Activity的状态被动的被改变,比如来电,home键,横竖屏切换。
  • 两个方法并不是一定会成对调用

14.处理configration change

  • AndroidManifest.xml中,android:configChanges=“xxx”处理,这样当config change的时候,就不会重新调用onCreate,调用onConfigurationChanged方法

15.图像淡入淡出效果

  • 在drawalbe下创建资源文件,transition标签
  • 每个transition下只能有2个标签
  • 通过TransitionDrawable的startTransition和reverseTransition方法进行切换和恢复

16.设置image的样式

  • 通过scale标签设置缩放
  • 通过shape设置形状

17.动画效果

  • 属性动画
  • 帧动画
  • 补间动画

18.来电拦截

  • 通过设置占线时进行呼叫转移,设置到不同的手机号上,可以实现来电转移。
  • 设置代码:
     设置取消查询
    始终呼叫转移**21*电话号码###21#*#21#
    占线时呼叫转移**67*电话号码###67#*#67#
    无应答时呼叫转移**61*电话号码**响铃时间###61#*#61#
    无法接通时呼叫转移**62*电话号码###62#*#62#

  • 通过发送intent设置,比如 Intent it = new Intent(Intent.ACTION_CALL, Uri.parse("tel:**67*13899999999#")); startActivity(it)

19.监听来/去电

  • 来电:通过Receiver接受广播和TelephonyManager里注册listener两种方式
  • 去点:通过Receiver一种方式

20.挂断电话

通过反射方式:
  • 在TemephonyManager中,获取ITelephony接口
  • 继续通过反射,获取ITelephony接口中的endCall方法

21.获取通话记录

  • 通过Contact的Content Provider,uri是content://call_log/calls

22.短信

  • 发送方式:通过intent和SmsMessage的sendTextMessage方法。
  • threadId与电话号码的对应关系,存在于mmssms.db中的canonical-addresses表,uri是content://mms-sms/canonical-addresses
  • 短信/彩信的接收,都是通过receiver接收数据,短信通过SmsMessage.createFromPdu进行解析,彩信通过PduParser进行解析

23.查询sd卡中多媒体资源

  • 系统对写入sd卡的多媒体资源进行监控,会保存在一些表中
  • 表的信息,通过MediaStore进行查询,比如uri,表的列名

24.已接收/发送的彩信

  • 保存在mmssms.db里,彩信信息保存在pdu表中,彩信内容保存在part表中
  • part表中的mid对应到pdu表中的_id,也就是说是多对一的关系
  • part表中的ct表示彩信的类型,有audio,video,image,smil等
  • pdu的uri是content://mms,part的uri是content://mms/part
  • smil是一种类似html格式的协议,定义彩信的布局和内容
  • part表的_data域,定义了彩信内容的非文本彩信的数据文件的地址

25.获取联系人

获取联系人信息的uri
  • 不完全信息:Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "contacts")
  • 完全信息:Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "data/phones")

26.添加联系人:

  • 先通过插入RawContacts.CONTENT_URI,生成rawId
  • 再通过Data.CONTENT_URI,插入联系人信息

27.sqlite操作

使用replace代替insert命令,可以避免重复插入时,产生的数据冲突异常

28.db4o

面向对象的数据存储
  • http://developer.db4o.com/Downloads.aspx下载,将jar文件放在app的lib下
  • 使用时,通过类直接进行插入。
  • 查询时,通过类的实例。条件查询就是给实例中成员变量赋值然后查询。

29.蓝牙

打开设备:
  • 通过intent:BluetoothAdapter.ACTION_REQUEST_ENABLE
  • 通过BluetoothAdapter.enable()和disable()
使自己被搜索:
  • 通过反射获取BluetoothAdapter获取mService变量,实际为IBluetooth类型接口,此接口中有设置方法。
  • 搜索其他蓝牙:
  • BluetoothAdapter.getBondedDevices获取已经绑定的蓝牙设备
  • BluetoothAdapter.startDiscovery扫描其他设备,通过intent返回搜索信息
数据传输:
  • 通过BluetoothSocket与BluetoothSocketServer
  • 类似普通的socket机制进行读写

30.第三方库

GTalk客户端:
  • GTalk基于XMPP协议的IM
  • android上有一个精简的smack,叫做asmack实现了XMPP协议,利用这个lib,可以通过GTalk的公共api
Ftp客户端:
  • 可以基于apache的一个开源lib开发
  • org.apache.commons.net.ftp
绘制图表:
  • AChartEngine库

31.性能测试工具traceview

  • Debug.startMethodTracing("xxx.log");
  • Debug.stopMethodTracing();
  • 生成xxx.log文件,通过traceview xxx.log,会生成一些图表结构进行分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值