按钮的点击方式:
1:定义内部类
2:定义匿名内部类btn.SetOnClickListener(new OnClickListener(){
public void onClick(View v){}
});
3:让当前类实现OnClickListener接口,适用于按钮较多的布局
btn.SetOnClickListener(this);
在当前java文件中写一个onClick函数,switch判断是哪一个按钮写对应功能
4:控件使用onClick属性
1:定义内部类
2:定义匿名内部类btn.SetOnClickListener(new OnClickListener(){
public void onClick(View v){}
});
3:让当前类实现OnClickListener接口,适用于按钮较多的布局
btn.SetOnClickListener(this);
在当前java文件中写一个onClick函数,switch判断是哪一个按钮写对应功能
4:控件使用onClick属性
padding相对控件本身且向内
margin相对其他控件且向外
margin相对其他控件且向外
dp:安卓会自动根据值进行适应屏幕
sp:字体大小
sp:字体大小
android系统构成:
1:Linux
2:函数库层
3:Application frameWork应用的框架层
4:应用层(最上层)
dvm解决版权问题
1:Linux
2:函数库层
3:Application frameWork应用的框架层
4:应用层(最上层)
dvm解决版权问题
打包流程:
编译->class->dex文件->打包(aapt)生成apk->adb(调试桥)->device
编译->class->dex文件->打包(aapt)生成apk->adb(调试桥)->device
Toast:在手机上显示提示信息。同样是一个View,不能在子线程直接使用
Toast.makeText(MainActivity.this//在哪个布局文件显示,"输入要显示的话",Toast.LENGTH_SHORT//或者Toast.LENGTH_LONG).show()//必须要有show();
context:上下文。存储了android中各种各样的数据,方法等,相当于一个仓库
Toast.makeText(MainActivity.this//在哪个布局文件显示,"输入要显示的话",Toast.LENGTH_SHORT//或者Toast.LENGTH_LONG).show()//必须要有show();
context:上下文。存储了android中各种各样的数据,方法等,相当于一个仓库
context.openFileOutPut("文件名",模式)。这个函数返回一个文件输出流
向sd卡存数据需要添加权限“写外部存储设备”
xml解析
1:获取xmlPullParser
xmlPullParser parser = Xml.newPullParser();
2.设置XmlPullParser参数
parser.setInput(in,"UTF-8");
3.获取解析的文档的事件类型
int type = parser.getEventType();
4.判断当前标签,进行详细实现。
数据库的创建:创建一个类继承SQLiteOpenHelper,onCreate函数用来初始化表,
数据库操作使用SQLiteDatabase类
ListView优化:复用 convertView,判断convertview是否为空,若为空则创建view对象,否则强制类型转换复用convertView。
1:获取xmlPullParser
xmlPullParser parser = Xml.newPullParser();
2.设置XmlPullParser参数
parser.setInput(in,"UTF-8");
3.获取解析的文档的事件类型
int type = parser.getEventType();
4.判断当前标签,进行详细实现。
数据库的创建:创建一个类继承SQLiteOpenHelper,onCreate函数用来初始化表,
数据库操作使用SQLiteDatabase类
ListView优化:复用 convertView,判断convertview是否为空,若为空则创建view对象,否则强制类型转换复用convertView。
listview中若使用自适应大小会造成系统多次校验,校验当前能否显示设置数量的条目,导致效率低下,因此一般都指定大小货值填充父窗体。
adapter就是用来把数据展示到listview上的
打气筒(inflate)的获取方法:
1.View.inflate(this,R.Layout.layout,root);
2.LayoutInflater.from(this).inflate(R.Layout.layout,root);
3.LayoutInflater inflater = (LayoutInflater)getSystemService(LATOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(R.layout.layout,root);
ArrayAdapter:
子布局是TextView为根节点时 ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.item,objects);
自布局不是根节点时 ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.item,R.id.tv_name,objects);其中R.id.tv_name是子布局中的textview的id
最后都要listview.setAdapter(adapter)
1.View.inflate(this,R.Layout.layout,root);
2.LayoutInflater.from(this).inflate(R.Layout.layout,root);
3.LayoutInflater inflater = (LayoutInflater)getSystemService(LATOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(R.layout.layout,root);
ArrayAdapter:
子布局是TextView为根节点时 ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.item,objects);
自布局不是根节点时 ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.item,R.id.tv_name,objects);其中R.id.tv_name是子布局中的textview的id
最后都要listview.setAdapter(adapter)
HttpURLConnection,用于通过web发送或接收数据,服务器以流的形式返回数据
通过URL.openConnection()函数返回一个HttpURLConnection的实例
通过URL.openConnection()函数返回一个HttpURLConnection的实例
android.os.NetWorkOnMainThreadException.连接网络不能在主线程
主线程(UI线程)中不能有耗时的操作。
将耗时的操作放到子线程中
只有主线程可以更新ui
handler:消息机制,发送与处理消息,想在子线程更新ui时使用
将耗时的操作放到子线程中
只有主线程可以更新ui
handler:消息机制,发送与处理消息,想在子线程更新ui时使用
Looper:在消息队列中取消息,looper伴随主线程出生。
handler的使用:
1.在主线程定义一个handler
private Handler handler = new Handler()
2.使用handler重写handleMessage方法
3.在子线程使用handler向主线程发送消息
handler.sendMessage(msg)
4.主线程执行handler的handleMessage方法
catch与filedir的区别
catch:放在缓存(catch文件夹)中,清除缓存就能删掉
filedir:放在data(file文件夹)中,用于长期保存
runOnUiTherad():可以在任何地方使用以改变ui,但只能改变ui,如果要想主线程发送消息,携带数据。就必须使用handler
1.在主线程定义一个handler
private Handler handler = new Handler()
2.使用handler重写handleMessage方法
3.在子线程使用handler向主线程发送消息
handler.sendMessage(msg)
4.主线程执行handler的handleMessage方法
catch与filedir的区别
catch:放在缓存(catch文件夹)中,清除缓存就能删掉
filedir:放在data(file文件夹)中,用于长期保存
runOnUiTherad():可以在任何地方使用以改变ui,但只能改变ui,如果要想主线程发送消息,携带数据。就必须使用handler
Handler().postDelayed(new Runnable(){//相当于java中的定时器,延迟多少秒后执行指定任务
public void run(){
public void run(){
//写你要延时执行的操作//与java的定时器不同,Handler这里可以更新ui
}
},5000)//5秒后执行run方法
}
},5000)//5秒后执行run方法
////////////////////
get与post区别:
get直接对url进行添加,不安全,但简单
post通过servlet访问路径,安全,要提交正文信息。
get与post区别:
get直接对url进行添加,不安全,但简单
post通过servlet访问路径,安全,要提交正文信息。
httpclient:一个封装了httpURLConnection的接口,
使用时要先实例化,
实例化时DefaultHttpClient client = new DefaultHttpClient()
然后设置获取数据方式:有HttpGet和HttpPost两个类,都可以通过new实例化
(如果是post,要多执行这些操作:
List<NameValuePair> list = new ArrayList<NameValuePair>();
BasicNameValuePair namevaluepair = new BasicNameValuePair("username","name");
BasicNameValuePair pwdvaluepair = new BasicNameValuePair("userpwd","pwd");
list.add(namevaluepair);
list.add(pwdvaluepair);
UrlEncodeFormEntity entity= new UrlEncodeFormEntity(list)
post.setEntity(entity);
)
执行get或者post请求,通过HttpResponse对象接受服务器响应 :HttpResponse response = client.execute(刚刚new的get或者post的实例)
获取服务器返回码:int code = response.getStatusLine().getStatusCode();
获取服务器数据,以流的形式返回:InputStream input = response.getEntity().getContent();
asynchttpclient:开源项目:
直接实例化,然后调用.post或.get方法
(如果是post:
RequestParams params = new RequestParams();
params.put(键值对);
)
client.post或者get(path,params,new AsyncHttpResponseHandler(){
这里有一个onSuccess和一个onFailure方法,
他们代表请求成功失败而不是登陆成功失败
});
多线程加速下载:
不是线程越多下载越快
下载速度还受服务器带宽影响
原理:更多的cpu资源用来执行一个任务
实现:
1:获取要下载文件大小
2:在客户端创建一个大小和服务器一样的文件(可省略)
3:计算每个线程下载的开始位置和结束位置
4:开多线程下载文件
5:要知道每个线程什么时候下载完毕
startActivity();单纯的开启activity
startActivityForResult();要从开启的activity获取返回的数据使用setresult()保存返回值.
通过broadcastreceiver开启一个activity是需要通过一个上新闻对象调用startactivity。并且!需要添加一个标记,一个任务栈的标记。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
在代码中动态注册receiver://一些频繁的操作无法在清单文件中定义
//注册一个屏幕开关的广播
ScreenReceiver screenReceiver = newScreenReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(screenReceiver,filter);
//当activity销毁时需要取消注册广播调用unregisterReceiver();
protected void onDestroy(){
unregisterReceiver(screenReceiver);
super.onDestroy();
}
//注册一个屏幕开关的广播
ScreenReceiver screenReceiver = newScreenReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(screenReceiver,filter);
//当activity销毁时需要取消注册广播调用unregisterReceiver();
protected void onDestroy(){
unregisterReceiver(screenReceiver);
super.onDestroy();
}
主题一般作用在activity上或清单文件application中
样式:用于控件,作用范围小
主题:用于activity作用范围大
样式:用于控件,作用范围小
主题:用于activity作用范围大
getapplicationcontext():返回一个context对象,相对this来说,是this的父类
activity.this 本身是一个context对象。
与进度相关的操作都可以在子线程更新ui比如各种进度条
进程的优先级:
1.Foreground process 前台进程,当前可交互的进程。(on resume)
2.Visible process 可视进程,不能交互但可见的进程。(on pause)
3.service process 服务进程,启动了服务的进程(on startservice)
4.background process后台进程,不可见的进程(on stop)还没有销毁
5.empty process 空进程,不会维持任何组建运行,存在的目的是是进程下次执行更快,最先被杀死
activity.this 本身是一个context对象。
与进度相关的操作都可以在子线程更新ui比如各种进度条
进程的优先级:
1.Foreground process 前台进程,当前可交互的进程。(on resume)
2.Visible process 可视进程,不能交互但可见的进程。(on pause)
3.service process 服务进程,启动了服务的进程(on startservice)
4.background process后台进程,不可见的进程(on stop)还没有销毁
5.empty process 空进程,不会维持任何组建运行,存在的目的是是进程下次执行更快,最先被杀死
service:服务,是没有界面的activity,
startService()方式开启服务,只会执行一次onCreate方法,之后在开启服务只会执行onstart方法
服务开启后会长期运行,不会自动关闭,必须手动停止服务调用stopService()
子进程与服务的区别,程序退出后,子进程程会变为空进程,容易被回收,服务进程不易被回收,可以长期存在
startService()方式开启服务,只会执行一次onCreate方法,之后在开启服务只会执行onstart方法
服务开启后会长期运行,不会自动关闭,必须手动停止服务调用stopService()
子进程与服务的区别,程序退出后,子进程程会变为空进程,容易被回收,服务进程不易被回收,可以长期存在
bindservice():service与activity同生共死,不会长期运行,而且可以在main方法中调用service中的方法,
亦可以写一个接口实现对某些方法的隐藏,是main方法只能调用一部分功能
当既需要服务长期运行有需要调用service中的方法,有一个固定流程:
1.调用startService开启服务,确保service可以长期运行
2.bindservice获取中间人对象
3.unbindService解绑服务
4.stopService关闭服务
aidl(android interface defination language)进行进程间的通信,本地服务与远程服务间互相通信
1.在第一个应用里。将接口类文件后缀改为aidl(aidl文件本身默认public,不需要定义public,也不能定义公有或私有)
修改完成后系统会在gen目录下生成一个对应的.java文件,里面会定义一个继承binder类的子类。
2.还是在第一个应用里。定义一个类继承系统自动生成的那个类作为service与activity间调用的中间类。
3.在第二个应用里创建一个包,包名与第一个应用中aidl文件所在包名相同,将aidl文件复制一份到新创建的包里
contentprovider:内容提供者,四大组件定义声明方法一样,内容提供者负责提供数据库内容
通过URIMatcher.addURI暴漏增删改查方法
内容解析者:contentresover,操作内容提供者提供的数据
自定义uri:使用时要在uri前加上协议头content://
亦可以写一个接口实现对某些方法的隐藏,是main方法只能调用一部分功能
当既需要服务长期运行有需要调用service中的方法,有一个固定流程:
1.调用startService开启服务,确保service可以长期运行
2.bindservice获取中间人对象
3.unbindService解绑服务
4.stopService关闭服务
aidl(android interface defination language)进行进程间的通信,本地服务与远程服务间互相通信
1.在第一个应用里。将接口类文件后缀改为aidl(aidl文件本身默认public,不需要定义public,也不能定义公有或私有)
修改完成后系统会在gen目录下生成一个对应的.java文件,里面会定义一个继承binder类的子类。
2.还是在第一个应用里。定义一个类继承系统自动生成的那个类作为service与activity间调用的中间类。
3.在第二个应用里创建一个包,包名与第一个应用中aidl文件所在包名相同,将aidl文件复制一份到新创建的包里
contentprovider:内容提供者,四大组件定义声明方法一样,内容提供者负责提供数据库内容
通过URIMatcher.addURI暴漏增删改查方法
内容解析者:contentresover,操作内容提供者提供的数据
自定义uri:使用时要在uri前加上协议头content://
bmp:高质量保存图片于计算机
jpg:良好质量保存与计算机与网络
png:高质量保存
jpg:良好质量保存与计算机与网络
png:高质量保存
图片大小计算公式:总像素(长*宽)*每个像素大小
单色:每个像素只能显示黑与白,只用1位2进制数就能表示颜色每个像素站1/8byte
16色:每个像素最多表示16个颜色,使用4位2进制数表示,每个像素占1/2byte
256色:每个像素最多表示256个颜色,使用8位2进制数表示,每个像素占1byte
24位:用24位显示一个像素(每个像素可以表示一千六百多万种颜色),一个像素3byte(rgb各占1byte)
画布:画布上的操作如果要进行多步操作,后面的操作要使用post而不用set,set会进行覆盖操作,而post是进行追加操作
单色:每个像素只能显示黑与白,只用1位2进制数就能表示颜色每个像素站1/8byte
16色:每个像素最多表示16个颜色,使用4位2进制数表示,每个像素占1/2byte
256色:每个像素最多表示256个颜色,使用8位2进制数表示,每个像素占1byte
24位:用24位显示一个像素(每个像素可以表示一千六百多万种颜色),一个像素3byte(rgb各占1byte)
画布:画布上的操作如果要进行多步操作,后面的操作要使用post而不用set,set会进行覆盖操作,而post是进行追加操作
在 Android 中, 1pt 大概等于 2.22sp以上供参考,
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中,
当屏幕density=240时使用hdpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.
Android数据持久化有五种方式:
1、SharedPreferences
2、内部存储(例如通过openFileOutput()打开一个文件输入输出流)
3、SQLite Database
4、网络连接(将数据存储到服务器上)
5、外部存储(SD卡)
android动画:补间动画: alpha(透明度),translate(尺寸渐变)
帧动画: scale平移 , rotate旋转
属性动画 ObjectAnimation ValueAnimation
帧动画: scale平移 , rotate旋转
属性动画 ObjectAnimation ValueAnimation
根据SimpleAdapter的源码可以知道,使用SimpleAdapter作为适配器是,会按照如下顺序判断View:
1、该view是否实现checkable接口
2、该view是否是TextView
3、该view是否是ImageView
如果以上三种类型都不是,就会抛出IllegalStateExeception
1、该view是否实现checkable接口
2、该view是否是TextView
3、该view是否是ImageView
如果以上三种类型都不是,就会抛出IllegalStateExeception
FC(Force close)
原因:
1.Error
OOM(out of memory error)
StackOverFlowError
2.RuntimeException
ANR
原因:
1.activity - 5s
2.broadcastreceiver - 10s
3.service - 20s
原因:
1.Error
OOM(out of memory error)
StackOverFlowError
2.RuntimeException
ANR
原因:
1.activity - 5s
2.broadcastreceiver - 10s
3.service - 20s