Android学习(三)

短信发送器
SmsManger sm=SmsManager.getDefault();
sm.sendTextMessage(phone,null,content,null,null);
线性布局的注意点
orientation:vertical时,左对齐,右对齐,水平居中生效layout_gravity="";
在设weight属性时,width应设为0dp
weight是分配剩余空间的权重。
相对布局
对齐:align_
帧布局:
默认位置都是左上角,控件可以重叠。
对齐:layout_gravity="right|bottom"
可以上下左右对齐和居中
设置方式与线性布局类似
表格布局:
可以不写宽高,默认宽高为wrap_content
strechColumn="1"拉伸第一列,填满整个剩余空间
gravity可以调整位置
调整列号:layout_cloumn="1";
layout_span="2";当前列占用两列

Android的存储
内部存储空间
RAM:运行内存
ROM:存储内存
外部存储:
SD卡:相当于电脑的移动硬盘

内部存储文件目录
getFilesDir() 属于context类的方法
getCacheDir() 返回值也是File对象(缓存)
openFileInput
openFileOutput

外部存储
向SD中写数据需要权限
Enviroment类提供外部存储的路径
Enviroment.getExtenalStorageDirectory;
Environment.MEDIA_MOUNTED(SD卡可用并已挂载)
查看SD卡空间(statFs类和Formatter类)
所有存储设备都会被划分为若干存储块,每个块大小都有自己的大小
存储设备的大小=大小*个数;
windows块的大小默认为4k;
File path=Environment.getExternalStorageDirectory();
StatFs stat=new StatFs(path.getPath());
long blockSize=stat.getBlockSizeLong();
long totalBlocks=stat.getBlockCountLong();//要求最低版本18
long availableBlocks=stat.getAvailableBlocksLong();
foamatSize(availableBlocks*blockSize);


private String foamatSize(long l) {
// TODO Auto-generated method stub
return Formatter.formatFileSize(this, l);
}

文件的访问权限
指的是谁能访问这个文件
在Android中,每个应用,都是一个独立的用户
使用10个字母表示
drwxrwxrwx x:exective
第一个字母
表示文件夹
-表示文件
第一组rwx:表示文件拥有者对文件的权限
第二组rwx:表示的是跟文件拥有者属于同一用户组对文件的权限
第三组rwx:表示的是其他用户对文件的权限
MODE_PRIVATE
MODE_WORLD_READABLE:全局可读

使用xml序列化器生成xml文件
得到xml序列化器对象
XmlSerializer xs = Xml.newSerializer();
XmlSerializer类
常用方法:
startDocument(String encoding, Boolean standalone)
设置文档开始节点的属性
参数encoding:编码格式
参数standalone:是否独立有无约束
setOutput(OutputStream os,String encoding)
设置输出流和编码格式
startTag(String nameSpace,String name)
开始标签
参数nameSpace:命名空间
参数name:标签名称
text(String text)
text:设置文本节点的内容
nextText()
获取当前节点的下一个节点的文本
next()
到达下一个节点

获得当前版本的等级
Build.VERSION.SDK_INT

测试:
黑盒测试:测试逻辑业务
白盒测试:测试逻辑方法
方法测试:function test
单元测试:unit test
集成测试:integration test
系统测试:system test

单元测试:
Junit
在清单文件中指定指令集(和Application同一级别节点)
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="liuke.testjunit"></instrumentation>

在清单文件中指定类库(和Activity同一级别节点)
<uses-library android:name="android.test.runner"/>

SQLiteDataBase类
beginTransaction
作用:开启事务
void setTransactionSuccessful()
作用:设置事务执行成功
void endTransaction()
作用:关闭事务


ContentValues类
void clear()
清空所有的数据


ViewGroup类extents View implements ViewManager ViewParent
addView();
已知子类
AbsoluteLayout, AdapterView<T extends Adapter>, DrawerLayout, FragmentBreadCrumbs, FrameLayout,

GridLayout, LinearLayout, PagerTitleStrip, RelativeLayout, SlidingDrawer, SlidingPaneLayout,

可以向ViewGroup类中添加子View
View不能有子节点

