- Android系統架構(重點)
第一層:應用層Application
第二層:應用框架層Application Framework
第三層:Android底層類庫層 Libraries、Dalvik虛擬機
第四層:linux內核層 linux kernel
Android是運行在Linux內核基礎之上的。Google官方上提供了一張Android系統架構圖(四層)。
- 兩種虛擬機的不同 (重點)
1、架構不同:JVM使用棧架構;Dalvik使用的是寄存器,數據是加載到CUP的寄存器上的。
2、JVM加載的.class文件,Dalvik加載的是.dex文件,對內存的分配情況做了優化。
3、jvm: sun oracle dvm: Google
- Android工程的目錄結構(這些目錄結構是eclipse下的目錄結構,Android studio中的目錄結構不一樣)
src/ java源代碼存放目錄
gen/ 自動生成目錄
gen 目錄中存放所有由Android開發工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件由Android開發工具自動產生的。Android開發工具會自動根據你放入res目錄的資源,同步更新修改R.java文件。正因為R.java文件是由開發工具自動生成的,所以我們應避免手工修改R.java。R.java在應用中起到了字典的作用,它包含了各種資源的id,通過R.java,應用可以很方便地找到對應資源。另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進軟件中,這樣可以減少應用在手機占用的空間。
res/ 資源(Resource)目錄
在這個目錄中我們可以存放應用使用到的各種資源,如xml界面文件,圖片或數據。
libs/ 支持庫目錄
程序開發時需要的一些三方的jar包可以放在這個目錄,系統會自動把里面的jar包,添加到環境變量。
assets資源目錄
Android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而且/assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑,如:file://android_asset/xxx.3gp
AndroidManifest.xml 項目清單文件(Android studio中的四大組件不用手動配置,會自動生成)
這個文件列出了應用程序所提供的功能,以后你開發好的各種組件需要在該文件中進行配置,如果應用使用到了系統內置的應用(如電話服務、互聯網服務、短信服務、GPS服務等等),你還需在該文件中聲明使用權限。
project.properties 項目環境信息,一般是不需要修改此文件
- ADB命令
— 常見命令:
adb devices 列出所有的設備
adb shell 掛載到linux的空間 可以執行linux指令
adb install xxx.apk 如果有多個設備,我們可以指定設備 adb install –s emulator-5554 D:/xxx.apk
adb push 把文件推到手機里
adb pull 把文件從手機里拉出來
ctrl + F11 橫豎屏的切換
- 電話撥號器(重點)
開發項目的步驟:
1、理解需求,弄明白需求后在寫代碼;
2、在Android工程中設計UI界面;
3、代碼實現業務邏輯;
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_main" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 > 8 9 <Button 10 android:text="撥打電話" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:layout_alignParentBottom="true" 14 android:layout_centerHorizontal="true" 15 android:layout_marginBottom="179dp" 16 android:id="@+id/bt_call" /> 17 18 <EditText 19 android:hint="請輸入電話號碼" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_marginBottom="53dp" 23 android:id="@+id/et_phone" 24 android:layout_above="@+id/bt_call" 25 android:layout_centerHorizontal="true" /> 26 </RelativeLayout>
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //獲取輸入的電話號碼 25 String phone = et_phone.getText().toString().trim(); 26 //創建打電話的意圖 27 Intent intent = new Intent(); 28 //設置撥打電話的動作 29 intent.setAction(Intent.ACTION_CALL); 30 //設置撥打電話的號碼 31 intent.setData(Uri.parse("tel:" + phone)); 32 //開啟打電話的意圖 33 startActivity(intent); 34 } 35 }); 36 } 37 }
1 <uses-permission android:name="android.permission.CALL_PHONE"/>
注:這里撥打電話ACTION_CALL,在API22(Android5.1)上能正常運行。但是在高版本的API,例如API25(Android7.0)中,已經添加權限了,但是還是會報權限的錯誤!
- 點擊事件的四種創建方式
(1)采用內部類MyOnClickListener的方式去實現OnClickListener接口
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 /* bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //獲取輸入的電話號碼 25 String phone = et_phone.getText().toString().trim(); 26 //創建打電話的意圖 27 Intent intent = new Intent(); 28 //設置撥打電話的動作 29 intent.setAction(Intent.ACTION_CALL); 30 //設置撥打電話的號碼 31 intent.setData(Uri.parse("tel:" + phone)); 32 //開啟打電話的意圖 33 startActivity(intent); 34 } 35 });*/ 36 class MyOnClickListener implements View.OnClickListener{ 37 38 @Override 39 public void onClick(View v) { 40 //獲取輸入的電話號碼 41 String phone = et_phone.getText().toString().trim(); 42 //創建打電話的意圖 43 Intent intent = new Intent(); 44 //設置撥打電話的動作 45 intent.setAction(Intent.ACTION_CALL); 46 //設置撥打電話的號碼 47 intent.setData(Uri.parse("tel:" + phone)); 48 //開啟打電話的意圖 49 startActivity(intent); 50 } 51 } 52 bt_call.setOnClickListener(new MyOnClickListener()); 53 } 54 }
(2)匿名內部類
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //獲取輸入的電話號碼 25 String phone = et_phone.getText().toString().trim(); 26 //創建打電話的意圖 27 Intent intent = new Intent(); 28 //設置撥打電話的動作 29 intent.setAction(Intent.ACTION_CALL); 30 //設置撥打電話的號碼 31 intent.setData(Uri.parse("tel:" + phone)); 32 //開啟打電話的意圖 33 startActivity(intent); 34 } 35 }); 36 } 37 }
(3)當前類imp OnClickListener接口
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(this); 22 23 /* bt_call.setOnClickListener(new View.OnClickListener() { 24 @Override 25 public void onClick(View v) { 26 //獲取輸入的電話號碼 27 String phone = et_phone.getText().toString().trim(); 28 //創建打電話的意圖 29 Intent intent = new Intent(); 30 //設置撥打電話的動作 31 intent.setAction(Intent.ACTION_CALL); 32 //設置撥打電話的號碼 33 intent.setData(Uri.parse("tel:" + phone)); 34 //開啟打電話的意圖 35 startActivity(intent); 36 } 37 });*/ 38 /* class MyOnClickListener implements View.OnClickListener{ 39 40 @Override 41 public void onClick(View v) { 42 //獲取輸入的電話號碼 43 String phone = et_phone.getText().toString().trim(); 44 //創建打電話的意圖 45 Intent intent = new Intent(); 46 //設置撥打電話的動作 47 intent.setAction(Intent.ACTION_CALL); 48 //設置撥打電話的號碼 49 intent.setData(Uri.parse("tel:" + phone)); 50 //開啟打電話的意圖 51 startActivity(intent); 52 } 53 } 54 bt_call.setOnClickListener(new MyOnClickListener());*/ 55 } 56 @Override 57 public void onClick(View v) { 58 //獲取輸入的電話號碼 59 String phone = et_phone.getText().toString().trim(); 60 //創建打電話的意圖 61 Intent intent = new Intent(); 62 //設置撥打電話的動作 63 intent.setAction(Intent.ACTION_CALL); 64 //設置撥打電話的號碼 65 intent.setData(Uri.parse("tel:" + phone)); 66 //開啟打電話的意圖 67 startActivity(intent); 68 } 69 70 }
(4)onclick
1 <Button 2 android:text="撥打電話" 3 android:onClick="onclick" 4 android:layout_width="wrap_content" 5 android:layout_height="wrap_content" 6 android:layout_alignParentBottom="true" 7 android:layout_centerHorizontal="true" 8 android:layout_marginBottom="179dp" 9 android:id="@+id/bt_call" />
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 et_phone = (EditText) findViewById(R.id.et_phone); 18 } 19 public void onclick(View v) { 20 //獲取輸入的電話號碼 21 String phone = et_phone.getText().toString().trim(); 22 //創建打電話的意圖 23 Intent intent = new Intent(); 24 //設置撥打電話的動作 25 intent.setAction(Intent.ACTION_CALL); 26 //設置撥打電話的號碼 27 intent.setData(Uri.parse("tel:" + phone)); 28 //開啟打電話的意圖 29 startActivity(intent); 30 } 31 }
- 五種布局
1. 線性布局LinearLayout(重點) 分水平和垂直2種
2. 相對布局RelativeLayout:各個組件都是按照相對位置來擺放。
3. 幀布局FrameLayout: 一層一層繪制
4. 表格布局TableLayout
5. 絕對布局AbsoluteLayout 已經被谷歌廢棄
在實際的開發工作中線性布局和相對布局用的比較多,大多數的項目中都是各種不同布局的相互嵌套使用。