重新認識Activity

1.activity的啓動方式
分爲直接起動和匿名啓動。

  • 直接啓動
    一般用於知道要啓動activity的名字
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    startActivity(intent);

    或者
 Intent intent = new Intent();
 ComponentName componentName = new ComponentName(MainActivity.this, SecondActivity.class);
 intent.setComponent(componentName);
 startActivity(intent);
  • 匿名方式
    一般不知道要啓動的activity的具體名字,比如想要啓動微信某個界面的activity,就得用action去啓動具體的activity。或者啓動系統的activity。
  Intent intent = new Intent();
   intent.setAction("www.baidu.com");
   startActivity(intent);

之後在mainfest.xml文件裏進行註冊,如下圖:
這裏寫圖片描述
在標籤內的action 標籤內加入想要打開的內容
標籤屬性用於指定當前動作(action)的指定環境

- 一些啓動系統activity的方法

 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);   //啓動默認瀏覽器
 Uri url =Uri.parse("www.bai.com") ;
 intent.setData(url);
 startActivity(intent);
intent.setAction(Intent.ACTION_GET_CONTENT);//啓動系統相冊
intent.setType("image/*");
intent.setAction(Intent.ACTION_SEND); //發送短信
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT," hello world");
 intent.setAction(Intent.ACTION_VIEW); //啓動電話界面
  Uri url =Uri.parse("tel:1378191") ;
  intent.setData(url);

2.Activity 之間的數據交換
activity之間傳遞的數據類型主要有三種:基礎數據、javabean類型、bitmap 類型

  • 基礎數據類型
    在傳遞基礎數據的時候最常用的是intent,intent可以傳遞8種基礎數據,並且可以傳遞bundle ,bundle也是一種鍵值對形式的存儲

  • javabean類型
    如果傳遞的信息量過大,上一種方法無法滿足的時候,可以將傳遞的信息封裝成類,進行傳遞,或者本身就要傳遞某個類的實例。首先需要將所傳遞的對象所屬的類實現Serializable接口. 之後在傳遞的過程中調用bundle的putserializable()方法把所要傳遞的對象放進去,再將bundle實例對象放進intent實例對象中。例:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Person person = new Person(24,"小芳","女"); //person類已實現Serializable接口
Bundle bundle = new Bundle();
bundle.putSerializable("person",person);
intent.putExtras(bundle);

取數據時,調用intent的getSerializableExtra()方法即可

  • bitmap類型
 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
 bundle.putParcelable("bitmap",bitmap);
 intent.putExtras(bundle);

注意:在傳送數據的時候,bundle只能傳遞大概小於0.5M容量的數據,傳遞圖片的時候儘量不要將原圖傳遞過去,否怎會拋出TransanctionToolargeException .

3.Activity 的 Task 和啓動模式
Task是一個存在於Framework層的概念
Task,簡單的說,就是一組以棧的模式聚集在一起的Activity組件集合。它們有潛在的前後驅關聯,新加入的Activity組件,位於棧頂,並僅有在棧頂的Activity,纔會有機會與用戶進行交互。而當棧頂的 Activity完成使命退出的時候,Task會將其退棧,並讓下一個將跑到棧頂的Activity來於用戶面對面,直至棧中再無更多 Activity,Task結束.

LaunchMoude(啓動模式):

  • standrd(默認啓動方式)

    標準啓動模式,也是activity的默認啓動模式。在這種模式下啓動的activity可以被多次實例化,即在同 一個任務中可以存在多個activity的實例,每個實例都會處理一個Intent對象。如果Activity A的啓動模式爲standard,並且A已經啓動,在A中再次啓動Activity A,即調用startActivity(new Intent(this,A.class)),會在A的上面再次啓動一個A的實例,即當前的桟中的狀態爲A–>A。

  • singleTop

    如果一個以singleTop模式啓動的activity的實例已經存在於任務桟的桟頂,那麼再啓動這個Activity時,不會創建新的實例,而是重用位於棧頂的那個實例,並且會調用該實例的onNewIntent()方法將Intent對象傳遞到這個實例中。舉例來說,如果A的啓動模式爲singleTop,並且A的一個實例已經存在於棧頂中,那麼再調用startAct ivity(new Intent(this,A.class))啓動A時,不會再次創建A的實例,而是重用原來的實例,並且調用原來實例的onNewIntent()方法。這是任務桟中還是這有一個A的實例。
    如果以singleTop模式啓動的activity的一個實例已經存在與任務桟中,但是不在桟頂,那麼它的行爲和standard模式相同,也會創建多個實例。

  • singleTask

    谷歌的官方文檔上稱,如果一個activity的啓動模式爲singleTask,那麼系統總會在一個新任務的最底部(root)啓動這個activity,並且被這個activity啓動的其他activity會和該activity同時存在於這個新任務中。如果系統中已經存在這樣的一個activity則會重用這個實例,並且調用他的onNewIntent()方法。即,這樣的一個activity在系統中只會存在一個實例。

    其實官方文檔中的這種說法並不準確,啓動模式爲singleTask的activity並不會總是開啓一個新的任務。詳情請參考 解開Android應用程序組件Activity的”singleTask”之謎,在本文後面也會通過示例來進行驗證。

  • singleInstance
    總是在新的任務中開啓,並且這個新的任務中有且只有這一個實例,也就是說被該實例啓動的其他activity會自動運行於另一個任務中。當再次啓動該activity的實例時,會重用已存在的任務和實例。並且會調用這個實例的onNewIntent()方法,將Intent實例傳遞到該實例中。和singleTask相同,同一時刻在系統中只會存在一個這樣的Activity實例。

未完待續。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章