Android 基本原理&移動終端軟件開發課程&StudyAccount7 2018.10.30

一、 Activity

1.Activity生命週期:
所有的Android組件都有它自己的生命週期,表示從這一組件的創建到銷燬的整個過程。
在這一過程中,組件會在活動、非活動以及可見或不可見等狀態中不斷切換。
Activity一般處於4種狀態:
Running、Paused、Stop、Killed
(運行、暫停、停止、銷燬)
Activity 狀態轉換圖

  • 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>
  1. action>子元素
    一個intent-filter>中可以添加多個action>子元素。
    intent-filter>列表中的Action屬性不能爲空,否則所有的Intent都會因匹配失敗而被阻塞。所以一個intent-filter>元素下至少需要包含一個action>子元素,這樣系統才能處理Intent消息。
  2. category>子元素
    一個intent-filter>中也可以添加多個category>子元素,類似Action
    與Action一樣,intent-filter>列表中的Category屬性不能爲空。Category屬性的默認值"android.intent.category.DEFAULT"是啓動Activity的默認值,在添加其他Category屬性值時,該值必須添加,否則也會匹配失敗。
  3. 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章