android 基础的一些笔记

按钮的点击方式:
 1:定义内部类
 2:定义匿名内部类btn.SetOnClickListener(new OnClickListener(){
  public void onClick(View v){}
 });
 3:让当前类实现OnClickListener接口,适用于按钮较多的布局
  btn.SetOnClickListener(this);
  在当前java文件中写一个onClick函数,switch判断是哪一个按钮写对应功能
 4:控件使用onClick属性
padding相对控件本身且向内
margin相对其他控件且向外
dp:安卓会自动根据值进行适应屏幕
sp:字体大小
android系统构成:
 1:Linux
 2:函数库层
 3:Application frameWork应用的框架层
 4:应用层(最上层)
dvm解决版权问题
打包流程:
 编译->class->dex文件->打包(aapt)生成apk->adb(调试桥)->device
Toast:在手机上显示提示信息。同样是一个View,不能在子线程直接使用          
 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。
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)
HttpURLConnection,用于通过web发送或接收数据,服务器以流的形式返回数据
 通过URL.openConnection()函数返回一个HttpURLConnection的实例
android.os.NetWorkOnMainThreadException.连接网络不能在主线程
主线程(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
Handler().postDelayed(new Runnable(){//相当于java中的定时器,延迟多少秒后执行指定任务
 
 public void run(){
  //写你要延时执行的操作//与java的定时器不同,Handler这里可以更新ui
  }
 
 },5000)//5秒后执行run方法
////////////////////
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();
  }
主题一般作用在activity上或清单文件application中
 样式:用于控件,作用范围小
 主题:用于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 空进程,不会维持任何组建运行,存在的目的是是进程下次执行更快,最先被杀死
service:服务,是没有界面的activity,
 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://
bmp:高质量保存图片于计算机
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是进行追加操作

 在 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.

Android数据持久化有五种方式:
 1、SharedPreferences
 2、内部存储(例如通过openFileOutput()打开一个文件输入输出流)
 3、SQLite Database
 4、网络连接(将数据存储到服务器上)
 5、外部存储(SD卡)
android动画:补间动画: alpha(透明度),translate(尺寸渐变)
     帧动画:   scale平移 , rotate旋转
     属性动画    ObjectAnimation ValueAnimation
根据SimpleAdapter的源码可以知道,使用SimpleAdapter作为适配器是,会按照如下顺序判断View:
 
 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

猜你喜欢

转载自blog.csdn.net/z282011862/article/details/80624143