Android簡介
1.手機作業系統
在早期的手機內部是沒有智能作業系統的,所有的軟體都是由手機生產商在設計時所定制的,因此手機在設計完成后基本是沒有擴展功能的,后期的手機為了提高手機的可擴展性,使用了專為移動設備開發的作業系統,使用者可以根據需要安裝不同型別的軟體,作業系統對于手機的硬體配置要求較高,所產生的硬體成本和作業系統成本使手機的售價明顯高于不使用作業系統的手機,
手機上的主要作業系統:Android,IOS,Windows Phone 8,黑莓,Linux,
2.Android起源
開放手機聯盟(Open Handset Alliance,OHA)由谷歌公司于2007年發起的一個全球性的聯盟組織,成立時包含34家聯盟成員,現在已經增加到82家,
2007年11月12日,谷歌發布Android SDK預覽版 ,這是第一個對外公布的Android SDK,為發布正式版收集用戶反饋,
2008年4月17日,谷歌舉辦總共1000萬美金的Android開發者競賽,獎勵最有創意的Android程式開發者:cab4me(出租車呼叫)、BioWallet(生物特征識別)和CompareEverywhere(實時商品查詢),

2008年8月28日,谷歌開通Android Market,供Android手機下載需要使用的應用程式,
2008年9月23日,發布Android SDK v1.0版,這是第一個穩定的SDK版本,
2008年10月21日,谷歌公布Android平臺的源代碼,
3.Android的特征
在記憶體和行程管理方面,Android具有自己的運行時和虛擬機:
(1)Android為了保證高優先級行程運行和正在與用戶互動行程的回應速度,允許停止或終止正在運行的低優先級行程,以釋放被占用的系統資源,
(2)Android行程的優先級并不是固定的,而是根據行程是否在前臺或是否與用戶互動而不斷變化的,
(3)Android為組件定義了生命周期,并統一進行管理和控制,
在界面設計上,提供了豐富的界面控制元件:
(1)加快了用戶界面的開發速度,保證了Android平臺上的程式界面的一致性,
(2)Android將界面設計與程式邏輯分離,使用XML檔案對界面布局進行描述,有利于界面的修改和維護,
Android提供輕量級的行程間通訊機制Intent,使用跨行程組件通信和發送系統級廣播成為可能,
Android支持高效、快速的資料存盤方式:
SharedPreferences、
檔案存盤
輕量級關系資料庫SQLite
Android體系結構
1、Linux內核
2、中間件層
3、程式框架層
4、應用程式層
Linux內核:
(1)硬體和其他軟體堆層之間的一個抽象隔離層,
(2)提供安全機制,記憶體管理,行程管理,網路協議堆疊和驅動程式,
中間件層:
(1)由函式庫和Android運行時構成,
(2)Android運行時,核心庫,提供Android系統的特有函式功能和Java語言函式功能,
(3)ART虛擬機,采用預編譯技術,在應用程式安裝時把程式代碼轉換成機器語言,加快了啟動速度,并且使用應用程式的運行速度更快、電量消耗更少,系統也更加流暢,
應用程式框架層:
(1)提供Android平臺基本的管理功能和組件重用機制,
應用程式層:
(1)提供一系列的核心應用程式,
(2)包括電子郵件客戶端,瀏覽器,通訊錄和日歷等,
Android程式結構
子目錄,庫和工程檔案
(1)根目錄下包含5個子目錄src、gen、assets、bin和res,
(2)2個庫檔案android.jar、android-support-v4.jar,
(3)3個工程檔案Androidmanifest.xml、project.properties和proguard.cfg,
src目錄是源代碼目錄,所有允許用戶修改的java檔案和用戶自己添加的java檔案都保存在這個目錄中 ,
gen目錄用來保存ADT自動生成的java檔案,
assets目錄用來存放原始格式的檔案,
bin目錄保存了編譯程序中的所產生的檔案,以及最終生產的apk檔案,
res目錄是資源目錄,Android程式所有的影像、顏色、風格、主題、界面布局和字串等資源都保存在其下的幾個子目錄中,
(1)其中,drawable-hdpi、drawable-mdpi和drawable-ldpi目錄用來保存同一個程式中針對不同螢屏尺寸需要顯示的不同大小的影像檔案,
(2)layout目錄用來保存與用戶界面相關的布局檔案,
(3)values目錄保存顏色、風格、主題和字串等資源,
activity_main.xml檔案:
activity_main.xml檔案是界面布局檔案,利用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: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="edu.hrbeu.helloandroid.MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
Android組件
Activity組件
Android程式的呈現層,顯示可視化的用戶界面,并接受與用戶互動所產生的界面事件,
Android應用程式可以包含一個或多個Activity,一般需要指定一個程式啟動時顯示的Activity,
Service組件
Service一般用于沒有用戶界面,但需要長時間在后臺運行的應用,
可公開Service的程式介面,供其他行程呼叫,
BroadcastReceiver
用來接收廣播訊息的組件,不包含任何用戶界面,
可以啟動Activity或者Notification通知用戶接收到重要資訊,
ContentProvider
是Android系統提供的一種標準的共享資料的機制,其他程式通過ContentProvider訪問程式的私有資料 ,
Android系統內部提供一些內置的ContentProvider,能夠為應用程式提供重要的資料資訊,
程式生命周期

