1. 程式人生 > 實用技巧 >活動目錄(LiveFolder)

活動目錄(LiveFolder)

活動目錄(LiveFolder

LiveFolder的概念和用途

活動目錄(LiveFolder)是一種小型的應用層外掛。它本身體現為桌面出現的圖示,通過點選這些圖示,將出現一個列表框,列表框中將顯示資料資訊。通過活動目錄可以在不開啟應用程式的情況下,在桌面就能檢視其中的資料資訊。

Android的桌面中長按桌面或者選擇選單,進入增加活動目錄的介面,可以將LiveFolder增加到桌面,LiveFolder的增加介面和執行效果如圖8-4所示。

8-4中左圖為增加LiveFolder的介面,列表中的內容由各個應用程式實現的增加LiveFolder的入口決定。LiveFolder點選後不會啟動

Activity,而是在出現類似圖8-4中右圖的介面的對話方塊。這個對話方塊不是LiveFolder實現者的一部分,而是桌面程式提供的功能。對話方塊通常包含一個列表,LiveFolder實現者可以實現其中的每個專案顯示的內容,還可以進一步實現每個內容被點選之後,出現的介面。如果僅僅出現活動目錄列表項對話方塊,實際是LiveFolder實現者並沒有提供執行的介面,而只是在桌面查看了其中的內容。

LiveFolder的程式組成

LiveFolder外掛的本質是一個特殊的Activity和一個特殊的ContentProviderActivity需要支援特殊的Intent動作,負責建立LiveFolder

,並通過URI關聯到某個ContentProviderContentProvider負責提供LiveFolder中使用的各個專案的內容。

android.provider包的LiveFolders類定義活動目錄的ActivityContentProvider中的特殊內容。

1LiveFolderActivity

Activity方面,LiveFolders類中的ACTION_CREATE_LIVE_FOLDER動作,實際表示的字串為“android.intent.action.CREATE_LIVE_FOLDER”。接受這個Intent-filterActivity,將被桌面程式選擇作為可以建立

LiveFolder的程式。

Activity在收到ACTION_CREATE_LIVE_FOLDER動作的Intent啟動後,要通過setResult()呼叫的方式把活動目錄的內容發回給它的呼叫者。返回的Intent的核心內容是需要設定一個Uri,表示活動目錄要查詢的ContentProvider的地址。

LiveFolders類中的另外幾個數值表示建立LiveFolder後返回的附加引數。

EXTRA_LIVE_FOLDER_NAME:表示所建立的活動目錄的名稱(也就是出現在桌面的標籤),為字串“android.intent.extra.livefolder.NAME”,型別為String

EXTRA_LIVE_FOLDER_ICON:表示活動目錄在桌面顯示的圖示,為字串“android.intent.extra.livefolder.ICON”,型別為Intent.ShortcutIconResource(作為Parcelable傳遞)。

EXTRA_LIVE_FOLDER_DISPLAY_MODE:表示活動目錄的顯示模式,為字串“android.intent.extra.livefolder.DISPLAY_MODE”,型別為int ,具有兩個數值可以使用:DISPLAY_MODE_GRID(網格)和DISPLAY_MODE_LIST(列表)。

EXTRA_LIVE_INTENT:表示活動目錄中某個專案被點選後,啟動內容的Intent,為字串“android.intent.extra.livefolder.BASE_INTENT”,型別為Intent

綜合以上幾個方面,LiveFolders被建立後,返回的Intent比較特殊,這個Intent實際上用於指向一個內容提供者,其中的Data域就是指向這個內容提供者的URI。它的額外引數定義了體現在桌面上的名稱和圖示,也體現了點選桌面圖示後出現的對話方塊中的內容。

LiveFolder增加到桌面後的圖示和選擇LiveFolder的圖示可以不同。在習慣上,為了區別桌面的ShotcutLiveFolder的圖示通常做成類似資料夾的形式。

2LiveFolderContentProvider

ContentProvider方面,需要在查詢(query())的時候,支援幾個特殊的域。這些域由LiveFolders類的幾個常量定義,如下所示。

NAME:表示每個專案的名稱,為字串“name”,型別為String

DESCRIPTION:表示每個專案的描述,為字串“description”,型別為String

INTENT:表示每個專案被選中後啟動的內容,為字串“intent”,型別為Intent

ICON_BITMAP:表示每個專案的圖示,為字串“icon_bitmap”,型別為Bitmap

ICON_PACKAGE:表示專案圖示對應的應用程式包的名字,為字串“icon_ package”,型別為String

ICON_RESOURCE:表示專案圖示對應的資源名稱,為字串“icon_resource”,型別為Parcelable

對於LiveFolderContentProvider的實現,以上的幾個域只有NAME必須實現,其他是可選的。

LiveFolders實現了BaseColumns介面,因此其中也含有兩個靜態屬性。

_ID:內容的id,為字串“_count”,型別為INTEGER

_COUNT:內容的數目,為字串“_id”,型別為INTEGER

實現LiveFolderContentProvider也需要支援_ID_COUNT兩個域。

LiveFolder的實現

本節中的LiveFolder Sample程式實現了一個活動目錄,增加後將在桌面出現一個圖示。點選這個活動目錄在桌面的圖示,將在LiveFolder的列表框中顯示一些內容。LiveFolder Sample的執行效果如圖8-5所示。

8-5中右圖的列表項對話方塊共有8個專案,進一步點選每一個專案,還將出現瀏覽器顯示空(blank)的網頁。

LiveFolder Sample實現的AndroidMenifest.xml中定義的一個用於建立LiveFolder Activity和一個顯示內容的ContentProvider,如下所示:

<activity android:name="LiveFolderSample"

android:icon="@drawable/app_icon" android:label="LiveFolder Sample">

<intent-filter>

<action android:name="android.intent.action.CREATE_LIVE_FOLDER" />

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

<provider android:name="LiveFolderSampleProvider"

android:authorities="livefoldersample"/>

這裡宣告的Activity支援“android.intent.action.CREATE_LIVE_FOLDER”動作,表示可以用它來建立活動目錄,也就是可能在活動目錄的增加列表中出現它這個專案。

public class LiveFolderSample extends Activity {

private static final String URI = // ContentProviderURI

"content://" + "livefoldersample" + "/live_folders/virtual";

private static final Uri CONTENT_URI = Uri.parse(URI);

@Override protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

final Intent intent = getIntent(); // 獲得其中的Intent

final String action = intent.getAction();

if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {

final Intent liveFolderIntent = new Intent(); // 返回結果中的Intent

final Intent urlIntent =

new Intent(Intent.ACTION_VIEW,Uri.parse("about://blank"));

returnIntent.setData(CONTENT_URI); // Intent中的URI

returnIntent.putExtra( // LiveFolder對話方塊的名稱

LiveFolders.EXTRA_LIVE_FOLDER_NAME,"LiveFolderSample");

returnIntent.putExtra( // LiveFolder的圖示

LiveFolders.EXTRA_LIVE_FOLDER_ICON,Intent.ShortcutIconResource.

fromContext(this,R.drawable.app_icon));

returnIntent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,

LiveFolders.DISPLAY_MODE_LIST);

returnIntent.putExtra( // LiveFolder中的每個內容Intent

LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,urlIntent);

setResult(RESULT_OK, returnIntent); // 設定返回結果

} else { setResult(RESULT_CANCELED); }

finish();

}

}

在建立LiveFolder的過程中,涉及兩個IntentreturnIntentActivity返回的效果,在其中通過額外引數指定圖示和活動目錄的名稱,其中主要的內容是指向ContentProviderURI,並定義了其中的圖示和名稱。

返回內容returnIntent的一個特殊的域為urlIntent,也是一個Intent,它表示每一個專案被點選之後啟動ActivityIntent。在這裡將它定義為Intent.ACTION_VIEW 動作和以“about://blank”表示的Intent。當點選LiveFolder中的每一個專案的時候,將呼叫相應的程式(實際上是瀏覽器),對應的URI為“about://blank”再附加上每個內容的id

這裡的ContentProvider的實現內容如下所示:

——本段文位元組選自《Android經典應用程式開發》

圖書詳細資訊:http://bvbroadview.blog.51cto.com/addblog.php

轉載於:https://blog.51cto.com/bvbroadview/788056