获取布局填充器对象
法1:LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
法2:LayoutInflater inflater=getSystemService(LAYOUT_INFLATER_SERVICEE);
法3:layouInflater inflater=getlayoutInflater();
getSystemService()得到需要的管理器

单选对话框
setSingleChoiceItems();
dismiss()对话框消失
多选对话框
setMultiChoiceItems()

Android中的网络编程
URLConnection类
setConnectTimeOut();
设置连接超时
setReadTimeOut()
设置读取超时
connect()
作用:连接到指定的URL
InputStream getInputStream
作用:获取服务器响应头中的流,流里的数据就是客户端请求的数据
void setDoInput(Boolean newValue)
作用:设置打开输入流
void setDoOutput()
作用:设置打开输出流
OutputStream getOutputStream();
作用:得到输出流

HttpURLConnection
setRequestMethod();
设置请求方式
请求方式有
GET POST HEAD OPTIONS PUT DELETE TRACE
getRequestMethod()
得到请求方式
getResponseCode()
先建立连接再得到响应码
常见的有200(请求成功)
404(请求错误)
500(服务器内部错误)

URL类
常见构造方法:
URL(String spec)
URL(String protocol,String host,int port,String file)
常用方法:
InputStream openStream();
作用:打开连接并返回从连接处得到的输入流
URLConnection openConnection()
作用:打开连接

网络请求
主线程阻塞:
UI停止刷新,无法响应用户操作;
耗时操作不应该在主线程进行

Hanlder消息队列机制
主线程一旦被创建,系统就自动为其创建message Queue和looper(消息轮询器)
轮询器的作用,就是不停的检测消息队列中是否有消息
消息队列一旦有消息,轮询器会把对象传给消息处理器(Handler),处理器会调用HandleMessage方法来处理这

条消息,handleMessage方法就会被调用。

缓存
view的setTag()方法既可以作为标签,又可以携带数据
convertView中有ViewHolder对象

提交的数据需要经过Uri编码,英文和数字编码后不变
URLencode(name)//编码
URLencode(String s,String charsetName)

向服务端提交数据
get方式
String path="http://10.0.2.2:8080/LoginServlet/Login?"+"name="+name+"&pass="+pass;

post方式
与get方式基本类似,添加post请求的两行属性
String text="name="+name+"&pass="+pass;
conn.setRequestProperty("Content-Type","");
conn.setRequestProperty("Content-Length","");
post方式需要用输出流向网络输出数据,不象get方式可以在URL中直接添加参数
conn.DoOutput(true);
OutputStream os=conn.getOutputStream();
os.write("要发送的内容");//请求正文

HttpClient是appache提供的框架,Google将其封装在自己的androidjar包中,我们可以直接使用该API,比以上方

式简单。
HttpClient是一个接口,它的间接子类有AbstractHttpClient,AndroidHttpClient,DefaultHttpClient,我们

常用DefaultHttpClient类来实现向服务端提交数据
DefaultHttpClient类
构造器
DefaultHttpClient(HttpParams params);
DefaultHttpClient();
常用方法:
final HttpResponse execute(HttpUriRequest request)//继承自AbstractHttpClient
执行请求


HttpGet类(继承自HttpGetBase)
构造器
HttpGet();
HttpGet(URI uri);
HttpGet(String uri);
常用方法
String getMethod()
作用:得到请求方式( GET, PUT, POST等)


使用HttpClient框架做get方式提交
//创建HttpClient对象
HttpClient hc=new DefaultHttpClient();
//创建HttpGet对象
HttpGet hg=new HttpGet();
//使用客户端对象,把get请求对象发送
hc.ececute(hg);

HttpUriRequest(接口)实现了HttpRequest
它的间接子类
HttpGet,HttpHead,HttpPost,HttpPut,HttpRequestBase

HttpResponse
abstract HttpEntity getEntity();
作用:获得响应头的消息实体
abstract StatusLine getStatusLine()
作用:得到响应的状态行
void setStatusCode(int code)
作用:设置状态码
void setStatusLine(StatusLine statusLine)
作用:设置状态行

StatusLine类的常用方法:
int getStatusCode()
作用:得到状态码
String getProtocolVersion()
作用:得到请求协议(http/1.1)

