android知识点收集

来源:互联网 发布:网络歌手大赛活动方案 编辑:程序博客网 时间:2024/06/07 06:20

Intent/Bundle 支持传递:

1) 基本类型的数据和基本类型的数组数据
2) String/CharSequence 类型的数据和 String/CharSequence 类型的数组数据
3) 传递 Parcelable (包裹化,邮包)和 Serializable (序列化)类型的数据,就是打包后的数据和序列化之后的数据,以及它们的数组/列表数据

Dalvik和Java运行环境的区别:1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。   2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。   3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex   4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。   5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。   6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制   7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
 这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。 

关于A和C选项
数字签名的两种模式

我们都知道Android系统不会安装运行任何一款未经数字签名的apk程序,无论是在模拟器上还是在实际的物理设备上。所以我们会有一个疑问,为何在日常开发过程中我没有进行任何签名的操作,程序都会在模拟器和真机上运行?下面我们来讲讲

APK程序的两种模式: 调试模式(debug mode)和发布模式(release mode)


1. 调试模式(debug mode)  :  在调试模式下, ADT会自动的使用debug密钥为应用程序签名,因此我们可以直接运行程序。

debug密钥:    一个名为debug.keystore的文件

存放位置 :      C:\Users\Xiaopeng\.android\debug.keystore        Xiaopeng对应替换为自己操作系统的用户名

两个风险:
      debug签名的应用程序有这样两个风险:

      1)debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名;

      2)debug.keystore在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能覆盖安装的问题。
          不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大问题了,就相当于软件不具备升级功能! 

所以一定要有自己的数字证书来签名;

2. 发布模式(release mode) :  当要发布程序时,开发者就需要使用自己的数字证书给apk包签名
使用自己的数字证书给APK签名的两种方法:

(1)通过DOS命令来对APK签名。

(2)使用ADT Export Wizard进行签名


andriod提供了 Handler  和  Looper  来满足线程间的通信。 Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换(MessageExchange) 。  
1)Looper:  一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue( 消息队列 ) 。  
2)Handler:  你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 从 Message Queue取出 ) 所送来的消息。  
3) Message Queue( 消息队列 ): 用来存放线程放入的消息。  
4) 线程: UIthread  通常就是 main thread ,而 Android 启动程序时会替它建立一个 MessageQueue 。 






编写Aidl文件时,需要注意下面几点:

  1.接口名和aidl文件名相同。

  2.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。

  3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口。

  4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。

  5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。

  6.Java原始类型默认的标记为in,不能为其它标记。



一句话:每一个DVM都是在Linux 中的一个进程! 选择D...

先来概念:
 我们来看看每个android进程如何产生的,
 下面来对Zygote进程孵化新进程的过程做进一步了解:
  1. Zygote进程调用fork()函数创建出Zygote' 子进程,
  2. 子进程Zygote' 共享父进程Zygote的代码区与连接信息。
    如下图所示,Fork()橙色箭头左边是Zygote进程,右边是创建出的Zygote‘子进程;然后Zygote’ 子进程将执行流程交给应用程序A,Android程序开始运行。
新生成的应用程序A会使用已有Zygote父进程的库与资源的连接信息,所以运行速度很快。

                   

       
   另外,对于上图,Zygote启动后,初始并运行DVM,而后将需要的类与资源加载到内存中。随后调用fork()创建出Zygote' 子进程,接着子进程动态加载并运行应用程序A。
   运行的应用程序A会使用Zygote已经初始化并启动运行的DVM代码,通过使用已加载至内存中的类与资源来加快运行速度。

   我们来看看Android进程模型

Linux通过调用start_kernel函数来启动内核,当内核启动模块启动完成后,将启动用户空间的第一个进程——Init进程,下图为Android系统的进程模型图:

从上图可以看出,Linux内核在启动过程中,创建一个名为Kthreadd的内核进程,PID=2,用于创建内核空间的其他进程;同时创建第一个用户空间Init进程,该进程PID = 1,用于启动一些本地进程,比如Zygote进程,而Zygote进程也是一个专门用于孵化Java进程的本地进程,上图清晰地描述了整个Android系统的进程模型


在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。超出就会提示应用程序无响应(ANR:Application Not Responding)对话框。

三种常见类型

1: KeyDispatchTimeout(5 seconds) -- 主要类型

按键或触摸事件在特定时间内无响应

2  BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3: ServiceTimeout(20 seconds) -- 小概率类型

Service在特定的时间内无法处理完成


使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:
  1. 继承Checkable接口
  2.  TextView
  3.  ImageView


Android使用 getWritableDatabase() 和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)

getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才以只读方式打开数据库.。

但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,

getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.



原创粉丝点击