前臺行程是Android系統中最重要的行程,
可見行程指部分程式界面能夠被用戶看見,卻不在前臺與用戶互動,不回應界面事件的行程,
如果一個行程包含Service,且這個Service正在被用戶可見的Activity呼叫,此行程同樣被視為可見行程,
服務行程包含已啟動服務的行程,Android系統除非不能保證前臺行程或可視行程所必要的資源,否則不強行清除服務行程,
后臺行程指不包含任何已經啟動的服務,而且沒有任何用戶可見的Activity的行程,Android系統中一般存在數量較多的后臺行程,
空行程是不包含任何活躍組件的行程,
程式生命周期
行程的優先級取決于所有組件中的優先級最高的部分,
行程的優先級會根據與其他行程的依賴關系而變化,
組件生命周期
所有Android組件都具有自己的生命周期,是從組件建立到組件銷毀的整個程序,
在生命周期中,組件會在可見、不可見、活動、非活動等狀態中不斷變化,
Activity生命周期
Activity生命周期指Activity從啟動到銷毀的程序,
Activity表現為四種狀態:
(1)活動狀態,Activity在用戶界面中處于最上層,完全能被用戶看到,能夠與用戶進行互動,
(2)暫停狀態,Activity在界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進行互動,
(3)停止狀態,Activity在界面上完全不能被用戶看到,也就是說這個Activity被其他Activity全部遮擋,
(4)非活動狀態,不在以上三種狀態中的Activity則處于非活動狀態,

Activity堆疊
遵循“后進先出”的規則:

隨著Activity自身狀態的變化,Android系統會呼叫不同的事件回呼函式,
Activity生命周期的事件回呼函式

Activity事件回呼函式的呼叫順序

Activity生命周期分類
Activity的生命周期可分為全生命周期、可視生命周期和活動生命周期,
每種生命周期中包含不同的事件回呼函式,
全生命周期
全生命周期是從Activity建立到銷毀的全部程序,始于onCreate(),結束于onDestroy(),
使用者通常在onCreate()中初始化Activity所能使用的全域資源和狀態,并在onDestroy()中釋放這些資源,
在一些極端的情況下,Android系統會不呼叫onDestroy()函式,而直接終止行程,
可視生命周期
可視生命周期是Activity在界面上從可見到不可見的程序,開始于onStart(),結束于onStop(),
onStart():一般用來初始化或啟動與更新界面相關的資源,
onStop():一般用來暫停或停止一切與更新用戶界面相關的執行緒、計時器和服務,
onRestart():函式在onSart()前被呼叫,用來在Activity從不可見變為可見的程序中,進行一些特定的處理程序,
onStart()和onStop()會被多次呼叫,
活動生命周期
活動生命周期是Activity在螢屏的最上層,并能夠與用戶互動的階段,開始于onResume(),結束于onPause(),
在Activity的狀態變換程序中onResume()和onPause()經常被呼叫,因此這兩個函式中應使用更為簡單、高效的代碼,
public class MainActivity extends AppCompatActivity {
private static String TAG="LIFECYCLE";
//完全生命周期開始時被呼叫,初始化Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"(1)onCreate()");
}
//可視生命周期開始時被呼叫,對用戶界面進行必要的更改
@Override
public void onStart(){
super.onStart();
Log.i(TAG, "(2) onStart()");
}
//在onStart()后被呼叫,用于恢復onSaveInstanceState()保存的用戶界面資訊
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "(3) onRestoreInstanceState()");
}
//在活動生命周期開始時被呼叫,恢復被onPause()停止的用于界面更新的資源
@Override
public void onResume() {
super.onResume();
Log.i(TAG, "(4) onResume()");
}
// 在onResume()后被呼叫,保存界面資訊
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG, "(5) onSaveInstanceState()");
}
//在重新進入可視生命周期前被呼叫,載入界面所需要的更改資訊
@Override
public void onRestart() {
super.onRestart();
Log.i(TAG, "(6) onRestart()");
}
//在活動生命周期結束時被呼叫,用來保存持久的資料或釋放占用的資源
@Override
public void onPause() {
super.onPause();
Log.i(TAG, "(7) onPause()");
}
//在可視生命周期結束時被呼叫,一般用來保存持久的資料或釋放占用的資源
@Override
public void onStop() {
super.onStop();
Log.i(TAG, "(8) onStop()");
}
//在完全生命周期結束時被呼叫,釋放資源,包括執行緒、資料連接等
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "(9) onDestroy()");
}
}
上面的程式主要通過在生命周期函式中添加“日志點”的方法進行除錯,程式的運行結果將會顯示在LogCat中
為了顯示結果易于觀察和分析,在LogCat設定過濾器LifeCycleFilter,過濾方法選擇by Log Tag,過濾關鍵字為LIFTCYCLE
全生命周期:
(1)onCreate → (2)onStart → (4)onResume →(7)onPause → (8)onStop → (9)onDestroy
可視生命周期:
(1)onCreate → (2)onStart → (4)onResume → (7)onPause → (5)onSaveInstanceState → (8)onStop → (6)onRestart → (2)onStart → (4)onResume
Android用戶界面
Android用戶界面框架
MVC模型:控制器(處理用戶輸入),視圖(顯示用戶界面和影像),模型(保存資料和代碼)