HttpEntity
常用方法:
InputStream getContent()
作用:得到实体的内容

Post方式
1.创建客户端对象

多线程下载和断点续传(快速)
单线程下载:
从输入流里第0个字节开始读取,读到最后一个字节,把读到的数据写到本地文件中,写的时候也是从文件的第0

个位置开始写,写到最后一个位置。
多线程下载:
一共10个字节,一共开了3个线程,每个线程的下载数size=10/3;剩余的字节交给最后一个线程来处理。
向本地写的时候也应该按照下载的位置写到本地。

0线程:0-2
1线程:3-5
2线程:6-9
开始位置:线程ID*size;
结束位置:(线程ID+1)*size-1;
最后一个线程的结束位置:length-1;

RandomAccessFile类在多线程下载中使用
//设置本次http请求的区间
conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);
请求部分数据,响应码是206
//把文件的写入位置移动至startIndex
raf.seek(startIndex);


断点续传(记录上次的下载位置)
newStartIndex=startIndex+total(上次下载的量)
在断点续传时,我们生成一个专门用来记录下载进度的临时文件

显式意图的效率比隐式意图的效率高
但是隐式意图可以跨应用使用。

任务栈:task stack
singleInstance:一个任务栈中只有一个Activity在启动另外一个Activity时,会创建另外一个任务栈。

横竖屏切换时Activity的生命周期(Activity会被销毁)
pause-->stop-->destroy
create-->start-->resume
//系统不会触发Activity生命周期方法需要在清单文件中配置(activity中)
android:configChanges="orientation|keyboardHidden|screenSize"
写死横竖屏切换
android:screenOrientation=“landscape”锁定横屏
android:screenOrientation=“portrait”锁定竖屏
也可在代码中锁定
setRequestOrientation(ActivityInfo.portrait);

返回Activity时传递数据
BroadcastReceiver是四大组件(不是Broadcast)之一。
在Intent-filter的节点中,指定action子节点,action的值必须跟要接收的广播中的action匹配,比如,如果要

接收打电话的广播,那么Action的值必须指定为
android.intent.action.NEW_OUTGOING_CALL
因为打电话广播半酣的action,就是android.intent.action.NEW_OUTGOING_CALL,所以我们定义广播接收者时,

action必须与其匹配。

短信发送的是一个有序广播
接收短信是接收广播的行为

4.0之后,广播接收者所在的进程如果从来没有启动过,那么广播接收者不会生效。

即使广播接收者所在进程已经被关闭(系统自动关闭),当系统发出的广播的action跟该广播接收者的action匹

配时,系统会启动该广播所在的进程,并把广播发给广播接收者。
但是如果用户强制关闭进程,只有下次用户手动开启广播时,才能生效。

SmsMessage类
常用方法:
static SmsMessage createFromPdu(byte[]pdu)
作用:利用pdud(协议数据单元),创建一个Message对象,
byte[] getPdu()
作用:从短信中得到Pdu的字节数组
String getOriginatingAddress()
作用:返回要发送短信的号码(sender)
String getMessageBody()
作用:得到短信内容

final class SMSManager类(不可被继承)
final ArrayList<String> divideMessage(String text)
作用:将一个短信分割成几部分。(短信的最大长度为70字节)
static SMSManager getDefault()
作用:得到SmsManager的默认实例
void sendDataMessage(String destinationAddress,String

scAddress,ArrayList<String>parts,ArrayList<PendingIntent>sendIntent,PendingIntent deliveryIntent)
作用:基于短信向特定应用端口发送数据
void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent

sentIntent, PendingIntent deliveryIntent)
作用:基于短信发送文本

监听SD卡状态
<receiver android:name="liuke.sdstaus.MyReceiver">
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<action android:name="android.intent.action.MEDIA_REMOVED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>

监控应用状态
<receiver android:name="liuke.appstate.MyReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
电话的状态
空闲状态
响铃状态
摘机状态
TelephonyManager通过getSystemService获得;
PhoneStateListener类
void onCallStateChanged(int state, String incomingNumber)
作用:监听状态的改变
void onSignalStrengthsChanged(SignalStrength signalStrength)
作用:监听信号强度的改变
PhoneStateListener中有很多常量,用来监听电话的状态,常用在TelephonyManager.listen(Listener,events)

