Android基礎第一天

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=========480
800
4.7------WXGA-------1280*720

十 DDMS

  1. dalvik debug manager system:delvik調試管理系統
    |--Devices 顯示當前電腦所連接的所有android設備
    顯示 android設備運行的進程
    |--Debug小蜘蛛 用來調試程序用的
    |--Start Method Profiling 開始方法的分析 分析某個操作,某個方法的性能
    |--Stop Process 停止進程,可以結束一個應用進程,殺死應用,清理緩存。
    |--Screen Capture 屏幕捕獲,可以給連接上的設備截屏。

  2. File Explorer:文件系統 列出當前設備所有目錄。
    dataapp: 自己安裝的應用程序apk文件存放的目錄,
    |-- data-data:應用的私有目錄,系統每安裝一個新的應用程序,都會在此目錄創建該應用包名的文件,用來存放該應用的私有數據,當應用卸載時,該包名的文件夾也會被刪除。
    |--mnt-sdcard:SD卡目錄
    |--system-->app:系統應用程序apk文件存放的目錄
    十一:
    部署運行的三種方式:

    1. 右擊工程 run as
    2. 工具欄的按鈕
    3. 快捷鍵: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 包

  1. build-tools 編譯需要用到的所有工具,把開發的程序裝進手機

  2. docs 開發的離線文檔

  3. extras 額外工具,模擬器加速器,向下兼容的jar包
    ---android/ support:存儲的是goole開發的新特性jar包
    -----intel /...Mannger(硬件加速管理器)/IntelHaxm.exe 提高電腦inter的運行速度(i3以后處理器)

  4. platforms 開發需要的版本平臺,每個平臺的android.jar在對應的文件夾里面

  5. platform-tools 開發調試的工具
    ----adb.exe 一個重要的調試橋(連接pc機與手機模擬器)

  6. sources 存儲android.jar的源碼 goole工程師開發的源代碼存于此

  7. system-images 存儲各個不同版本模擬器創建需要的鏡像

  8. 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 顯示手機的各個軟件的進程和路徑

  1. 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應用的目錄結構(左邊)

  1. src文件夾,java源代碼
    onCreate()界面被 開啟調用該方法

      //設置應用程序顯示的ui
     setContentView(R.layout.activity_main);
    
  2. gen目錄
    自動生成的文件夾 ,里面保存的是res資源文件的引用

  3. android4.1.2 代表的是引用的android.jar包

  4. libs文件夾
    代碼的三方jar包。會自動的被添加到android.dependencies目錄下
    如何把jar包添加進libs里去

  5. android dependencies 開發依賴的jar包

  6. bin
    編譯生成的臨時文件和二進制文件和上傳到虛擬機的apk文件都在bin里。會自動生成的

  7. res目錄

    • drawable-ldpi 運用程序的自身使用的圖片。 low 低分辨率 小圖
    • drawable-mdpi middle 中等分辨率
    • drawable-hdpi high高分辨率
    • drawable-xhdpi x加大高分辨率
    • drawable-xxhdpi 加大再加大的分辨率
    • layout 用xml文件編寫的布局
    • menu 菜單文件夾
      -values 里有個string.xml文件,代表程序的字符串資源,打開可以修改代碼內容
  8. AndroidManifest.xml

清單文件,配置應用程序的版本,圖標,名稱等重要信息。


android應用程序開發的步驟

1.設置空間布局 res-->layout文件夾 修改xml布局文件(即修改UI的文檔代碼),修改按鈕

  1. src目錄 -->編寫MainActivity.java文件的代碼
  2. 找到關心的控件,我就要添加什么控件
    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"));

  1. 記得添加權限。 涉及隱私 注冊撥打電話權限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常見布局

  1. 線性布局 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"
/>

  1. 相對布局 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>


  1. 幀布局 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>

  1. 表格布局 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>

  1. 絕對布局 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。

點擊事件的幾種寫法

  1. 內部類實現onclickListener的接口
    class MainActivity extends Activity implements OnClickListener

  2. 匿名內部類實現onclickListener接口,重寫接口的vid OnClick(view v)點擊事件方法

  1. 讓當前的Activity實現onclickListener的接口

界面的按鈕比較多,就要建立很多個內部類對象(對應一個按鈕控件),麻煩。
如果通過內部類或者匿名內部類代碼比較臃腫。

  1. 在配置文件里布局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(); }});
            
  }

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容