標籤:android blog java 使用 檔案 資料
1.Intent是什麼
Intent是視圖的意思,它是Android應用內不同組件之間通訊的載體。當Android運行時需要串連不同的組件時,通常就需要藉助於Intent來實現。Intent可以啟動應用中另一個Activity,也可以啟動一個Service組件,還可以發送一條廣播訊息來觸發系統中的BroadcastReceiver。Activity,Service和BroadcastReceiver三個組件之間的通訊都以Intent作為載體。
(1)啟動一個Activity時,可以調用Context的startActivity(Intent intent)或者Activity的startActivityForResult(Intent intent,int requestCode),參數intent封裝了需要啟動的Activity的資訊。
(2)啟動一個Service時,可以調用Context的startService(Intent intent)的方法或bindService(Intent service,ServiceConnection conn,int flags)方法,Intent參數封裝了需要啟動的目標Service的資訊。
(3)觸發一個BroadcastReceiver時,可以調用Context的sendBroadcast(Intent intent),sendStickyBroadcast()或sendOrderedBroadcast(),這三個方法中的Intent參數封裝了需要觸發的目標BroadcastReceiver的資訊。
2.Intent存的是什麼資訊:(自己理解)Intent中存的資訊包括本Activity的資訊以及將要跳轉的Activity的資訊。
3.顯式Intent和隱式Intent 顯式Intent:決定目標組件的唯一要素是組件名稱。更多的用在應用程式內部傳遞資訊。
4.Intent解析機制:Android是通過Intent的action,type和category來判斷的。 隱式Intent:沒有明確指出組件名稱,由Android系統協助程式尋找與Intent請求意圖最匹配的組件。Android系統使用IntentFilter來尋找與隱式Intent相關的對象。更多的用在不同應用程式傳遞資訊:例如跳轉到開啟音樂播放器,開啟圖庫等。
5.Intent啟動Activity的方式。
startActivity()是非同步作業,開啟新的ActivityB和原的ActivityA同時執行。 startActivityForResult()是同步操作,ActivityA在開啟新的ActivityB後將自己阻塞,ActivityB退出以後ActivityA才繼續執行,並根據ActivityB返回的結果執行下一步的操作。
(1)使用startActivity(Intent intent)直接啟動。
(2)使用startActivityForResult(Intent intent, Int requestCode),setResult(int resultCode, Intent intent),onActivityResult(int requestCode, int resultCode, Intent intent)
A通過startActivityForResult()開啟B的流程。
a.首先在A中調用startActivityForResult(Intent intent, Int requestCode)。
Intent參數代表的是一個普通的intent,例如:從A跳到B,可以Intent intent = new Intent(A.cthis,B.class); intent指定了要跳轉到B,且包含了A傳給B的資料。requestCode>=0,如果A還要跳轉到C,D等等,requestCode就對應不同的值。例如:從A跳轉到B,C,D等等,可以分別用1,2,3等等來區分。在後面的onActivityResult()中需要以此來區分各個Activity傳回的結果。
例如:
//startActivityForResult(intent,1); --1:B //startActivityForResult(intent,2); --2:C //startActivityForResult(intent,3); --3:C protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: ... break; case 2: ... break; case 3: ... break; default: break; }
b.在B中setResult(int resultCode, Intent intent)。
resultCode用來區分B有幾種不同的返回結果。
intent(本例子)參數代表的是返回A,主要用來返回額外的資料,最終會傳給A的onActivityResult()
c.最後在A中調用onActivityResult(int requestCode, int resultCode, Intent data)
requestCode :區分是哪個Activity傳回來的
requestCode :區分傳給哪個Activity
data : B中調用setResult時傳回的那個intent。
6.Intent傳遞資料的方式。
(1)putXXXExtra(“key”,”value”);
(2)先new一個Bundle的對象,Bundle用來攜帶資料。然後在調用intent.putExtras(bundle);
(3)Intent要求傳送的資料必須實現實現Serializable介面或者Parcelable介面中的一種。
7.Intent傳遞資料的類型。
(1)Integer類型的ArrayList
(2)String類型的ArrayList
(3)其他類型(其他類型好像只可以用序列化),要引用Serializable介面。Serializable介面就是java提供的通用資料儲存和讀取的介面。任何類型只要實現了Serializable介面就可以被儲存到檔案中,或者作為資料流通過網路發送到別的地方。也可以通過管道傳輸到系統的其他程式中。Serializable不僅可以本機使用還可以經由網路操作(RMI)。這樣的好處是自動屏蔽了作業系統的差異。