中;
常用广播:http://blog.csdn.net/jaycee110905/article/details/8596519
清单文件注册:
广播一旦发出,系统就会去所有的清单文件中寻找,哪个广播接收者的action和广播的action是匹配的,如果找

到了,舅妈该广播接收者的进程启动起来。
代码注册:
安卓中有一些广播接收者,必须使用代码注册,清单文件注册时无效的
1.屏幕锁屏和解锁
2.电量改变


服务的开启方式有两种
startService
bindService

开始服务——》绑定服务——》解除绑定——》停止服务
UNBound
create——》start——》destroy
bound
create——》onBind——》onUnbind——》onDestroy
服务的分类:
本地服务:指的是服务和启动服务的Activity在同一个进程中
远程服务:指的是服务和启动服务的Activity不在同一个进程中(隐式启动)

AIDL:
android interface definition language
进行进程间的通信
使用步骤:
1.把远程服务的方法抽取成一个单独的接口Java文件
2.把接口Java文件的后缀名改成aidl
3.自动生成的.Java文件中,有一个静态抽象类Stub,它已经继承了binder类,实现了抽取的接口
4.把aidl文件复制粘贴到另一个项目,包名必须与本项目的aidl所在的包名一致。
5.在另一个项目中,强转中间人对象时,Stub.asInnterface();

样式和主题(样式用在组件上)
<style name="Style">
<item name="属性">属性值</item>
</style>
<style name="liuke1" parent="Style">//继承Style
<item name="属性">属性值</item>
</style>
<style name="Style.liuke2">//继承Style
<item name="属性">属性值</item>
</style>

<style name="myTheme"></style>
主题与样式的定义是一样的,一般是从名字上区分的。


多媒体编程
文本、图片、音频、视频
图片在计算机中的大小
图片的大小=图片的总像素*每个像素占用的大小
单色位图:只能表示两种颜色,只用两个数字,只用一个长度为1的二进制数字就可以表示了,每个像素占用1/8

个字节
16色位图:能表示16钟颜色
需要16个数字:0-15,0000-1111,每个像素占用1/2字节(1字节=8位)
256色位图:能表示256中颜色00000000-11111111,每个像素占用一个字节
24位位图:每个像素占3个字节(24位)
R:0-255,需要一个长度为8的二进制数,占用1个字节
G:0-255,需要一个长度为8的二进制数,占用1个字节
B:0-255,需要一个长度为8的二进制数,占用1个字节

加载大图片
计算机把图片所有信息全部解析出来,并保存在内存中。
Android保存保存图片像素信息,使用ARGB保存的,每个像素会占用四个字节
例:手机屏幕320*480,总像素:153600
图片宽高2400*3200,总像素:7680000
2400/320=7;3200/480=6

//得到屏幕宽高
int dp=getWindowManager().getDefaultDisplay();
int screenWidth=dp.getWidth();
int screenHeight=dp.getHeight();

BitmapFactory.Options
Option opt=new Option(); 解析图片时所需要的对象都封装在这个对象中

示例代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(path, options);
这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了。
有了宽,高的信息,我们怎样在图片不变形的情况下获取到图片指定大小的缩略图呢?
比如我们需要在图片不变形的前提下得到宽度为200的缩略图。
那么我们需要先计算一下缩放之后,图片的高度是多少
int height = options.outHeight * 200 / options.outWidth;
options.outWidth = 200;
options.outHeight = height;
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(path, options);
image.setImageBitmap(bmp);
这样虽然我们可以得到我们期望大小的ImageView
但是在执行BitmapFactory.decodeFile(path, options);时,并没有节约内存。要想节约内存,还需要用到

BitmapFactory.Options这个类里的 inSampleSize 这个成员变量。
我们可以根据图片实际的宽高和我们期望的宽高来计算得到这个值。
inSampleSize = options.outWidth / 200;
另外,为了节约内存我们还可以使用下面的几个字段:
options.inPreferredConfig = Bitmap.Config.ARGB_4444; // 默认是Bitmap.Config.ARGB_8888
options.inPurgeable = true;
options.inInputShareable = true;

