安卓学习笔记(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heipingguowenkong/article/details/88115672

安卓学习笔记(1):

前段时间开发任务不多,就学习了一下安卓的开发技术。“不是庐山真面目,只缘身在此山中”,探索一下其他的领域不仅能够扩宽自己的见识,而且也有利于更好的理解自己的原始领域,真正的看清楚自己的位置;所以还是觉得应该多多学习。以下是一些基础的学习笔记:

1.post 和get 请求的区别:

  • 数据传输方式不同,get将数据拼接在url的末尾进行传输,post则将数据以流的方式放在请求体中;所以post相对来说比较安全。
  • post相对来说使用起来比较麻烦,请求时需要设置数据类型,数据长度。
  • get请求有数据长度限制,post则没有。

2.安卓中的编码格式:

  • tomcat容器默认码表是ISO-8899-1,如果tomcat从码表中未找到某个字符,则会使用本地的码表。一般为gbk或者gb2312;
  • 当出现菱形加问号的乱码时,一般是gbk/gb2312的字符以utf-8的形式显示了,或者反之。

3.Activity的生命周期:

  • 创建)onCreat —> (界面可见)onStart —> (界面获取到焦点)onResume —> (界面失去焦点)onPause —> (界面不可见)onStop —> (界面被销毁)onDistory;

4.界面横竖屏的切换生命周期:

  • 若不做特别的设置横竖屏切换时会有以下过程:
  • onStop —> onDistory —> onCreat —> (界面可见)onStart —> (界面获取到焦点)onResume;
  • 设置方法:android:screenOrientation = “portrait”| landspace;(设置横竖屏为固定模式);
    android:configerChanges = “keyboardHidden|screenSize|orientation”;(设置键盘不影响界面)

5.Activity的启动模式:

  • stander:标准模式(在同一任务栈中允许存在多份Activity,允许多次被开启)。
  • singleTop模式:单一栈顶模式(在同一个任务栈中,若某个Activity已经处于栈顶,那么不会再继续开启同一个Activity,会重用当前已存在的Activity)。
  • singeTask模式:如果某个Activity在栈中存在时,如再次点击开启,则会重用已存在的Activity对象,并且清除在他之上的的其他Activity。
  • singleInstance 整个手机系统中只有一个事例,并且在自己单独的任务栈中。

6.广播接收者事件(有序/无序):

  • 创建一个类继承自 BroadcastReceiver 重写 OnReceive方法,并在注册表中注册对应的广播即可;
  • 特点:即使广播接收者的进程不存在,在接收到广播消息的时候会自动激活接受者的进程。主要包括sd卡监听,短信监听(有序可拦截),程序包状态监听,电话监听(有序不可拦截)等。。。
  • 只能用代码注册的广播(在清单文件中配置无效,eg:解锁屏,电量变化等频率比较高的事件,只有代码在运行状态时才会生效).

8.servers 服务:

  • 服务是一个长期在后台运行没有界面的模块儿。该模块是运行在主线程中的,所以不能直接在服务中编写耗时的代码。severvies不会因为系统内存的原因被杀掉,即使临时被移除,待系统内存允许时会自动被恢复。
  • service 开启的两种方式及特点:
    a:bind开启的服务,当开启者释放时,也会被释放,并且在系统设置页面看不到服务的进程。该方式开启的服务可以通过代理的方式调用服务中的方法。
    b:start开启的服务:会长期在系统后台运行,服务不会伴随开启者的释放而释放,可以在系统设置页面看到服务的进程。无法调用服务内部的方法。
  • 混合的方式开启服务(用于保证服务可以长期在后台运行,并且可以调用服务内部的方法,但必须严格遵守以下的规则):
    a:start方式开启服务。
    b:bind方式调用服务内部方法。
    c:unbind方式解除绑定服务。
    d:stop的方式停止服务。

9.远程服务(不同应用/进程间的通信:ipc;安卓封装(aidl技术)),步骤:

  • 创建服务类(同本地服务);
  • 定义远程服务的接口文件:将本地接口的后缀名.java 改为.aidl。
  • 将原接口文件中的访问修饰符删除。
  • 原服务代理继承自Ibinder 和接口类,现直接继承自接口类的子类Stub。
  • 拷贝远程服务的aidl文件到要获取数据的本地工程中。包名要一致。
  • 在绑定类的connection内部类连接成功方法中使用接口类的子类stub.asinteface方法将Ibinder强转为接口类型。
  • 然后通过接口类调用服务的内部方法。

10.多媒体开发:

  • 在安卓中bitmap方式加载图片(默认32位的存储,rgba各占一个byte(8位),即每个像素点占32位的存储),图片分辨率越大所占的存储空间会越大。存储空间 = (分辨率图宽图高)/8;

  • 音乐播放器(mediaPlayer)播放流程:
    a: 本地资源同步准备:new player --> setData -<可设置状态监听errorListener>-> prepare --> start()<–> pause()–> stop();

    b: 线上资源异步准备:new player --> setData =<可设置状态监听errorListener>-> prepareAsync()–> setPrepareListener -<onPrepare回调中 start(), 在循环中实时监听playerStatus是否为playBack completion> --> pause() --> stop();

  • 音频文件应放在res资源文件夹下的raw文件夹中。

  • 短时间内重复播放的音频使用soundPool更合适。

13.视频处理:

  • 方式:
VideoView vv = new VideoView(this);
vv.setVideoPath("");//设置资源路径
MediaController vcontr = new MediaController(this);
vv.setMediaController(vcontr);//设置媒体控制器
vcontr.setAnchorView(vv);  //为控制器设置播放页面
vv.start();//播放

14.surfaceView (单位时间内可以实现界面的UI的多次更新(双缓冲机制)可以在子线程更新UI):

  • surfaceView对CPU和内存的占用和开销很大,只有在界面完全可见的时候才会被创建,当界面被最小化时就会被销毁。

15:传感器开发:

//传感管理器
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
//获取某种传感器,光线传感器
Sensor sen = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
//监听传感器的值变化:
sm.registerListener(new LightListener(), sen, SensorManager.SENSOR_DELAY_NORMAL);

16.frament使用教程:

  • 创建继承自Fragment的a类 —> 重写oncreateView的方法设置布局文件 --> activity中创建a对象 —> getSupportFragmentManager().beginTransaction()开启事物 —> replace要现显示的空间 —> commit事务;
  • eg:
FirstFragment fstfg = new FirstFragment();
//使用安卓原生的fragment(android.app.Fragment)使用以下方法获得manager(不建议,已停止更新,最低支持3.0系统)
// FragmentTransaction ft = fstfg.getFragmentManager().beginTransaction();

//activity中和fragment通信
 fstfg.getView().findViewById(R.id.bt_f_getdata);
 
//使用android.support.v4.app.FragmentManager 《最低支持安卓1.6系统》获取manager用以下方法
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_contener, fstfg);
ft.commit();
  • fragment和Activity通信: 在 activity中使用getActivity()方法可以获取到fragment所在的activity;

猜你喜欢

转载自blog.csdn.net/heipingguowenkong/article/details/88115672