活動目錄(LiveFolder)
活動目錄(LiveFolder)
LiveFolder的概念和用途
活動目錄(LiveFolder)是一種小型的應用層外掛。它本身體現為桌面出現的圖示,通過點選這些圖示,將出現一個列表框,列表框中將顯示資料資訊。通過活動目錄可以在不開啟應用程式的情況下,在桌面就能檢視其中的資料資訊。
在Android的桌面中長按桌面或者選擇選單,進入增加活動目錄的介面,可以將LiveFolder增加到桌面,LiveFolder的增加介面和執行效果如圖8-4所示。
圖8-4中左圖為增加LiveFolder的介面,列表中的內容由各個應用程式實現的增加LiveFolder的入口決定。LiveFolder點選後不會啟動
LiveFolder的程式組成
LiveFolder外掛的本質是一個特殊的Activity和一個特殊的ContentProvider。Activity需要支援特殊的Intent動作,負責建立LiveFolder
android.provider包的LiveFolders類定義活動目錄的Activity和ContentProvider中的特殊內容。
1.LiveFolder的Activity
在Activity方面,LiveFolders類中的ACTION_CREATE_LIVE_FOLDER動作,實際表示的字串為“android.intent.action.CREATE_LIVE_FOLDER”。接受這個Intent-filter的Activity,將被桌面程式選擇作為可以建立
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的圖示可以不同。在習慣上,為了區別桌面的Shotcut,LiveFolder的圖示通常做成類似資料夾的形式。
2.LiveFolder的ContentProvider
在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。
對於LiveFolder的ContentProvider的實現,以上的幾個域只有NAME必須實現,其他是可選的。
LiveFolders實現了BaseColumns介面,因此其中也含有兩個靜態屬性。
_ID:內容的id,為字串“_count”,型別為INTEGER;
_COUNT:內容的數目,為字串“_id”,型別為INTEGER。
實現LiveFolder的ContentProvider也需要支援_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 = // ContentProvider的URI
"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的過程中,涉及兩個Intent。returnIntent是Activity返回的效果,在其中通過額外引數指定圖示和活動目錄的名稱,其中主要的內容是指向ContentProvider的URI,並定義了其中的圖示和名稱。
返回內容returnIntent的一個特殊的域為urlIntent,也是一個Intent,它表示每一個專案被點選之後啟動Activity的Intent。在這裡將它定義為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