//创建图片副本
Bitmap bmSrc=BitmapFactory.decodeFile("sdcard/photo.jpg");
Bitmap bmCopy=Bitmap.createBitmap(bmSr.getWidth(),bmSrc.getHeight(),bmSrc.getConfig);
Paint paint=new Paint();
Canvas canvas=new Canvas(bmCopy);
canvas.drawBitmap(bmSrc,new Martrix(),paint);
iv1.setImageBitmap(bmCopy);
iv2.setImageBitmap(bmSrc);

镜面效果:
Martrix m=new Martrix();
m.setScale(-1,1);

onTouchListener()触摸监听事件
方法:onTouch(View v,MotionEvent event)
说明:v是触摸的view对象
event是触摸方式
onTouch()方法的返回值如果为true,该触摸事件不交给其他组件处理。如果为false,会把该触摸事件交给他的

父控件。

MotionEvent中的常量
ACTION_CANCEL :The current gesture has been aborted.
ACTION_DOWN:A pressed gesture has started, the motion contains the initial starting location.
ACTION_MOVE:A change has happened during a press gesture
ACTION_UP:A pressed gesture has finished, the motion contains the final release location as well

as any intermediate points since the last down or move event.
方法:
final int getAction()
说明:返回当前执行的动作。
final float getX()
说明:拿到X轴坐标
final float getY()
说明:拿到Y轴坐标
保存图片
SD每次准备的时候,系统其实是遍历SD卡的所有文件,系统会把所有的多媒体文件,都在MediaStore数据库中生

成一个索引,数据库保存了文件的文件名、路径、大小、长度等信息
图库、音乐、视频程序每次启动时,其实不会去遍历SD卡寻找多媒体文件,而是直接从MediaStore数据库中读取

多媒体文件,通过库中的索引找到对应的多媒体文件后,把文件显示在界面

SurfaceView(常用于视频播放和游戏开发)
双缓冲技术
SurfaceView占用资源多,不可见时,就不会创建,可见时,才会创建。他需要加载一段时间
创建后,只要不可见,就会被销毁

SurfaceView+MediaPlayer用来播放视频
VideoView+MediaPlayer也是用来播放视频的组件
拍照(需要相关权限)
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION.IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File

(Enviroment.getExtenalStorage,"haha.jpg")));
startActivityForResult(intent,100);

ContentProvider四大组件之一
内容提供者的作用:把数据暴露给其他应用,通常是把私有数据库暴露给其他用户
Uri匹配器对象
UriMatcher um=new UriMatcher(UriMatcher.NO_MATCH);
um.addURI("com.liuke.person","employee",1);content://com.liuke.person/emplyee
um.addURI("com.liuke.person","student",2);content://com.liuke.person/student
um.match(uri)==1 //携带的Uri为content://com.liuke.person/emplyee
content://com.liuke.person为主机域名
我们常在清单文件中的provider中进行声明,android:authorities="liuke.person" 另外我们须将android:

exported="true"设置为true
um.addURI("com.liuke.person","employee/#",3);#可以为任意数字,*可以为任意字符串

ContentUrisUri内容的工具类
static Uri.Builder appendId(Uri.Builder builder, long id)
说明:在路径的尾部加上给定的ID
static long parseId(Uri contentUri)
说明:将路径的最后一部分转化成一个long类型的数字
static Uri withAppendedId(Uri contentUri, long id)
说明:在路径的尾部加上给定的ID

查询联系人
raw_contacts表
*contact_id:联系人id
data表:存放联系人的详细信息,每行数据是单独的一条联系人的信息
data1:联系人的具体的信息
raw_contact_id:该行信息属于哪个联系人
mimetyoe_id:该行信息属于什么类型
mimetypes表:mimetype_id对应的类型的字符串
帧动画frameAnimation
多张图片快速切换,形成动画效果
帧动画使用xml定义
补间动画只是绘制上的效果改变,实际的位置不发生改变

属性动画是真正的移动
ObjectAnimator oa=new ObjectAnimator.offloat();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值