天天看點

Android學習筆記7——Intent和Intent Filters的介紹

一個Intent就是一個你能用來向其他任何元件請求行為的消息。盡管Intent以幾種方式促進元件間的交流通信,但是有三種是最基本的應用場景:

1、開啟一個Activity:在Android APP中一個Activity就是一個使用者界面,你能向startActivity方法傳遞一個Inent來開啟一個Activity執行個體。這個Intent描述了你所要開啟的Activity和裝在任何需要的資料。

如果你想要在調用結束的時候傳回一個結果,你可以調用startActivityForResult方法。你的Activity在這個Activity中的onActivityResult這個回調方法中以Intent對象作為結果傳回。

2、開啟一個Service:一個Service就是一個沒有界面在背景進行某項長時間操作的元件。為了進行一個一次性的操作你能向startService方法傳遞一個Intent來開啟一個Service。這個Intent描述了要開啟的服務和裝載的資料。

如果這個Service被設計作為客戶——伺服器接口,你能通過傳遞一個Intent給bindService方法來和另一個元件的Service綁定。

3、發送一個廣播:一個廣播就是一個任何應用都能接收到的消息。系統能夠為系統事件發送大量不同的廣播,例如系統重新開機或者裝置開始充電。你能通過向sendBroadcast、sendOrderedBroadcast、sendStickyBroadcast方法傳遞一個Intent對象來向其他app發送一個廣播。

Intent分為兩種類型的Intent:準确的Intent和不準确的Intent

Explicit Intent:準确的Intents指定要開啟的元件的類的全名(包括包路徑)。你能用EXplicit開啟你自己的APP的某個元件,因為你知道要開啟的類的名稱。

Implicit Intent:不準确的Intents不會設定要啟動的元件的類名稱,相反他會定義要進行的Action,這個Action允許另一個APP的元件去操作它。例如,如果你想要在一個地圖中向使用者展示目前位置,你能用不準确的Intent要求另一個APP在地圖上展示一個定位。

當你開啟一個準确的Intent開啟一個元件的時候,系統會立馬開啟你指定的Intent的元件。

而當你建立一個不準确的Intent時,android系統會把這個Intent中的内容和這個裝置上的其他APP定義在Manifest檔案中的Intent Filer做對比,然後選擇出一個比對的。如果這個Intent比對一個Intent Filter,這個裝置就會啟動這個元件,把這個Intent發送給這個元件。如果多個Intent Filer符合,系統将會展現一個選擇框讓使用者去選擇。

注意:為了使得你的APP是安全的,你應該為你的Service元件定義一個精确的Intent,并且不要定義Intent Filer為你的service。因為你不知道哪一個Service發生了相應,使用者也不能看到哪一個服務開始了。

建構一個Intent:

一個Intent包含了以下幾個部分:

1、元件名稱:

這個是可選的,但是他是一個嚴格的使得這個Intent變得精确的資訊,這也意味着這個Intent應該僅僅發送給被這個元件名稱定義的APP元件。沒有這個元件名稱,這個Intent就是不精确的Intent,系統就會依據Intent的其他資訊來決定哪一個元件将要接受到這個Intent。是以如果你需要在你的APP中開啟一個特定的元件,你應該指定這個元件的名稱。

2、Action:

Action是一個用來指定一類動作的字元串。你可以在你的APP之自定義你自己的Intent,也可以使用架構或者Intent類提供的一些公用的Intent(例如ACTION_VIEW和ACTION——SEND)。但是你自定義的ACTION,必須包含你的APP包的字首。

3、Data:

URI對象映射要表現的資料和或者這個資料的MIME類型。這個Data需要的類型一般由這個Intent的Action所決定。例如一個Action是ACTION_EDIT,這個URI應該包含要編輯文檔的URI。

當創造一個Intent時,為URI指定資料類型是非常重要的。例如,一個Activity能夠展示圖檔但是不能夠展示一個音頻檔案,即使這個URI格式是相似的。是以指定這個MIME類型能夠使得android系統找到更好的元件接收你的Intent。你可以調用setData僅僅設定資料,setType僅僅設定類型,setDataAndType設定資料和類型。

4、Catagory

一個catagory應該是一個字元串,他包含一些要操作的Intent的元件的一些額外資訊。在Intent中可以定義任意多個catagory,但是大都數不需要一個catagroy.

5、Extras

extras是一個額外攜帶用來完成要求的Action的簡直對。就像一些Action用特定類别的資料URI,一些也用指定的extras.

你能用putExtra方法來增加extra 資料,每一個Extra都是一個簡直對。你能創造一個Bundle對象來攜帶所有的extra資料,然後用putExtra方法把這個Bundle對象放入Intent中。

6、Flags

PendingIntent:

一個PendingIntent是一個用來封裝Intent的封裝器。PendingIntent的一個最基本的目的是為了讓外部的應用擷取權限去用這個包裝起來的Intent就好象是它被執行在你的app自己的程序中。

這個PendingIntent最主要的應用場景是:

1、當使用者用Notification來表現一個ACTION的時候定義一個Intent執行。

2、當使用者用APPWidget來表現一個Action的時候定義一個Intent執行。

3、當在不久将來的某個特定時間定義一個Intent去執行。

因為每一個Intent對象被用來設計被一個特定的APP元件所調用(一個acitivity或者service或者broadcast receiver),而pendingIntent因為同樣的考慮被設計。當用pendingIntent時,你的APP不能用startActivity調用執行。你必須調用一下方法來擷取相應類型的PendingIntent:

PendingIntent.getActivity來開啟一個Activiy

PendingIntent.getService來開啟一個Service

PeidngInent.getBroadcastReceiver來開啟一個BroadcastReceiver

除了你的app從其他app接受到的PendingIntent之外,上面建立PendingIntent的方法是僅有的你可能用到的PendingIntent方法。

上面的每一個方法都會傳遞目前的Context、你要封裝的Intent和一個或者更多個指定這個intent應該怎樣被用的flag标簽。