day01 英語****
Generation 一代人;代(約30年),時代
icon 圖標
Libraries:c代碼庫
? OpenGL:圖形快速顯示,游戲開發
? webkit:瀏覽器內核
? Android Runtime
? Dalvik VM:虛擬機,android代碼運行在此虛擬機
? 運行時調用Libraries C代碼庫
? Application Framework中間介,java代碼,調用底層c代碼
n.構架;框架;(體系的)結構;機構,組織
? Applications原生的應用程序:瀏覽器、桌面、聯系人等
?eclipse就是存放編譯器的目錄。
?sdk為Android提供的軟件開發工具包,
?SDK Manager.exe就是sdk管理工具,下面會介紹。
sdk目錄為:
異常cause by 事件方法無參數。 方法私有啦
andorid eclipse 路徑的配置
JAVA_HOME D:\software\jdk1.8.0_25
path %JAVA_HOME%/bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
今天的知識
一。安卓發展史
3G
4G 4th -Generation ,速度可達到100Mbps以上,可以在線觀看高清視頻,上傳下載大批量數據。4g: lte , long time evolution
5G 5th - Generation, 速度可達到1Gbps以上,幾乎滿足人們的所有需求。
二。android的版本
2.3 具有NFC 近場通信技術
3.0 具平板設計
三。Android 操作系統架構 (重點)
Android架構
application 運用層 (java開發)
瀏覽器、桌面、聯系人
application framework 運用框架層 (java開發+JNI)
(JNI java native interface 呈上其下 )
Libraties 函數庫 (c/c++開發) 和 Android Runtime 虛擬器層
OpenGL:圖形快速顯示,游戲開發 Dalvik VM:虛擬機,android代碼運行
webkit:瀏覽器內核
Linux Kernel : linux 硬件內核驅動層 (c開發 )
用于安全管理、內存管理、進程管理、電源管理、硬件驅動
四。兩種虛擬機的不同
1.基于的架構不同: jvm 基于棧(位于內存的一個空間,執行指令需要尋找cpu的地址 )
DVM 基于寄存器(CPU的一個組成部分,不需尋找Cpu地址,直接運行執行)
2.執行的文件的格式不同: JVM 一次執行多個.class文件,運行慢
DVM 一次運行 將多個.class文件編成一個.dex文件 執行 ,運行快
五。 ART 與 DVM
ART 不需轉換代碼,直接預編譯成機器碼,效率高
優點:程序無需轉換, 運行速度塊,
缺點: 占用內存大,
DVM 運行慢 卡頓
六;Android 開發環境的搭建
1.匹配 Android JDK 要匹配位數 32 64
2.
3. adt-bubdle : android develpement tools bubdle 安卓開發工具集
eclipse
sdk
SDK Manager 在此翻墻下載一些新的API文檔
4. plamform的 apilevel 19 4.4版本
18 4.3
11 3.0
10 2.3
8 2.2
5 plamform-tools
aapt.exe android application package tool 安卓運用包工具
adb.exe 建立電腦與手機之間的鏈接
dx.bat 講多個.class文件打包成一個.dex文件
七, SDK下的目錄
add-ons 預留的一個附加目錄
build-tools 構建工具目錄
docs SDKAPI參考文檔,所有的API都可以在這里查到。
extras 開發中額外提供的一些工具及jar
platforms 不同版本android的核心jar包
platforms-tools 平臺一些相關的工具
soursce 原碼
system-images:系統鏡像文件
tools:開發中使用的一些工具,如9path,做圖片拉伸適配
八:Android Manager 介紹
九:模擬器的簡介及創建
Device 常用的分辨率
3.2----- QVGA ------320480
3.7=====WVGA=========480800
4.7------WXGA-------1280*720
十 DDMS
dalvik debug manager system:delvik調試管理系統
|--Devices 顯示當前電腦所連接的所有android設備
顯示 android設備運行的進程
|--Debug小蜘蛛 用來調試程序用的
|--Start Method Profiling 開始方法的分析 分析某個操作,某個方法的性能
|--Stop Process 停止進程,可以結束一個應用進程,殺死應用,清理緩存。
|--Screen Capture 屏幕捕獲,可以給連接上的設備截屏。-
File Explorer:文件系統 列出當前設備所有目錄。
dataapp: 自己安裝的應用程序apk文件存放的目錄,
|-- data-data:應用的私有目錄,系統每安裝一個新的應用程序,都會在此目錄創建該應用包名的文件,用來存放該應用的私有數據,當應用卸載時,該包名的文件夾也會被刪除。
|--mnt-sdcard:SD卡目錄
|--system-->app:系統應用程序apk文件存放的目錄
十一:
部署運行的三種方式:- 右擊工程 run as
- 工具欄的按鈕
- 快捷鍵:ctrl+F11
dalvik debug manitor service
十二: android工程目錄結構
src 源代碼
gen 自動申城的文件目錄,不能修改
|----Builder
|---R.java 里面有很多的內部類 是對資源文件的一個索引
Android4.3
|-- android.jar 屬性可修改版本等級 (只要一個)
Android Dependencie 第三方jar包
assets 資產目錄 用來存放程序運行過程中需要的一些工具
bin
|--dexeLibs
|--res
|---res
drawable-hdpi 存放圖片資源
layout 布局資源
menu 菜單資源
activity_main.xml
|--values
dimens.xml 封裝長度
String.xml 封裝字符串
type.xml 封裝樣式
|--values-zh value還可國際化 自建 國際化資源 中國的
|--values-en 美國的
AndroidMainfest.xml 清單文件
程序的入口,action:main 主要的 category Lancher 啟動 發射
包名
圖片圖標
版本名
運用名
package 包名 唯一標示
versionCode
minsdkVersion 運用程序安裝的最低版本
引用一張圖片 @文件夾/圖片
@draw
圖片命名規則: 不能字母大寫,中文命名, 數字開頭
activity.java
oncreate 是activity啟動時調用,
activty 可還以配置運用程序的使用 權限
<uses-permission android:name="android.permission.CALL_PHONE"/>
十三:android 打包過程
.java
------jdk------->.class
-----dx.bat------>一個.dex 聯合 res assets androidmanifest.xml
-----aapt------>.apk
---簽名認證jarsigner---- ->final.apk 上市
任何一個apk都需要簽證才能上市,
十四:adb命令行操作
android debug bridge 調式橋 建立手機與電腦直接的連接 adb運行的端口號是5037
1.環境變量的配置:path C:\kaifa\adt-bundle-windows-x86_64_20140101\sdk\platform-tools
2.指令
adb devices 列出當前電腦連接的android設備桌面
adb pull phone_paht pc_path : 將手機端(設備)文件 拉到 電腦里 // pull 拉 托
adb push pc_path phone_path 將電腦文件 倒到手機里
adb install [-r] apkpath 電腦的文件(記事本) 安裝到手機上 -r 強制安裝
adb install -r C:\user]Administrator\Desktop\com.HonestNotebook.apk
adb uninstall packagename; 從手機卸載一個應用程序
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
adb kill-server 關閉調式橋
adb start-server 開啟調式橋
adb端口號占用的問題
netstat -oan 查看 adb的端口號 被那個進程占用啦
在啟動任務管理器里找到該進程,把其關掉,然后重啟cmd就行啦
adb shell 進入當前設備linux環境下
案列
--> adb shell
進入私有文件目錄
--> root@android:/ # cd data/data/com.itheima.filePermission
+ls -l 查看當前設備的目錄結構
-->root@android:/data/data/com.itheima.filePermission # ls -l
drwxrwx--x u0_a48 u0_a48 2015-08-31 02:04 cache
drwxrwx--x u0_a48 u0_a48 2015-08-31 02:04 files
drwxr-xr-x system system 2015-08-31 02:04 lib
進入文件 files的目錄
----> root@android:/data/data/com.itheima.filePermission # cd files
進入文件 files的目錄結構
--->root@android:/data/data/com.itheima.filePermission/files # ls -l
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 append.txt
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 private.txt
-rw-rw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 read.txt
-rw-rw--w- u0_a48 u0_a48 18 2015-08-31 02:04 write.txt
使用 linux的指令 chmod 更改私有文件的權限
輸入 # chmod 要成為的權限(十進制) 修改的私有文件
---> # chmod 764 append.txt
---> # ls -l
-rwxrw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 append.txt (權限發生了改變-rw-rw----為-rwxrw-r--)
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 private.txt
-rw-rw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 read.txt
-rw-rw--w- u0_a48 u0_a48 18 2015-08-31 02:04 write.txt
adb shell +ls -l 查看當前設備的目錄結構
adb shell+logcat 查看系統運行中的日志信息(錯誤信息)
注意 如果當前電腦連接多態android設備,需要指定操作的當前是那臺android設備。
要在 adb后加 -s 設備序列號
十五.案列:電話撥號器(重點)
1.需求分析文檔,設計UI原型圖
2.UI工程師 設計UI界面
3.架構師 寫架構,寫接口文檔
4.碼農 客戶端
A寫布局界面
1.res/layout/activity_main.xml 布局控件代碼 搭建界面需要控件有:TextView控件(請輸入電話號碼)、EditText控件(xxx號碼)、Button(呼叫此號碼)
?
B 寫業務邏輯 MainActivity.java
1. 通過布局文件中對控件配置的id,在activity中獲取控件的對象
findViewById(int id)
2. 為按鈕設置點擊事件,當點擊Button時發生事件 獲取EditText中文本內容,號碼
bt_callphone.setOnClickListener( new OnClickListener(){public void onClick(View v){syso(....);}}
3.在點擊事件的onclick方法中,獲取用戶輸入的電話號碼
//獲取EditText extends TextView 對象的文本內容
String strNumber=et_number.getText().toString().trim();
4.創建一個意圖Intent對象 向 電話撥號器發送意圖撥打電話
Intent intent = new Intent();
5..為Intent對象設置一個打電話的動作
intent.setAciton(Intent.ACTION_CALL);
6.為Intent對象設置一個數據,告訴意圖對象具體做什么事
intent.setData(Uri.parse("tel:"+strNumber));
7.啟動Intent對象,執行以上動作
startActivity(intent);
8.在androidmanifest.xml中設置一個打電話的權限
<uses-permission android:name="android.permission.CALL_PHONE"/>
5.測試工程師 測試運用
十六.按鈕的四種點擊事件 crl+shift+g 看事件是否引控件用
方法一:使用匿名內部類實現點擊事件,但對于多個按鈕的點擊事件比較臃腫
btn_call.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number = et_number.getText().toString().trim();
// 獲取文本框的內容
if ("".equals(number)) {
// context 上下文 duration 顯示土司的時長
//這里不用MainActivity.this, 要用 mcontext // private Context mcontext // mcontext=this
Toast.makeText(mcontext, "號碼不能為空", Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(); // 創建意圖對象
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
}
});
方法二:內部類來實現 定義一個內部類MyButtonListener 實現接口OnClickListener,重寫OnClick(View v)方法
private class MyButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number =
et_number.getText().toString().trim();
// 獲取文本框的內容
if ("".equals(number)) {
Toast.makeText(mcontext, "號碼不能為空", Toast.LENGTH_LONG).show();
return;
}
System.out.println("number--" + number);
Intent intent = new Intent();
// 創建意圖對象
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
}
}
//方法三 使用switch選擇語句 實現N多個按鈕的點擊事件 ,這種方法最優,開發經常用
//但是MainActivity要實現OnClickListener接口 ,重寫Click(View v)方法
public class MainActivity extends Activity implements OnClickListener {
private Button bt_01;
private Button bt_02;
private Button bt_03;
private Context mcontext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcontext=this;
使用switch選擇語句 實現N多個按鈕的點擊事件
//但是MainActivity要實現OnClickListener接口 ,重寫Click(View v)方法
bt_01.setOnClickListener(this);
bt_02.setOnClickListener(this);
bt_03.setOnClickListener(this);
}
private void callphone() {
//3.獲取用戶輸入的電話號碼
String number = bt_01.getText().toString().trim();//通過EditText獲取該控件上顯示的文本內容
//4.撥打電話號碼
Intent intent = new Intent();//創建一個意圖對象; 奴隸,打電話
intent.setAction(Intent.ACTION_CALL);//設置意圖對象的動作,打電話
intent.setData(Uri.parse("tel:"+number));// 設置意圖對象的數據,告訴奴隸撥打的電話號碼
startActivity(intent);//去啟動一個意圖對象
}
對象 View v 有一個方法getId() 獲取當前被點擊的控件對象的id
@Override
public void onClick(View v) {
int id = v.getId();
switch( id){
case R.id.bt_01: //當點擊按鈕1時,調用 callphone()方法, 執行撥打電話功能
callphone();
break;
case R.id.bt_02: //當點擊按鈕2時,顯示按鈕02被點擊啦
Toast.makeText(mcontext, "按鈕02被點擊啦", Toast.LENGTH_SHORT).show();
break;
case R.id.bt_03://當點擊按鈕3時,顯示按鈕03被點擊啦
Toast.makeText(mcontext, "按鈕03被點擊啦", Toast.LENGTH_SHORT).show();
break;}}
}
1.使用匿名內部類的方式,
bt_callphone.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String strNumber=et_number.getText().toString().trim();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+strNumber));
startActivity(intent); } });
2. 創建一個子類MyonclickListener實現接口onclickListener, 重寫onclick()方法, 設置控件點擊事件時傳一個類的對象。
private class MyButtonListener implements OnClickListener {
// 當按鈕被點擊的時候調用
@Override
public void onClick(View v) {
// 3. 獲取到 我要撥打的號碼 首先我要 找到 文本框
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number =
et_number.getText().toString().trim(); // 獲取文本框的內容
// 判斷number 如果號碼為空 我彈出一個提示 土司 Toast
if ("".equals(number)) {
// context 上下文 duration 顯示土司的時長
Toast.makeText(MainActivity.this, "號碼不能為空",
Toast.LENGTH_LONG).show();
return;
}
System.out.println("number--" + number);
// 4 撥打此號碼 意圖 干 一件事的想法 打 狗 貓 打代碼 打電話
Intent
Intent intent = new Intent(); // 創建意圖對象
// 設置要撥打的動作
intent.setAction(Intent.ACTION_CALL);
// 設置撥打電話號碼的數據 uri統一資源標示符 范圍要比
url定義范圍要廣定義的語法規則 比較 url
// http://www.baidu.com 統一資源定位符
intent.setData(Uri.parse("tel:" + number));
// 真正的撥打號碼 開啟意圖對象
startActivity(intent);
}
3. 讓當前類MainActivty實現接口onclickListener,設置控件點擊事件時傳一個this。這種方式適合按鈕比較多的情況,一般在公司采用該方式。
4. 在布局文件中為控件添加一個onclick屬性,在布局對應的Activity中寫一個一onclick屬性值為名的方法,要public,傳一個View類型的參數。比較適合做簡單的測試。
十七. 控件布局方式
控件的編號id android:id="@+id/當前控件對象"
1.LinearLayout(線性布局)
<TextView/> 文本框 顯示框的內容
水平線性布局 android:orientation=“horizontal”表示水平方向
、垂直線性布局 android:orientation=“vertical”表示垂直方向
android: gravity=center/left/right gravity:對齊方式 子控件以當前控件為參照物的對齊方式 (注:與父窗體界面無關)
android: layout_gravity=center/left/right 當前控件以父窗體為參照物的對齊方式 (父窗體可能指手機屏幕,也可能指孫控件的父控件窗體)
android:background="#ffffff" 控件的背景顏色
android:layout_margintop/Bottom/Right/Left="50dp" 當前控件 與上面/下面/右邊/左邊 控件 的間距
android: padding=10dip 當前控件里面的子控件 與 當前控件的四周間距
android:paddingTop="20dp" 當前控件與上面的控件的間隙
android:paddingBottom="20dp" 當前控件與下面的控件的間隙
android: hint 友情提示,引導你做什么
android:layout_width="match/fill_parent" 控件的寬填充父窗體
android:layout_width="wrap_content" 控件的寬被父窗體包裹
android:layout_height="match/fill_parent" 控件的高填充父窗體
android:layout_height="wrap_content" 控件的高被父窗體包裹
RelativeLayout(相對布局)都是從左上角開始布局,要控制位置需要 設置 每個控件相對于其他控件的位置。
都是從左上角開始布局,要布局控件的位置就要以其他的控件為參照物
當前控件相對于另一個控件
layout _below="@id/bt_center" 當前控件位于哪個控件的下方
android:layout_above="@id/bt_center" 當前控件位于哪個控件的上方
android:layout_toLeftOf="@id/bt_center" 當前控件位于那個控件的左邊
android:layout_toRightOf="@id/bt_center" 當前控件位于那個控件的右邊
layout_alignParentright 當前控件以父窗體(手機界面)為參照物的對其方式
android:layout_centerHorizontal="true":當前控件在父窗體中水平居中
android:layout_centerVertical="true":當前控件在父窗體中垂直居中
android:layout_centerInParent="true": 當前控件位于父窗體的正中間
幀布局 FrameLayout
控件一層一層往上疊加布局
表格布局 TableLayouts
TableRow 此控件代表一行,
TableRow 此控件代表一列
絕對布局 AbsoluteLayout
-------------------------應用列表界面。
Settings設置-display
*Screentimeout,屏幕超時。超出設置時間,自動鎖屏。在4.1中是Sleep選項。
? Package
Name:包名,這個命名要具有一定意義,比如:com.公司名稱.xxx
? Minimum Required SDK:工程最低要求運行版本
? Target SDK:最高可運行的版本
? Compile With:編譯的版本,一般用較高的版本
? Theme:主題:none即可
注意這里的工程名是01.HelloWorld,這是下邊的包名Package
Name會自動生成com.example.1.helloworld,包名中不允許出現數字,所以刪掉
即
Android工程目錄結構
? src:源代碼。如果最初選擇創建Activity,會有一個Activity的子類
? gen:系統自動生成的文件。R.java 中記錄了項目中各種資源ID
BuildConfig.java 標記項目是否可以Debug
? Android 4.4
當前工程所使用的SDK類庫
? Android Private Libraries
用來支持各個版本的類庫
? assets:資源文件
不會在R文件注冊,原封不動發布
里面可以放置應用程序依賴的一些文件
如果此文件夾中存放的文件過大,在發布時,上傳apk將會很慢。
? bin:編譯后的二進制文件
包括class、資源文件、dex、apk、清單文件等
? libs:工程中使用的庫
默認帶有版本支持的類庫,像v4、v7包
? res:系統資源,所有文件都會在R文件生成資源ID
? drawable:圖片
? layout:界面布局
? menu:菜單
? values:字符串、樣式等數據
? anim:動畫
? raw:原生文件
? drawable-hdpi:高分辨率的圖片目錄
? drawable-ldpi:低分辨率的圖片目錄
? drawable-mdpi:中分辨率的圖片目錄
? drawable-xhdpi:大分辨率的圖片目錄
? drawable-xxhdpi:超大分辨率的圖片目錄
? AndroidManifest.xml:清單文件
Android中的四大組件(Activity、ContentProvider、BroadcastReceiver、
Service)都需要在該文件中注冊
程序所需的權限也需要在此文件中聲明,例如:電話、短信、互聯網、
訪問SD卡。
manifest節點:pakeage:是應用安裝的路徑data/data的目錄,手機上的
應用程序的不能有一樣的包名/目錄。
? manifest節點:
versionCode:應用程序版本號
versionName:應用程序版本名稱
? proguard.cfg:
用來混淆代碼的配置文件,防止別人反編譯
? project.properties:
標記該項目使用SDK版本號,早期版本名為:default.properties
Android程序部署與啟動
? 應用程序安裝、發布:Package Explorer中右鍵點擊工程 – Run As –
Android Application,快捷鍵Ctrl+F11
程序啟動過程:
? Eclipse將.java源文件編譯成.class
? dx工具將所有.class文件轉換為.dex文件
? 再將.dex文件和所有資源打包成.apk文件
? 將.apk文件上傳并安裝到模擬器,存儲在/data/app目錄下
? 啟動程序,開啟進程
? 根據AndroidManifest.xml文件找到MainActivity類,創建Activity
? Activity創建后執行onCreate(Bundle)方法,根據R.layout.activity_main構建
界面
?
Android程序部署與啟動
? 應用程序安裝、發布:Package Explorer中右鍵點擊工程 – Run As –
Android Application,快捷鍵Ctrl+F11
程序啟動過程:
? Eclipse將.java源文件編譯成.class
? dx工具將所有.class文件轉換為.dex文件
? 再將.dex文件和所有資源打包成.apk文件
? 將.apk文件上傳并安裝到模擬器,存儲在/data/app目錄下
? 啟動程序,開啟進程
? 根據AndroidManifest.xml文件找到MainActivity類,創建Activity
? Activity創建后執行onCreate(Bundle)方法,根據R.layout.activity_main構建
界面
public class MainActivity extends Activity {
@Override
//oncreate()運用程序界面被創建時調用此方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置運用程序的UI界面顯示調用setContentView()方法
/*R是個最終類 能自動生成 ,不能修改 AUTO-GENERATED FILE. DO NOT MODIFY.
* res 是個資源文件夾
* R.layout.activity_main 調用.layout文件夾里的activity_main.xml文件,就會顯示出虛擬機界面在eclipse里 */
setContentView(R.layout.activity_main);
}
}
? R.layout.activity_main是R類中的一個成員變量,指向res/layout/activity_main.xml文件
? activity_main.xml文件中描述了Activity的布局方式以及界面組件
? 解析activity_main.xml,通過反射創建對象,生成界面
Android程
各個關于
關于MainActivity.java 文件 ----activitiy 第一次創建的時候調用
/02_常見布局/src/cn/itheima/flayout/MainActivity.java
public class MainActivity extends Activity {
@Override
//oncreate()運用程序界面被創建時調用此方法 //運用程序只要一開啟就會調用oncreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置運用程序的UI界面顯示調用setContentView()方法
/*R是個最終類 能自動生成 ,不能修改 AUTO-GENERATED FILE. DO NOT MODIFY.
* res 是個資源文件夾
* R.layout.activity_main 調用.layout文件夾里的activity_main.xml文件,就會顯示出虛擬機界面在eclipse里 */
// 加載 activity 需要顯示布局
setContentView(R.layout.activity_main);
}
}
關于R.java 文件
/02_常見布局/gen/cn/itheima/flayout/R.java
public final class R
|---- public static final class attr {}
|---- public static final class dimen {
static final int activity_horizontal_margin=0x7f040000;
static final int activity_vertical_margin=0x7f040001; }
|---- static final class drawable {
public static final int ic_launcher=0x7f020000;}
|---- public static final class id {
public static final int action_settings=0x7f080000;}
|---- static final class layout {
static final int activity_main=0x7f030000;}
|---- static final class menu { static final int main=0x7f070000; }
|---- static final class string {
static final int action_settings=0x7f050001;
static final int app_name=0x7f050000;
static final int hello_world=0x7f050002;}
關于activity_main.xml文件
描述了Activity的布局方式以及界面組件
/02_常見布局/res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="ceenter_horizontal" // 讓控件在界面水平居中
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
//設置控件的id
<EditText android:id="@+id/et_password" />
<EditText android:id="@+id/et_password"/>
<CheckBox android:id="@+id/cb_remember"/>
關于 AndroidManifest.xml 文件
/02_常見布局/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itheima.flayout"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="cn.itheima.flayout.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>
(4.2前) Dalvik VM 安卓運用虛擬機程序
(4.2后) 新版本 ART 安卓虛擬機運用程序
1.提高程序運行效率
2.但是不穩定,耗電量大,占用內存
2.android開發工具的下載配置
www.andro s 安卓開發工具集
.*下載安卓的ADT的插件 for eclipse
instaling eclispe plugin eclispe插件
*android SDK 開發工具集
eclipse
Android Studio
*下載 adt-bundle-windows-x86-2013-解壓:
有 eclipse
sdk
SDK Managet.exe
* 選 Android 4.1.2(API16)為例 選擇 ARM system-images 選擇模擬器創建需要的鏡像
android SDK Manger開發環境的目錄結構 :下載安裝最新的 sdk程序
sdk 包
build-tools 編譯需要用到的所有工具,把開發的程序裝進手機
docs 開發的離線文檔
extras 額外工具,模擬器加速器,向下兼容的jar包
---android/ support:存儲的是goole開發的新特性jar包
-----intel /...Mannger(硬件加速管理器)/IntelHaxm.exe 提高電腦inter的運行速度(i3以后處理器)platforms 開發需要的版本平臺,每個平臺的android.jar在對應的文件夾里面
platform-tools 開發調試的工具
----adb.exe 一個重要的調試橋(連接pc機與手機模擬器)sources 存儲android.jar的源碼 goole工程師開發的源代碼存于此
system-images 存儲各個不同版本模擬器創建需要的鏡像
tools 開發輔助需要用到的工具,
---emulator.exe 模擬器.exe
手動配置安卓eclipse開發環境
eclipse/window/preferces/Android/輸入sdk路徑 :找到sdk存儲的路徑
建立android項目工程
new/Android Applicstion project
或/other/Android/Android Application project
彈框
運用名 Application Name : helloworld
工程名 project Name: helloworld
包名 pakge Name : com.itheima.helloworld
minimum required SDK :設置即你編寫的安卓程序代碼 能夠安裝移植運行的最低版本的安卓手機
API 9 Andorid 2.3 安裝的程序的最低版本手機是 9(2.3) 9(2.3)以下的版本則不能安裝
Target SDK : 設置即你編寫的安卓程序代碼 能夠最高兼容版本的手機
API 21 Andorid 5.0
Compile With : 用..進行編譯,即把java代碼打包成jar包 裝在手機里
API 16 Andorid 4.1 最穩定
下一頁面
選 ceate custum lanucher icon
選 create activity
選 create project in workplace 選擇工作空間
下一頁面 創建 create activity
eclipse 頁面
Android virtual Device Manger 安卓虛擬設備
AVD Name : ipone6
設備 Device : HVGA 480x320 (小尺寸的 我的點哪配置低,分辨率低)
Target Android 4.1.2 -APIlevel 16
CPU/ABI Intel Atom(x86)
內存 Menory oPtion: Ram:512 不能太大,否則溢出
VM 16
手機內存卡 Internal Storage 200M
外卡 SD Card 32M
Snapshot 開發休眠 不建議選
如何把工程項目部署到安卓的模擬器里那?
右擊項目工程/run as/android application
VGA
過去的一種圖形顯示大小的規范 480*640 標準
QVGA 分辨率 240x320 // Q 1/4
HVGA 480x320 //H 一半
WVGA 480x800
FWVGA 854x480
ADB
adb:android debug bridge 安卓調試橋 (pc與手機相連)
*DOS adb devices
查看鏈接到電腦上的所有的手機設備。(模擬器,真實的手機)
emlator-5554 device 上線
emlator-5555 offline 沒上線
emlator-5556 offline 沒上線
如果都顯示的是 offline 說明模擬器掉線啦
解決:關掉 adb調試橋,重啟adb調試橋
DOS adb kill-server
DOS adb start-devices
- adb kill-server
殺死adb的調試橋
- adb start-server
重新啟動adb的調試橋
如何把電腦上的一個文件(記事本) 安裝到 模擬器(真實的手機)上
- adb install xxx.apk
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
從手機卸載一個應用程序,參數是應用程序的包名, 打開DDMS,查看應用程序的包名的路徑
*DOS adb uninstall 應用程序的包名
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
對adb.exe進行環境變量配置,可以在DOS的任意目錄下運行
path
;E:\Android SDK\adt-bundle-windows-x86_64_20140101\sdk\platform-tools;
DDMS
dalvik debug manager system dalvik 虛擬機調式系統
1.Devicer 顯示手機的各個軟件的進程和路徑
-
file Explorer 文件瀏覽器 上傳到電腦和下載數據到手機
把虛擬機/手機的文件倒到桌面上 點擊小標簽 pull a file from the device如何把電腦的音樂文件倒到手機里 /虛擬機的sdcard卡可以放些歌曲視頻文件
DDM /sdcard 點擊右上角按鈕 pullafile onto the device 選擇電腦的歌曲即可導入到手機里
3.Emulator contor 控制模擬器
可以模擬打電話 發短信
注意:要是Devicer 無進程顯示 則模擬器掉線啦
DOS adb kill-server
adb devices
android應用的目錄結構(左邊)
-
src文件夾,java源代碼
onCreate()界面被 開啟調用該方法//設置應用程序顯示的ui setContentView(R.layout.activity_main);
gen目錄
自動生成的文件夾 ,里面保存的是res資源文件的引用android4.1.2 代表的是引用的android.jar包
libs文件夾
代碼的三方jar包。會自動的被添加到android.dependencies目錄下
如何把jar包添加進libs里去android dependencies 開發依賴的jar包
bin
編譯生成的臨時文件和二進制文件和上傳到虛擬機的apk文件都在bin里。會自動生成的-
res目錄
- drawable-ldpi 運用程序的自身使用的圖片。 low 低分辨率 小圖
- drawable-mdpi middle 中等分辨率
- drawable-hdpi high高分辨率
- drawable-xhdpi x加大高分辨率
- drawable-xxhdpi 加大再加大的分辨率
- layout 用xml文件編寫的布局
- menu 菜單文件夾
-values 里有個string.xml文件,代表程序的字符串資源,打開可以修改代碼內容
AndroidManifest.xml
清單文件,配置應用程序的版本,圖標,名稱等重要信息。
android應用程序開發的步驟
1.設置空間布局 res-->layout文件夾 修改xml布局文件(即修改UI的文檔代碼),修改按鈕
- src目錄 -->編寫MainActivity.java文件的代碼
- 找到關心的控件,我就要添加什么控件
view findViewById(int id);
View button= findViewById(R.id.bt_call)
4.控件是按鈕對象button 設置點擊事件動作 Intent setAction(String action) 方法 并獲取數據 Intent setDate(int data)方法
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel://15671307215"));
- 記得添加權限。 涉及隱私 注冊撥打電話權限android.permission.CALL_PHONE
關于控件的 一系列、
TextView
EditText
Button
控件的id
<TextView android:id="@+id/textView1"/>
<EditText android:id="@+id/et_number"/>
<Button android:id="@+id/btn_call" />
控件的 事件
android:onClick="getPrivateFile"
android:onClick="read"
android:onClick="write"
Android常見布局
- 線性布局 LinearLayout 按線排列
重要參數
1.1朝向 orientation = horizontal水平朝向 或 vertical垂直朝向
android:orientation="vertical" 控件垂直朝向
android:orientation="horizontal" 控件水平朝向布局
1.2
width 寬度 控制控件在父窗體里面顯示的比例。
---->weight=fill/match_parent 我的布局填充占滿父窗體(虛擬機界面)
--->也可以weight=“160px”寬占整個界面的一半
height 高度 控件布局在窗體里 顯示的高度比例
--> height =warp_parent 控件布局部分填充父窗體(被父窗體包裹)
--> 也可以 height =“160px” 高整個界面的一半
<Button/EditText
android:layout_width="match_parent" //高布局占滿
android:layout_height="warp_parent" //寬布局部分填充界面
android:orientation="vertical/horizontal" />//控件布局 水平或垂直朝向
1.3 weight 指此按鈕占整個界面的百分比重
<Button
android:layout_width=" 0dp"
-- weight 指此按鈕占整個界面的百分比重 2 此按鈕占 正整個界面的2/3、
android:layout_width=" 2"
android:layout_weight="2"
android:text="按鈕01"
/>
<Button
android:layout_width=" 0dp"
-- weight 指占整個界面的百分比重 1 此按鈕占 正整個界面的1/3、
android:layout_weight=" 1"
android:layout_height="wrap_content"
/>
-
相對布局 Relate Layout :找準參照物
要不一個按鈕控件帶 帶有 Parent 就是與父窗體(手機界面)相關,此空間屬性 不需要id,屬性直接true flase
以父窗體為參照物進行布局
要不一個按鈕控件 如果沒帶Parent ,此控件的屬性 就要有id,是以某個控件的id編號為參照物,進行布局
正中間按鈕, 有個 id編號,以此按鈕為參照物
<Button
//為正中間的按鈕定義了一個id 編號 "@+id/bt_middle"
//在R文件里一保存就會在class id 類里生成一個 常量 int bt_minddle=0x7f070000;
android:id="@+id/bt_middle"android:layout_width="wrap_content" android:layout_height="wrap_content" center Horizontal="true" 按鈕控件水平居中 android:layout_centerHorizontal="true" centerInParent="true" 按鈕空間垂直居中 //centerInParent="true" 按鈕控件在父窗體的正中間 android:layout_centerInParent="true" android:layout_centerVertical="true" android:text="正中間按鈕" /> 在中間按鈕的上方按鈕 ,以中間按鈕的編號為依據android:layout_above="@id/bt_middle"
<Button
android:layout_width="wrap_content "
android:layout_height="wrap_content"
//此按鈕在 中間按鈕 的上方 //layout_above
android:layout_above="@id/bt_middle"
android:layout_centerHorizontal="true"
android:text="↑上方按鈕" />在中間按鈕的下方按鈕 以中間按鈕的編號為依據 android:layout_below="@id/bt_middle"
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//此按鈕在 中間按鈕 的下方 //layout_below
android:layout_below="@id/bt_middle"
android:layout_centerHorizontal="true"
android:text="↓" />
在中間按鈕的左方按鈕 以中間按鈕的編號為依據 android:layout_toLeftOf="@id/bt_middle"
<Button
//toLeftOf 控件左邊布局
android:layout_toLeftOf="@id/bt_middle"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="←" />
在中間按鈕的下右方按鈕 以中間按鈕的編號為依據 android:layout_toRightOf="@id/bt_middle"
<Button
//toRightOf 控件右邊布局
android:layout_toRightOf="@id/bt_middle"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="→" />
凡是控件帶有 Parent 就是與父窗體(手機界面)相關,此空間屬性 不需要id,屬性直接true flase
如果沒帶Parent ,此控件的屬性 就要有id,以某個控件的id為參照物,進行布局
此按鈕在父窗體 最左上角。 與中間的按鈕控件 無關,不需要 中間按鈕的編號 依據
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentTop="true" 按鈕控件與父窗體的最頂部對齊
android:layout_alignParentTop="true"
//alignParentLeft="true" 按鈕控件與父窗體的最左邊對齊
android:layout_alignParentLeft="true"
android:text="左上角"
/>
此按鈕在父窗體 最左下角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentBottom 按鈕控件與父窗體的最底部對齊
android:layout_alignParentBottom="true"
//alignParentLeft 按鈕控件與父窗體的最左邊對齊
android:layout_alignParentLeft="true"
android:text="左下角"
/>
此按鈕在父窗體 最右下角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentBottom 按鈕控件與父窗體的最底部對齊
android:layout_alignParentBottom="true"
//alignParentRight 按鈕控件與父窗體的最右邊對齊
android:layout_alignParentRight="true"
android:text="右下角"
/>
此按鈕在父窗體 最右上角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentTop="true" 按鈕控件與父窗體的最頂部對齊
android:layout_alignParentTop="true"
//alignParentRight 按鈕控件與父窗體的最右邊對齊
android:layout_alignParentRight="true"
android:text="右上角"
/>
</RelativeLayout>
- 幀布局 FrameLayout
div 暫停的圖標,顯示在界面的中間。
幀布局布局特點:下個(后個)控件布局總是懸浮在前個控件的上方,若下個控件面積大于前個控件的面積,則會覆蓋掉前個控件。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
//幀布局的控件寬高匹配父窗體
android:layout_width="match_parent"
android:layout_height="match_parent" >
//父窗體是白色底板,TextView就是懸浮在父窗體上的一個 紅色畫布
<TextView
android:layout_width="300px"
android:layout_height="300px"
//TextView的布局方式:layout_gravity ="center/button/top"http://讓 TextView居中/低/頂 布局
android:layout_gravity="center"
android:background="red" />
// 此控件布局懸浮與上個紅色控件的上方。
<TextView
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:background="green" />
// 此控件布局懸浮與上個綠色控件的上方
<TextView
android:layout_width="100px"
android:layout_height="100px"
android:layout_gravity="center"
android:background="blue" />
// 此控件布局懸浮與上個藍色控件的上方
<TextView
android:layout_width="50px"
android:layout_height="50px"
android:layout_gravity="center"
android:background="yellow" />
</FrameLayout>
- 表格布局 TableLayout
表格布局;就是里面有很多的行 TableRow代表行
//第一行 姓名
<TableRow
// TableRow代表行 寬 填充父窗體,高被包裹
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0px"
android:layout_weight="2" //權重 占2
android:layout_height="wrap_content"
android:text="姓名:" />
<EditText
android:layout_width="0px"
android:layout_weight="5" //權重 占5
android:layout_height="wrap_content"
//hint 填寫
android:hint="請填寫姓名" />
</TableRow>
//第二行 填身份號碼
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0px"
android:layout_weight="2" //權重 占2
android:layout_height="wrap_content"
android:text="身份證號碼:" />
<EditText
android:layout_width="0px"
android:layout_weight="5" //權重 占5
android:layout_height="wrap_content"
android:hint="請填寫身份證號碼" />
</TableRow>
</TableLayout>
- 絕對布局 AbsoluteLayout
廢棄,不推薦使用。 deprecated 廢棄
720p (1280×720)
1080P (1920X1080)
ANDROID 中顯示像素問題
為了適應不同分辨率,不同的像素密度,推薦使用dip/dp, 文字使用sp。
px (pixels)像素 就是分辨率
一般HVGA代表320x480像素。該單位不常用. 機頂盒開發可能用.。
px 當界面小分辨率小,控件按鈕占的父窗體界面就多,
當界面 分辨率大,控件按鈕占的父窗體界面就小,
dip或dp (device independent pixels)設備獨立像素
這個和設備硬件有關,一般為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
使用dp 像素單位,控件隨著界面的大小(分辨率)變化,而自動變化控件大小,但自生的大小不變..占得權重不變。
sp (scaled pixels — best for text size)比例像素,用于字體
主要處理字體的大小,可以根據用戶系統的字體自適應。
除了上面三個顯示單位,下面還有幾個不太常用:
in (inches)英寸
mm (millimeters)毫米
pt (points)點,1/72英寸
為了適應不同分辨率,不同的像素密度,推薦使用dip/dp,文字使用sp。
點擊事件的幾種寫法
內部類實現onclickListener的接口
class MainActivity extends Activity implements OnClickListener匿名內部類實現onclickListener接口,重寫接口的vid OnClick(view v)點擊事件方法
- 讓當前的Activity實現onclickListener的接口
界面的按鈕比較多,就要建立很多個內部類對象(對應一個按鈕控件),麻煩。
如果通過內部類或者匿名內部類代碼比較臃腫。
-
在配置文件里布局xml文件里面聲明 onclick屬性 ="方法名"
方法一:使用匿名內部類實現點擊事件,對于多個按鈕的點擊事件比較臃腫
public class MainActivity extends Activity {
private Button bt_01;
private Button bt_02;
private Button bt_03;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取 按鈕01的對象
Button bt_01=(Button) findViewById(R.id.bt_01);
//為按鈕01設置點擊事件 //調用 View setOnClickListener(OnClickListener l); l 是個接口
//使用接口的匿名內部類
bt_01.setOnClickListener( new OnClickListener(){
public void onClick(View v) { Toast.makeText(MainActivity.this, "按鈕01被點擊啦", 0).show();}});
//獲取 按鈕02的對象
Button bt_02=(Button) findViewById(R.id.bt_02);
bt_02.setOnClickListener(new OnClickListener() {
public void onClick(View v) { Toast.makeText(MainActivity.this, "按鈕02被點擊啦", 0).show();}});
//獲取 按鈕03的對象
Button bt_03=(Button) findViewById(R.id.bt_03);
bt_03.setOnClickListener(new OnClickListener() {
public void onClick(View v) { Toast.makeText(MainActivity.this, "按鈕03被點擊啦", 0).show(); }});
}
}