Android开发——Android开发入门

来源:互联网 发布:笛子模仿软件 编辑:程序博客网 时间:2024/05/30 23:40

历史知识

1.移动相关历史知识

3G开发:G指的是Generation,代的意思

1G:摩托罗拉,1995年开发了第一部手机,采用的这种制式,只能支持语音通话,大哥大

2G:(1)GSM        (2)CDMA:军用转为了民用,可以接受数据,只有9kb/s。最早联通所有,现在是电信的

2.5G:EGGE,2G-->3G的过渡版本,2.5G理论速度为172kb/s,实际为10-30kb/s左右

3G:(1)WCDMA,中国联通的标准(世界大部分3G的标准)

        (2)CDM2000,中国电信的标准(日、韩、北美的标准)

        (3)TD-SCDMA,中国移动的标准(中国自主研发)

4G:LTE,合并技术,所以叫4G并不准确,理论为300M带宽

成长路径:GSM(9k)==>GPRS(42k)==>EGGE(172k)==>WCDMA(364k)==>HSDPA(7.2m)==>TDD-LTE(300m)

搞笑系统:(1)联想(乐phone==>乐OS)  (2)阿里云手机==>863,核高基项目    (2)移动(Ophone)

移动物联网:因为Android是开源的关系,任何设备皆可使用此系统,如Android微波炉、电视。所以Android成为了物联网的首选系统

家庭网关:防止其他人入侵你家庭电子设备的系统

三网融合:指的是有线电视网、互联网和通信网络的融合

WAP:(wait  and  pay)巨大的局域网,必须通过移动或者联通的网关才能获取到具体数据的,不是互联网(UC浏览器靠它发家的)

WML:(WireLess  Marpup   Language)精简版的Html语言

移动互联网:就是3G网,等同于PC的Internet网

2.Android相关历史知识

Android进化史(没有开源就没有今天的安卓,开源项目的组拼)

(1)1.5 Cupcake(纸杯蛋糕,API 3)

(2)1.6 Donut(甜甜圈,API 4)

(3)2.1 Eclair(闪电泡芙,API 7)

(4)2.2 Froyo(冰酸奶,API 8)

(5)2.3 Gingerbread(姜饼,API 10)

(6)3.0 Honeycomb(蜂巢,API 11)

(7)4.0 Ice cream Sandwich(冰激凌三明治,API 14)

(8)4.1--4.3 Jelly Bean(果冻豆,API 16-18)

(9)4.4 KitKat(奇巧巧克力,API 19)

(10)5.0 Lollipop(棒棒糖)

Android基础知识

1.体系架构


(1)Appication:系统内置应用

(2)Application Frameword:应用程序框架,定义了很多操作供程序员调用,中间件

(3)Librares:函数库,支持库

(4)Android Runtime:运行代码的虚拟机,可调用函数库的方法

(5)Linux Kernel:底层Linux内核,内存管理

2.软件知识

SDK:Standard   develop   kit(标准开发工具集)

ADT:Android   develop  tool(eclipse插件)

2.1 SDK Manager


2.2 虚拟机( Avd:Android Virtual Devices)

(1)设备定义(Device Definitions)
<1>.VGA==>480x640,早起电视分辨率
<2>.QVGA==>2.7"==>240x320
<3>.HVGA==>3.2"==>320x480
<4>.WVGA==>3.4"或4.0"==>480x800
<5>.FWVGA==>5.4"==>480x854

(2)加快模拟器启动速度
<1>.使用Intel镜像
<2>.设置内部存储空间、内存、SD卡空间要适当
<3>.勾选Use Host CPU,使用独立显卡渲染模拟器
<4>.可安装IntelHaxm的Intel模拟器加速器

2.3 SDK目录结构


2.4 adb调试桥基本知识

Android debug bridge:安卓调试桥

意义:连接本地系统与模拟器系统,就是封装了Socket来达到系统间通信的程度

1. adb调试桥无法开启的问题

(1)问题1:可能是adb.exe进程已经启动一个,只有手工结束进程管理器中的这个进程即可

(2)问题2:5037端口被占用导致adb调试桥无法启动。查看是谁占用了这个端口即可启动。

知识点:netstat -ano ===>命令行端口查看指令

2. adb常用指令

(1)【adb  devices】列出所有可连接设备的状态,如果有未连接设备,将自动开启并连接该设备

(2)【adb  kill-server】杀死adb调试桥

(3)【adb  start  server】启动adb调试桥

(4)【adb  install  apk文件地址】安装指定apk文件

(5)【adb  uninstall  包名】卸载指定应用

(6)【adb  -s  设备名称   操作指令】有多个设备时需要这样指定操作具体设备

(7)【adb  pull  文件相对路径  保存后的文件名】导出模拟器中的具体文件

(8)【adb  push  文件名  文件相对路径】把PC内文件导入到模拟器中

(9)【adb  shell】连接到了模拟器的命令行终端,就是Linux的命令行终端

2.5 建立Android项目


2.6 Android工程目录详解


