一、 Activity
1.Activity生命週期:
所有的Android組件都有它自己的生命週期,表示從這一組件的創建到銷燬的整個過程。
在這一過程中,組件會在活動、非活動以及可見或不可見等狀態中不斷切換。
Activity一般處於4種狀態:
Running、Paused、Stop、Killed
(運行、暫停、停止、銷燬)
- Active/Running
Activity處於屏幕的最前端,用戶完全可以看得到,並且可以與用戶進行交互。
對於Activity棧來說,它處於棧頂;(一次只有一個) - Paused
Activity在屏幕上仍然可見,但是它已經失去了焦點,用戶不能與之進行交互。
暫停狀態的Activity是存活的,仍然維持着其內部狀態和信息,但是系統可能會在手機內存極低的情況下殺掉該Activity; - Stop
Activity在屏幕上完全不能被用戶看見。
處於停止狀態的Activity,系統仍然保留有其內部狀態和成員信息,但是它經常會由於手機系統內存被徵用而被系統殺死回收; - Killed
Activity被系統殺死回收或者未啓動。
2.Activity生命週期的回調函數:
onCreate(): 只在活動第一次被創建時被調用
onStart(): 當活動由不可見變爲可見時被調用
onResume(): 在活動準備好與用戶進行交互時調用
onPause(): 系統準備去啓動或恢復另一個活動時調用onStop(): 在活動完全不可見時被調用
onDestroy(): 活動被銷燬前調用
onRestart(): 活動由停止狀態變爲運行狀態前調用 - 完整生存期:
從onCreate()方法到onDestroy()方法 - 可見生存期:
從onStart()方法到onStop()方法 - 前臺生存期:
從onResume()方法到onPause()方法
小結:
創建→運行 onCreate()–>onStart–>onResume();
運行→停止 onPause()—>onStop();
停止→運行 onRestart()–>onStart()—>onResume();
運行→暫停 onPause();
暫停→運行 onResume();
停止→銷燬 onDestory()
二、Intent(協助應用間的交互與通訊)
- Intent負責對操作的動作、動作涉及數據、附加數據進行描述,根據此Intent的描述找到對應的組件,將 Intent傳遞給調用的組件,完成組件的調用。
- Intent不僅可用於應用程序之間,也可用於Activity/Service之間的交互。
1.Intent屬性: - Action屬性
用於描述Intent要完成的動作,對要執行的動作進行一個簡要描述。 - Data屬性
執行動作的Uri(Uniform Resource Identifier)和MIME(Multipurpose Internet Mail Extensions)類型 - Category屬性
指明一個執行Action的分類,Intent中定義了一系列Category屬性常量 - Extra屬性
通過使用Intent對象的putExtra()方法來添加附加信息。
Intent intent=new Intent();
intent.putExtra("name","zhangsan");
通過使用Intent對象的getXXXExtra()方法可以獲取附加信息。
例如,將上面代碼存入Intent對象中的人名獲取出來,因存入的是字符串,所以可以使用getStringExtra()方法獲取數據,
String name=intent.getStringExtra("name");
2.Intent解析:
2.1 直接(顯式)Intent
已經知道要啓動的組件名稱,通過直接指定組件來實現
常用方法有setComponent()、setClassName()或setClass()
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
2.2 間接(隱式)Intent
不知道要啓動的組件名稱,只知道一個Intent動作要執行,比如:拍照,錄像。
通過Intent Filter過濾實現,根據Action、Data和Category屬性進行匹配查找。
Intent過濾
- 通過IntentFilter類生成;
- 通過在配置文件AndroidManifest.xml中定義intent-filter>元素生成。
<activity android:name="com.example.admin.activitylifedemo.Activity1">
<intent-filter>//註冊
<action android:name="android.intent.action.MAIN" />//應用程序入口
<category android:name="android.intent.category.LAUNCHER" />//該活動優先級最高
</intent-filter>
</activity>
- action>子元素
一個intent-filter>中可以添加多個action>子元素。
intent-filter>列表中的Action屬性不能爲空,否則所有的Intent都會因匹配失敗而被阻塞。所以一個intent-filter>元素下至少需要包含一個action>子元素,這樣系統才能處理Intent消息。 - category>子元素
一個intent-filter>中也可以添加多個category>子元素,類似Action
與Action一樣,intent-filter>列表中的Category屬性不能爲空。Category屬性的默認值"android.intent.category.DEFAULT"是啓動Activity的默認值,在添加其他Category屬性值時,該值必須添加,否則也會匹配失敗。 - data>子元素
一箇中可以包含多個子元素,用於指定組件可以執行的數據
三、Activity跳轉(四大組件都通過Intent來解析進行跳轉)
在使用Intent進行Activity之間的跳轉時,我們通常有三種Intent跳轉方式,即:
1.不帶參數的跳轉
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
startActivity(intent);
2.帶參數的跳轉
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("Name","Kate");
bundle.putString("Age","25");
intent.putExtras(bundle);
intent.setClass(Activity1.this,Activity2.class);
startActivity(intent);
Activity1跳轉到Activity2之後,Activity2通過Bundle獲取Intent傳過來的值
Bundle bundle=this.getIntent().getExtras();
String name=bundle.getString("Name");
String age=bundle.getString("Age");
3.帶返回值的跳轉
第一個頁面傳送返回值:
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("參數","參數值");
intent.putExtra(bundle);
this.startActivityForResult(intent,0);
startActivityForResult(Intent intent,Int requestCode)
中requestCode用於識別第二個頁面傳回來的值
第二個頁面:
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("參數","參數值");
intent.putExtra(bundle);
intent.setClass(Activity2.this,Activity1.class);
setResult(RESULT_OK,intent);
finish();
第一個頁面接收返回值:
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch (requestCode){//Activity1的請求標識
//resultCode爲回傳的標記,在Activity2中使用的是RESULT_OK,所以此處選擇case 0
if(resultCode==RESULT_OK){
Bundle b=data.getExtras();
String str=b.getString("參數");
}
break;
default:
break;
}
}