Android用戶界面框架采用視圖樹(View Tree)模型

View是最基本的可視單元存盤了螢屏上特定矩形區域內所顯示內容的資料結構,實作所占據區域的界面繪制、焦點變化、用戶輸入和界面事件處理等,一個重要的基類,所有在界面上的可見元素都是View的子類,ViewGroup是一種能夠承載含多個View的顯示單元,
常見的系統控制元件
TextView和EditText
首先是在xml中配置控制元件,大佬一般是手寫xml,但是對于我這種小白還是喜歡用design模式,然后再對xml代碼做適當的修改,
TextView是一種用于顯示字串的控制元件,
EditText則是用來輸入和編輯字串的控制元件,
<TextView
android:id="@+id/textView"
android:layout_width="108dp"
android:layout_height="22dp"
android:text="TextView"
app:layout_constraintBottom_toTopOf="@+id/editTextTextPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.052"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.848"
tools:ignore="MissingConstraints" />
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.079"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.223"
tools:ignore="MissingConstraints" />
效果:

Button和ImageButton
(1)Button是一種按鈕控制元件,用戶能夠在該控制元件上點擊,并后引發相應的事件處理函式.
(2)ImageButton用以實作能夠顯示影像功能的控制元件按鈕.
xml檔案

mainactivity檔案
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創建一個Button類按鈕
Button button=(Button)findViewById(R.id.button);
//創建一個ImageButton類的按鈕
ImageButton imageButton=(ImageButton)findViewById(R.id.imageButton);
//創建一個edittext變數通過id關聯到EditText控制元件
EditText editText=(EditText) findViewById(R.id.editTextTextPersonName);
//點擊確認按鈕輸出值
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string=editText.getText().toString();
Toast.makeText(MainActivity.this, "你的名字是"+string, Toast.LENGTH_SHORT).show();
}
});
//設定監聽點擊按鈕以后更換按鈕圖片
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imageButton.setImageResource(R.drawable.download);
}
});
效果
點擊前:

點擊后:

Checkbox和RadioButton
xml檔案:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
app:layout_constraintBottom_toTopOf="@+id/checkBox2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.078"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.917" />
<CheckBox
android:id="@+id/checkBox2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.078"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.247" />
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="不喜歡" />
<RadioButton
android:id="@+id/radioButton"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="喜歡" />
</LinearLayout>
mainactivity檔案
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private CheckBox checkBox,checkBox2;
private RadioButton radioButton,radioButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkBox=(CheckBox) findViewById(R.id.checkBox);
checkBox2=(CheckBox) findViewById(R.id.checkBox2);
radioButton=(RadioButton)findViewById(R.id.radioButton);
radioButton2=(RadioButton)findViewById(R.id.radioButton2);
checkBox.setOnClickListener(this);
checkBox.setTag(1);
checkBox2.setOnClickListener(this);
checkBox2.setTag(2);
radioButton.setOnClickListener(this);
radioButton.setTag(3);
radioButton2.setOnClickListener(this);
radioButton2.setTag(4);
}
@Override
public void onClick(View v) {
int m=(Integer) v.getTag();
switch (m){
case 1:
Toast.makeText(MainActivity.this, "你是男生", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this, "你是女生", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(MainActivity.this, "你喜歡這個布局", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(MainActivity.this, "你不喜歡這個布局", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
效果

Spinner
一種能夠從多個選項中選一選項的控制元件,使用浮動選單為用戶提供選擇,
xml檔案
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="109dp"
android:layout_weight="1" />
mainactivity檔案
Spinner spinner=(Spinner)findViewById(R.id.spinner);
List<String> list=new ArrayList<String>();
list.add("添加");
list.add("洗掉");
list.add("修改");
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
效果

ListView
ListView是一種用于垂直顯示的串列控制元件,如果顯示內容過多,則會出現垂直滾動條,
xml檔案
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
mainactivity檔案
ListView listView=(ListView) findViewById(R.id.listview);
List<String>list1=new ArrayList<String>();
list1.add("第一項");
list1.add("第二項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
list1.add("第三項");
ArrayAdapter<String>adapter1=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list1);
listView.setAdapter(adapter1);
效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/357153.html
標籤:其他
上一篇:Android---仿QQ空間動態九宮格圖片預覽(二)
下一篇:Android開發基礎學習