清单文件详解

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.heima.helloworld"    android:versionCode="1"    android:versionName="1.0" ><!--package:标识应用程序的包名,在一个手机中不能能有两个应用程序的包名相同versionCode和versionName:应用程序的版本号-->    <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="19" /><!--minSdkVersion:可支持的最低Android版本targetSdkVersion:可支持的最高Android版本-->    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" ><!--icon:图标,可通过修改这里的配置来修改软件的图标label:应用程序的名称,可通过修改这里来修改软件的名称theme:应用程序的样式-->        <activity            android:name="com.heima.helloworld.MainActivity"            android:label="@string/app_name" >            <intent-filter><!--此节点配置的是是否在桌面显示应用程序的图标-->                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

2.7 Android下安装apk的过程


(1)当勾选【Project菜单】==>【Build Automatically】会自动编译全部java文件为.class文件,内部类会被编译为——【外类名$内类名.class】的形式

(2)然后通过dx.bat把.class文件全部打包成一个classes.dex文件

(3)之后dex文件资源引用(resources.ap_,此文件程序自动生成在工程的bin目录中),未压缩的资源,与清单文件合并为一个apk文件

(4)赋予这个应用程序一个签名

(5)调用adb调试桥把应用程序装到指定的Android设备上

(6)拷贝xx.apk到【/data/app/】目录下

(7)在【/data/data/】目录下创建一个目录,目录名就是应用程序的包名

2.8 Dalvik虚拟机与java虚拟机相比较


2.9 知识点

(1)【/system/app/】这是系统应用所存放的目录

(2)【/data/system/package.xml】和【/data/system/package.list】这是Android系统的注册表

(3)【ctrl+F11】模拟器横竖屏切换

(4)sdcard目录在Android表层的一个快捷方式,指向的是【/mnt/sdcard】此路径

基础编码

1.电话拨号器

1.1 界面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/container"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.heima.helloworld.MainActivity"    tools:ignore="MergeRootFrame" >    <EditText        android:id="@+id/etNumber"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:inputType="phone" />    <Button        android:id="@+id/btDail"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_below="@+id/etNumber"        android:layout_marginRight="28dp"        android:text="@string/dail" /></RelativeLayout >

1.2 MainActivity源码

package com.heima.helloworld;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private EditText etNumber;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//电话拨号机Button btDail = (Button) findViewById(R.id.btDail);etNumber = (EditText) findViewById(R.id.etNumber);btDail.setOnClickListener(this);}@Overridepublic void onClick(View v) {String number = etNumber.getEditableText().toString().trim();//首先应该判断文本框内字符串是否为空if(TextUtils.isEmpty(number)){Toast.makeText(this, "请输入电话号码", Toast.LENGTH_SHORT).show();;return;}//意图类,想干一件什么事,动作类Intent intent = new Intent();//设置动作intent.setAction(Intent.ACTION_CALL);//设置要操作的数据intent.setData(Uri.parse("tel:"+number));//开启新界面执行动作startActivity(intent);}}

2.四种点击事件的写法

(1)建立内部类实现OnClickListener接口,复写onClick()方法

(2)使用匿名内部类建立子类对象

(3)参数传入this(本类对象),本类MainActivity实现OnClickListener接口,复写onClick()方法,并且当需要多个点击对象时都使用this,只是在onClick()方法中判断按钮的id不同来实现不同按钮的功能

(4)在界面的布局文件中给指定button空间添加<Button  android:onClick="自定义的方法名" />属性,然后必须在MainActivity中添加这个自定义的方法来处理这个按钮点击事件

3.短信发送器

3.1 界面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/container"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.heima.helloworld.MainActivity"    tools:ignore="MergeRootFrame" > <TextView        android:id="@+id/tvMessageNumber"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_below="@+id/btDail"        android:layout_marginTop="27dp"        android:text="@string/inputNumber"        android:textAppearance="?android:attr/textAppearanceLarge" />    <EditText        android:id="@+id/etMessageNumber"        android:singleLine="true"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_below="@+id/tvMessageNumber"        android:inputType="phone" />    <TextView        android:id="@+id/tvMessageContent"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_below="@+id/etMessageNumber"        android:text="@string/inputContent"        android:textAppearance="?android:attr/textAppearanceLarge" />    <EditText        android:id="@+id/etMessageContent"        android:lines="5"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_below="@+id/tvMessageContent"        android:inputType="textMultiLine" />    <Button        android:id="@+id/btSend"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_below="@+id/etMessageContent"        android:layout_marginTop="26dp"        android:text="@string/send" />    <ProgressBar        android:id="@+id/progressBar1"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_below="@+id/btDail" /></RelativeLayout>

3.2 MainActivity的处理源码

package com.heima.helloworld;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private EditText etMessageNumber;private EditText etMessageContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//短信发送器Button btSend = (Button) findViewById(R.id.btSend);etMessageNumber = (EditText) findViewById(R.id.etMessageNumber);etMessageContent = (EditText) findViewById(R.id.etMessageContent);btSend.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btSend:String mesNum = etMessageNumber.getEditableText().toString().trim();String mesCon = etMessageContent.getEditableText().toString().trim();//判断文本框中内容是否为空if(TextUtils.isEmpty(mesNum) && TextUtils.isEmpty(mesCon)){Toast.makeText(this, "电话或者内容不能为空", Toast.LENGTH_SHORT).show();return;}//获取短信对象,注意不要导错包SmsManager message = SmsManager.getDefault();//当文本区域中的字符传过一条短信能接收的最大字符时,需调用divideMessage方法来拆分文本区域中的字符成多个短信发出for(String content : message.divideMessage(mesCon))message.sendTextMessage(mesNum, null, content, null, null);break;}}}

必要知识

1.Android工程打包过程

步骤:工程上右键】==>【Android  Tools】==>【Export  Signed  Application  Package】导出一个签名应用包

(1)指定要打包的工程


(2)创建或者选定指定的keystore签名文件

(3)创建签名文件必须要填入的信息


(4)打包APK文件保存的位置



1.1 签名相关知识

(1)bin目录下APK文件是没有签名的打包,一个APK要上线,必须使用正式签名来打包

(2)Android不允许安装包名相同,签名不同,这将无法覆盖安装。签名的出现提高了安全性,防止了不同应用的恶意覆盖

(3)正式签名:就是我们创建的签名文件,有密码,有效期50年

(4)Debug签名:Preferences】==>【Android】==>【Build】==>【Default  debug  keystore】这里标识了debug签名文件位置。当直接从eclipse中部署工程时,使用该签名。密码:[android];别名:[andoriddebugkey];有效期:一年

1.2 签名对apk的加密相关

例子:当你对一个apk文件中的任意资源进行修改后,这样此apk无法安装到手机中,会告诉你签名不同无法安装。

解决:META-INF目录下保存的就是签名信息。

<1>.【CERT.RSA】apk签名信息保存的文件,秘钥文件(公钥)

<2>.【CERT.SF】存放了所有资源文件的shal算法计算出来的值(经过秘钥加密后的sha1值)

<3>.【MANIFEST.MF】存放所有资源文件的sha1算法计算出来的值(原始的sha1值)

签名加密算法:RSA加密算法,非对称加密算法,可支持加密和解密。公钥一般会有很多个,保存在客户端。而私钥只有一个在服务端

加密解密步骤:我们Android打包时私钥是keystore文件,用keystore对文件进行加密。然后用户用公钥-->【CERT.RSA】进行解密

安装apk有两次比对的过程:

<1>.首先比对现有每一个资源文件的sha1值与MANNIFEST.MF中的原有资源文件sha1值进行比对

<2>.然后通过公钥对【CERT.SF】进行解密,然后再和【MANIFEST.MF】进行比对。

如果结果都是一样的则安装,否则不允许安装

2.ROOT权限

解释:就是Android系统管理员权限,有了Root权限,就可以任意修改系统文件

2.1 获取权限的好处

(1)刷机                          (2)删除系统内置app                         (3)可以访问data/data目录

2.2 如何获取Root权限

(1)第三方软件,比如刷机大师,一键Root(某些机型不支持)

(2)自己下载工具包,按照网上的教程进行Root

2.3 特殊

(1)如何用真机查看data/data目录?因为就算某些手机Root后也无法查看,这是可以使用【Root   Explorer.apk

3.如何查看ApiDemos源码,也是如何查看工程源码

3.1 ApiDemos导入异常处理

(1)使用:看模拟器中ApiDemos应用中的效果,然后把【SDK目录】==>【sample】的【ApiDemos源码】导入到Eclipse中。

(2)导入可能出现的问题:因为我们的工程编译环境太低导致ApiDemo的主题没有,解决方法:改变编译版本即可

3.2 工作后如何查看源代码,修改某页面的功能?

方法:我们不用从头还是看起,我们只需要看我们需要修改的页面即可。首先打开应用中我们需要修改的界面,然后看其界面中的关键字,找到关键字后通过Eclipse的ctrl+H的全应用搜索功能搜索这个关键字,并且这个搜索功能下边有几个单选按钮来确定你搜索的范围,一般通过选择的项目作为搜索范围

4.Debug测试程序运行时间

4.1 Debug终类

使用:在指定位置记录运行时间,运行程序即可记录,在SD卡根目录将会生成文件dmstrace.trace,然后通过SDK目录中的traceviiew.bat工具查看

Public Methodsstatic voidstartMethodTracing()
开始记录方法运行时间
static voidstopMethodTracing()
结束记录方法运行时间

5.技巧

(1)png类型背景透明的icon按钮在屏幕中显示透明背景,需要把背景色设置为background="@android:color:/transparent"

(2)你如何查看被人代码的布局,不要上来就去查看源代码,要打开图形化视图,然后查看Outline模块查看布局文件的结构

(3)如果查看源码没法查看并且没有导入按钮,可以先把源码环境先从工程的环境中删除,然后再手动导入进来,你就会发现源码的导入按钮就出现了

(4)sha1使用场景:检测文件是否相同是否冲突使用SHA-1算法,能检测任意文件是否是两个相同文件。(检测文件是否相同是否冲突使用SHA-1算法,能检测任意文件是否是两个相同文件)

0 0
原创粉丝点击