Android Activity

來源:互聯網
上載者:User

一 Activity簡介

Activity是Context的子類

Activity是四大組件之一 用來顯示控制項和使用者互動 

Activity是一個版面配置容器

Activity如果5s內沒有響應 就會導致一個異常 ANR(application not response)

 

二 建立一個Activity

1. 直接或者間接繼承Activity

2. AndroidManifest.xml application節點裡面配置activity name屬性必須配置 其餘可選

 

三 意圖啟用新的Activity

顯式意圖

用於啟用本應用的另一個Activity

startActivity(new Intent(context, OtherActivity.class));

隱式意圖

多用於啟用其它應用的Activity 可以匹配多個應用

原則: 完全符合對方暴露的intent-filter(action category data)

// 系統撥號盤startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:18627777777")));

  

四 意圖資料的傳遞

基礎資料型別 (Elementary Data Type)

// 傳遞Intent intent = new Intent(context, OtherActivity.class);intent.putExtra("name", "小白");intent.putExtra("age", 15);startActivity(intent);// 取值Intent intent = getIntent();String name = intent.getStringExtra("name");int age = intent.getIntExtra("age", 0);

對象資料類型

必須讓類去實現Parcelable介面或者Serializable介面

推薦使用Parcelable介面 因為消耗資源少 Serializable是Java的序列化介面 在Android裡面比較消耗資源

// 傳遞Intent intent = new Intent(context, OtherActivity.class);intent.putExtra("user", new User("小白", 15));startActivity(intent);// 取值Intent intent = getIntent();User user = intent.getParcelableExtra("user");

 

五 開啟一個Activity關閉後返回資料

 

六 Activity生命週期

 

七 Activity被系統回收後臨時資料的儲存

當系統去主動殺死應用程式的時候 是需要對臨時資料進行儲存的

public class MainActivity extends AppCompatActivity {    /** 第一種恢複方式 **/    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 只有被系統殺死過 savedInstanceState才有資料        if (null != savedInstanceState) {            int page = savedInstanceState.getInt("page");            Log.i("HUANG", "onCreate page=" + page);        }    }    /** 儲存 **/    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        // 當系統去主動殺死應用程式的時候 onPause()之後調用        outState.putInt("page", 100);    }        /** 第二種恢複方式 **/    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        // 只有被系統殺死過才會在onStart()之後調用        int page = savedInstanceState.getInt("page");        Log.i("HUANG", "onRestoreInstanceState page=" + page);    }}

 

八 橫豎屏切換的生命週期與相關方法

豎屏 -> 橫屏

Activity先殺死 再建立

橫豎 -> 豎屏

Activity先殺死 再建立

配置橫豎屏切換Activity不殺死 只做介面的改變

橫豎屏切換的監聽

public class MainActivity extends AppCompatActivity {    @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        // 必須配置橫豎屏切換Activity不殺死 切換時才會調用        switch (newConfig.orientation) {            case Configuration.ORIENTATION_LANDSCAPE:                Log.i("HUANG", "橫屏");                break;            case Configuration.ORIENTATION_PORTRAIT:                Log.i("HUANG", "豎屏");                break;        }    }}

