文档章节

Android复习强化笔记(一)

FlyinTang
 FlyinTang
发布于 2016/09/27 10:05
字数 2297
阅读 37
收藏 2

一:活动的启动模式:Standad、SingleTop、SingleTask和SingleInstance

Standard:活动默认启动模式,在不进行显式指定情况下,所有活动都会自动使用这种启动模式。每当启动一个新的活动时,它就会在返回栈中入栈,并位于栈顶位置。对于使用Standard启动模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

SingleTop:当活动启动模式为SingleTop时,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

SingleTask:当活动的启动模式为SingleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有方向就会创建一个新的活动实例。

SingleInstance:在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都会共同的同一个返回栈,也就解决了共享活动实例的问题。

 

 

二:ANR产生原因及其解决方法

ANR:Application not responding(应用程序无响应)

参照:http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

解决办法:针对ANR的产生原因制定解决办法:a、在5s内没有响应输入事件    b、BroadCastReceiver在10s内没有执行完毕

1:运行在主线程的任何方法尽可能少做事情。可以开启一个子线程。

2:避免BroadCastReceiver中做耗时的操作或计算。可以在广播接收者中启动一个Server

3:避免在IntentReceiver中启动一个Activity。如果应用程序在Intent广播中需要向用户展示什么,则应该使用NotificationManager来实现。

 

 

三:Intent可以传递哪些数据类型

String、基本数据类型、Bundle、Serializable、parcelable

对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParceldescribeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Serializable进行数据持久化

http://www.android100.org/html/201509/05/179247.html

public class MyParcelable implements Parcelable {  
     private int mData;  
     private String mStr;  
  
     public int describeContents() {  
         return 0;  
     }  
  
     // 写数据进行保存  writeToParcel
     public void writeToParcel(Parcel out, int flags) {  
         out.writeInt(mData);  
         out.writeString(mStr);  
     }  
  
     // 用来创建自定义的Parcelable的对象  
     public static final Parcelable.Creator<MyParcelable> CREATOR  
             = new Parcelable.Creator<MyParcelable>() {  
         public MyParcelable createFromParcel(Parcel in) {  
             return new MyParcelable(in);  
         }  
  
         public MyParcelable[] newArray(int size) {  
             return new MyParcelable[size];  
         }  
     };  
       
     // 读数据进行恢复  
     private MyParcelable(Parcel in) {  
         mData = in.readInt();  
         mStr = in.readString();  
     }  
 }  

 

 

四:Bitmap OOM解决分析

http://blog.sina.com.cn/s/blog_6a528c550101chhh.html

1:用recycle()方法及时回收Bitmap内存。

加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存。从Bitmap类的源代码也可以看到,recycle()方法里也的确是调用了JNI方法了的。

if(bitmap != null && !bitmap.isRecycled()){
  // 回收并且置为null
  bitmap.recycle();
  bitmap = null;
  }
  System.gc();

2:捕获异常

因为Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。通常,在实例化Bitmap的代码中,一定要对OutOfMemoryError进行捕获。

Bitmap bitmap = null;
  try {
  // 实例化Bitmap
  bitmap = BitmapFactory.decodeFile(path);
  } catch (OutOfMemoryError e) {
  //
  }
  if (bitmap == null) {
  // 如果实例化失败 返回默认的Bitmap对象
  return defaultBitmapMap;
  }

 很多开发者会习惯性的在代码中直接捕获Exception。但是对于OutOfMemoryError来说,这样做是捕获不到的。因为OutOfMemoryError是一种Error,而不是Exception。在此仅仅做一下提醒,避免写错代码而捕获不到OutOfMemoryError。

3:缓存通用的Bitmap对象

 有时候,可能需要在一个Activity里多次用到同一张图片。比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。 如果有类似上面的场景,就可以对同一Bitmap进行缓存。如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费。

4:压缩图片

如果图片像素过大,使用BitmapFactory类的方法实例化Bitmap的过程中,需要大于8M的内存空间,就必定会发生OutOfMemory异常。这个时候该如何处理呢?如果有这种情况,则可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。

 

 

五:Serivice启动方法、生命周期等

http://liangruijun.blog.51cto.com/3061169/647804/

1:Context.StartService()方法启动

启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()

Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

2:Context.BindService()方法启动

绑定时,bindService -> onCreate() –> onBind()

调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()

用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

 

 

六:线程Wait()和Sleep()方法的区别

sleep指线程被调用时,占着CPU不工作,简称“占着茅坑不拉shi”。此时CPU部分的资源被占用,其他线程无法进入,会增加时间限制。

wait指线程处于等待状态,形象的说明是“等待使用cpu”,此时该线程不占用cpu资源,不增加时间限制。wait导致当前的线程等待,直到其他线程调用此对象的notify方法或者notifyAll方法。

yield:线程的让步通过Thread.yield()方法实现。yield()方法的作用是暂停当前正在执行的线程对象,并执行其他线程。yield()应该做的是让当前线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此yield()的目的是让相同优先级的线程之间能适当的轮转执行。

join:保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。

notify:唤醒在此对象监听器上等待的某个线程

notifyAll:唤醒在此对象监听器上等待的所有线程

详情:http://www.cnblogs.com/riskyer/p/3263032.html

 

七:Message、MessageQueue、Handler和Looper在异步消息处理机制中的联系

首先需要在主线程当中创建一个Handler对象,并重写handleMesage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息就会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理的消息,最后分发回Handler的HandleMessage()方法中。由于Handler是在主线程中创建的,所以此时的HandleMessage()方法中的代码也会在主线程中运行。

 

© 著作权归作者所有

FlyinTang
粉丝 6
博文 7
码字总数 11123
作品 0
杭州
程序员
私信 提问
Android adt bundle 开发环境配置及第一个“Hello world”程序运行

最近在学习Android 顺便记录下学习过程当作复习吧,这是写的第一篇正式博客。 一、jdk环境配置 二、android adt bundle 下载 三、安装SDK 四、模拟器及真机调试 五、第一个程序 Hello world!...

程序猿付显
2014/07/23
20K
0
Android 面试必备 - 知识图谱

前言 时间飞逝,转眼间毕业两年多,从事 Android 开发三年了。我在想,也是时候将自己的 Android 整理成一套体系。 这一次的知识体系图谱只涉及到 Android 基础知识部分和设计模式的, Andr...

stormjun94
08/18
0
0
Android 第一课——Android架构

声明:本文是学习Android时从《Android 4编程入门经典》摘抄!仅仅是作为复习时查看的笔记! 1 Android是一个linux系统 Android 是一个基于 Linux 的开源的手机操作系统。它可以供任何打算使...

learn_more
2014/12/28
807
0
Android端Chrome强化Data Saver模式 HTTPS页面也纳入支持

通过强化Data Saver模式,Android端Chrome声称可以将数据使用量缩减高达90%,即使在慢速网络中也可以缩短网页的加载时间。不过此前该功能仅限于HTTP网站,而自今日开始同样也适用于HTTPS网站...

稿源:
03/13
0
0
Android学习笔记(十二):Activity-Spinner

例子一:Spinner的基本实现方法 步骤一:编写Android XML文件 步骤二:源代码 1)设置Spinner之中的元素内容,采用了ArrayAdapter来描述,并通过setApdater()来设置adapter private String[...

鉴客
2011/12/01
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 脚本引擎入门

Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换...

阿提说说
40分钟前
4
0
05.深入浅出索引(下)

在下面这个表T中,如果我们执行select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? mysql> create table T ( id int primary key, k int not null default...

scgaopan
昨天
6
0
设计模式-中介者模式

设计模式-中介者模式 定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互 UML 组成部分主要包含 Mediat...

木本本
昨天
5
0
Python 周刊第 418 期

新闻 PyCon US 2020 开始接受财务赞助! https://pycon.blogspot.com/2019/10/financial-aid-launches-for-pycon-us-2020.html2020年 Python 美国开发者大会,tips: 中国也有,可以赞助国内的...

iCodeBugs
昨天
5
0
ThreadLocal源码阅读

首先,从set方法入手, // ThreadLocalpublic void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);//这里可以看出,从Threa......

小海bug
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部