 我開發中螢幕方向的處理

 

九 任務棧

任務棧: 用來記錄使用者的操作行為

棧: 先進後出

進棧(壓棧): startActivity()

出棧(彈棧): finish()和使用者按下後退鍵

當啟動一個應用程式 系統就會分配一個任務棧給應用

 

十 啟動模式

singleInstance 單一實例

這樣的Activity會單獨存放在一個任務棧裡面 並且這樣的執行個體只會有一份引用

如果主任務棧裡面已存在同樣的Activity 那麼不會建立Activity 而會複用已存在的Activity 複用Activity就會調用Activity裡面onNewIntent()方法

舉個例子

AActivity -> BActivity -> BActivity  其中BActivity的啟動模式是singleInstance

第二個BActivity會複用第一個BActivity

此時棧的情況 AActivity BActivity

再舉個例子

AActivity -> BActivity -> BActivity -> CActivity  其中BActivity的啟動模式是singleInstance

第二個BActivity會複用第一個BActivity

此時棧的情況 BActivity AActivity CActivity  很奇怪是嗎 我也很奇怪 在三部真機上測試都是這個樣子

最後舉個例子

AActivity -> BActivity -> AActivity -> BActivity -> CActivity  其中BActivity的啟動模式是singleInstance

第二個BActivity會複用第一個BActivity

此時棧的情況 BActivity AActivity AActivity CActivity  這個也很奇怪

singleTask 單任務棧

如果任務棧裡面已存在同樣的Activity 那麼就會銷毀該Activity上面所有的Activity 再複用該Activity 複用Activity就會調用Activity裡面onNewIntent()方法

singleTop 獨佔頂端

如果棧頂已存在同樣的Activity 那麼不會建立Activity 而會複用棧頂的Activity 複用Activity就會調用Activity裡面onNewIntent()方法

如果不在棧頂 會建立Activity

standard 標準(預設)

啟動一個Activity 該Activity的執行個體引用就會放置在任務棧 每次啟動都會建立一個新的執行個體

 

十一 intent.setFlags()方法中的參數值含義

Intent.FLAG_ACTIVITY_NO_HISTORY

通過Intent跳轉到Activity 如果這個Intent添加FLAG_ACTIVITY_NO_HISTORY標誌

這樣的Activity會單獨存放在一個任務棧裡面 並且這樣的執行個體只會有一份引用

如果主任務棧裡面已存在同樣的Activity 那麼就會銷毀掉舊Activity 再建立Activity

舉個例子

AActivity -> BActivity -> BActivity  其中跳轉BActivity的Intent添加了FLAG_ACTIVITY_NO_HISTORY標誌

第一個BActivity會被銷毀 第二個BActivity是建立的

此時棧的情況 AActivity BActivity

再舉個例子

AActivity -> BActivity -> BActivity -> CActivity  其中跳轉BActivity的Intent添加了FLAG_ACTIVITY_NO_HISTORY標誌

第一個BActivity會被銷毀 第二個BActivity是建立的

此時棧的情況 AActivity CActivity

最後舉個例子

AActivity -> BActivity -> AActivity -> BActivity -> CActivity  其中跳轉BActivity的Intent添加了FLAG_ACTIVITY_NO_HISTORY標誌

第一個BActivity會被銷毀 第二個BActivity是建立的

此時棧的情況 AActivity AActivity CActivity

Intent.FLAG_ACTIVITY_CLEAR_TOP

通過Intent跳轉到Activity 如果這個Intent添加FLAG_ACTIVITY_CLEAR_TOP標誌

如果任務棧裡面已存在同樣的Activity 那麼就會銷毀掉舊Activity和它上面所有的Activity 再建立Activity

Intent.FLAG_ACTIVITY_SINGLE_TOP

通過Intent跳轉到Activity 如果這個Intent添加FLAG_ACTIVITY_SINGLE_TOP標誌

如果棧頂已存在同樣的Activity 那麼不會建立Activity 而會複用棧頂的Activity 複用Activity就會調用Activity裡面onNewIntent()方法

如果不在棧頂 會建立Activity

Intent.FLAG_ACTIVITY_NEW_TASK

通過Intent跳轉到Activity 如果這個Intent添加FLAG_ACTIVITY_NEW_TASK標誌

一般情況: 啟動一個Activity 該Activity的執行個體引用就會放置在任務棧 每次啟動都會建立一個新的執行個體

特殊情況: 如果試圖從Activity的外部非正常途徑啟動一個Activity 比如從一個BroadcastReceiver中啟動一個Activity 則Intent必須要添加FLAG_ACTIVITY_NEW_TASK標記 否則報錯

 

十二 onNewIntent()方法調用順序

如果不在棧頂

onNewIntent() -> onStart() -> onResume()

如果已在棧頂

onNewIntent() -> onResume()

 

十三 注意

一般來說 不建議目標Activity的intent.setFlags()的同時該Activity也設定啟動模式

尤其是Intent.FLAG_ACTIVITY_NO_HISTORY Intent.FLAG_ACTIVITY_CLEAR_TOP Intent.FLAG_ACTIVITY_SINGLE_TOP 和 singleInstance singleTask singleTop 一起混用

會導致任務棧很奇怪 Activity裡面的方法調用也會很奇怪

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: