編輯:關於Android編程
Intent的真正強大之處在於它的隱式Intent,隱式Intent需要配合Intent-filters使用,有關這方面的概念和知識,您可以參考我翻譯的官方文檔:《Android官方文檔之App Components(Intents and Intent Filters)》。
隱式Intent足夠強大,以至於系統提供了大量的Intent方便開發者啟動系統應用程序,本文將介紹一些常用的隱式Intent、以及如何自定義intent-filters以匹配隱式intent。
如需閱讀官方原文,您可以點擊這個鏈接:《Common Intents》
下面將按照啟動的目標組件類別介紹隱式Intent:
要啟動鬧鐘activity,可以這樣設定Intent:
Action:ACTION_SET_ALARM
Data URI:空
MIME Type:空
Extras:
EXTRA_HOUR:設定小時
EXTRA_MINUTES:設定分鐘
EXTRA_MESSAGE:設定自定義消息
EXTRA_DAYS:設定每周的周幾重復響鈴。該字段的值應定義成ArrayList,每個元素是Calendar類中的靜態字段(如Calendar.Monday)。對於那些一次性響鈴,無需設置這個extra。
EXTRA_RINGTONE:設定鬧鐘鈴聲。該字段的值應設定成一個scheme為 content: 的URI類型,該URI指向了一個音頻文件的地址;您也可以將值設定為 VALUE_RINGTONE_SILENT,這表示將鬧鐘設為靜音。
EXTRA_VIBRATE:設定是否響鈴的同時震動。該字段的值為boolean類型。
EXTRA_SKIP_UI:設定啟動系統鬧鐘應用程序時,是否跳過UI界面,值為boolean類型,若為true,表示不顯示設定鬧鐘的dialog對話框,而直接進入設置鬧鐘的activity。
示例:
public void createAlarm(String message, int hour, int minutes) {
Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
.putExtra(AlarmClock.EXTRA_MESSAGE, message)
.putExtra(AlarmClock.EXTRA_HOUR, hour)
.putExtra(AlarmClock.EXTRA_MINUTES, minutes);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
若為Intent指定的action為ACTION_SET_ALARM,則需要在manifest中配置如下權限:
可以響應該Intent的intent-filter如下:
!請注意:該Intent只兼容 Android 4.4 (API level 19) 及以上版本的設備。
要啟動計時器,可以這樣設定Intent:
Action:ACTION_SET_TIMER
Data URI:空
MIME Type:空
Extras:
EXTRA_LENGTH:設置倒計時的秒數
EXTRA_MESSAGE:設置到時消息
EXTRA_SKIP_UI:設定啟動系統計時器應用程序時,是否跳過UI界面,值為boolean類型,若為true,表示不顯示設定計時器的設置dialog對話框,而直接進入計時器的activity。
示例:
public void startTimer(String message, int seconds) {
Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
.putExtra(AlarmClock.EXTRA_MESSAGE, message)
.putExtra(AlarmClock.EXTRA_LENGTH, seconds)
.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
若為Intent指定的action為ACTION_SET_TIMER,則需要在manifest中配置如下權限:
可以響應該Intent的intent-filter如下:
!請注意:該Intent只兼容 Android 4.4 (API level 19) 及以上版本的設備。
Action:ACTION_SHOW_ALARMS
Data URI:空
MIME Type:空
示例:
Action:ACTION_INSERT
Data URI:Events.CONTENT_URI
MIME Type:”vnd.android.cursor.dir/event”
Extras:
EXTRA_EVENT_ALL_DAY:該鍵所對應的值是boolean類型,表示事件是否為全天候事件。
EXTRA_EVENT_BEGIN_TIME:代表事件的起始時間,值為 從2000年到設定起始時間所經歷的毫秒數(milliseconds since epoch)。
EXTRA_EVENT_END_TIME :代表事件的結束時間,值為 從2000年到設定結束時間所經歷的毫秒數(milliseconds since epoch)。
TITLE:事件的標題
DESCRIPTION:事件的描述
EVENT_LOCATION:事件發生的地點
EXTRA_EMAIL:將事件郵件的形式發送,值為郵箱地址,可同時發送給多人,郵箱地址以逗號分隔。欲了解更多關於發送郵件的細節,您可以參考這個類:CalendarContract.EventsColumns
示例:
public void addEvent(String title, String location, Calendar begin, Calendar end) {
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI)
.putExtra(Events.TITLE, title)
.putExtra(Events.EVENT_LOCATION, location)
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
可以匹配上述intent的intent-filters:
Action:ACTION_IMAGE_CAPTURE 或 ACTION_VIDEO_CAPTURE
Data URI Scheme:空
MIME Type:空
Extras:EXTRA_OUTPUT,該鍵所對應的值是一個Uri對象,它表示通過相機應用所照的相片或錄的視頻的存儲地址。您可以在onActivityResult()方法中通過該Uri獲取剛照的相片。
!請注意:通過ACTION_IMAGE_CAPTURE啟動activity並返回的照片是一個鍵為”data”的Bitmap類型的略縮圖(downscaled copy (a thumbnail) of the photo)
示例如下:
static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri mLocationForPhotos;
public void capturePhoto(String targetFilename) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.withAppendedPath(mLocationForPhotos, targetFilename));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bitmap thumbnail = data.getParcelable("data");
// Do other work with full size photo saved in mLocationForPhotos
...
}
}
關於如何通過這個Intent拍照、錄像,以及如何獲得存儲照片、錄像的Uri地址,您可以參考這些Training:
Taking Photos Simply
Taking Videos Simply
示例intent-filter:
Action:INTENT_ACTION_STILL_IMAGE_CAMERA
Data URI Scheme:空
MIME Type:空
Extras:空
示例:
public void capturePhoto() {
Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent);
}
}
intent-filter:
Action:INTENT_ACTION_VIDEO_CAMERA
Data URI Scheme:空
MIME Type:空
Extras:空
示例:
public void capturePhoto() {
Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent);
}
}
intent-filter:
在onActivityResult()中可獲取您選擇的聯系人,如果只是通過Contacts Provider讀取聯系人信息,則無需申請READ_CONTACTS權限。
Action:ACTION_PICK
Data URI Scheme:None
MIME Type:Contacts.CONTENT_TYPE
示例:
static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
Uri contactUri = data.getData();
// Do something with the selected contact at contactUri
...
}
}
關於如何處理返回的Uri對象contactUri ,您可以訪問這個Training:Retrieving Details for a Contact
Action:ACTION_PICK
Data URI Scheme:空
MIME Type:
CommonDataKinds.Phone.CONTENT_TYPE,表示獲取聯系人號碼
CommonDataKinds.Email.CONTENT_TYPE,表示獲取聯系人Email
CommonDataKinds.StructuredPostal.CONTENT_TYPE,表示獲取聯系人的郵寄地址
通過ContactsContract.CommonDataKinds中的其他字段,還可以獲取更多聯系人信息。示例:
static final int REQUEST_SELECT_PHONE_NUMBER = 1;
public void selectContact() {
// Start an activity for the user to pick a phone number from contacts
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
// Get the URI and query the content provider for the phone number
Uri contactUri = data.getData();
String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(contactUri, projection,
null, null, null);
// If the cursor returned is valid, get the phone number
if (cursor != null && cursor.moveToFirst()) {
int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(numberIndex);
// Do something with the phone number
...
}
}
}
Action:ACTION_VIEW
Data URI Scheme:content:
,該Uri指向了查看的聯系人地址,有兩種方法可獲得該Uri:
直接檢索通訊錄聯系人( Retrieving a List of Contacts)。此方式需要READ_CONTACTS權限。
MIME Type:空
示例:
public void viewContact(Uri contactUri) {
Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:ACTION_EDIT
Data URI Scheme:content:
,獲取該Uri的方式和權限與上一小節的獲取方式一致。
MIME Type:由Uri決定。
Extras:ContactsContract.Intents.Insert
示例:
public void editContact(Uri contactUri, String email) {
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setData(contactUri);
intent.putExtra(Intents.Insert.EMAIL, email);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
更多關於編輯聯系人的方法,您可以參考這個Training:Modifying Contacts Using Intents。
Action:ACTION_INSERT
Data URI Scheme:空
MIME Type:Contacts.CONTENT_TYPE
Extras:ContactsContract.Intents.Insert
示例:
public void insertContact(String name, String email) {
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setType(Contacts.CONTENT_TYPE);
intent.putExtra(Intents.Insert.NAME, name);
intent.putExtra(Intents.Insert.EMAIL, email);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:
ACTION_SENDTO。用於發送不帶附件的Email(for no attachment)
ACTION_SEND。用於發送帶一個附件的Email(for one attachment)
ACTION_SEND_MULTIPLE。用於發送多個附件的Email(for multiple attachments)
Data URI Scheme:空
MIME Type:
"text/plain"
"*/*"
Extras:
Intent.EXTRA_EMAIL:該鍵所對應值為一個字符串數組,每個字符串表示一個收件人的地址。
Intent.EXTRA_CC:該鍵所對應值為一個字符串數組,每個字符串表示一個副本抄送地址(CC= Carbon Copy)。
Intent.EXTRA_BCC:該鍵所對應值為一個字符串數組,每個字符串表示一個密件抄送地址(BCC= Blind Carbon Copy)。
Intent.EXTRA_SUBJECT:該鍵所對應值為一個字符串,表示郵件主題。
Intent.EXTRA_TEXT:該鍵所對應值為一個字符串,表示郵件內容。
Intent.EXTRA_STREAM:該鍵所對應值為一個Uri地址,該Uri指向了添加的附件,若action為 ACTION _SEND _MULTIPLE,則值應為ArrayList,每個元素為一個Uri對象。
示例:
public void composeEmail(String[] addresses, String subject, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
若您能確定通過該隱式Intent能啟動一個郵件應用的activity(而不是社交類應用或是編輯短信的應用),那麼您可以使用action為ACTION_SENDTO並且使用”mailto”作為Uri的解析字符串發送郵件:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Intent-filter:
為了能夠獲取用戶選擇文件的引用(如一張照片、一個文檔),可以使用ACTION_GET_CONTENT
這個action,並指定期望的MIME類型。而返回的文件的引用僅短暫存在於activity的生命周期中,若希望較持久化的保存文件,程序需要將引用指向的文件復制一份並保留下來。該Intent同時允許在此進程中新建文件。
通過回調方法onActivityResult(),可以獲得回傳的Intent對像,該對象包含了用戶選擇文件的Uri地址,該Uri地址的scheme可以是任何類型,比如可以是http:
,content:
或file:
;如果您僅希望用戶檢索的文件來自於ContentProvider(也就是Uri的scheme為content:
類型),並通過openFileDescriptor()方法獲得文件流,那麼需要為Intent中加入CATEGORY_OPENABLE
的category。
若設備版本為Android 4.3 (API level 18)及以上,您還可以通過為Intent添加鍵為EXTRA_ALLOW_MULTIPLE
,值為true的extra,來同時選擇多個文件,並通過Intent.getClipData()方法返回ClipData對象來獲取其中包含的多個文件。
Action:ACTION_GET_CONTENT
Data URI Scheme:空
MIME Type:該類型由用戶選擇的文件類型決定。
Extras:
EXTRA_ALLOW_MULTIPLE。該鍵對應的值為boolean類型,設置用戶是否可一次性選擇多個文件。 EXTRA_LOCAL_ONLY:該鍵對應的值為boolean類型,表示所選文件是否為本地文件(即是否可以在用戶選擇文件後立刻返回並獲得該文件,而不是還需要去開啟一個服務下載)。下例演示了如何通過Intent獲取一張圖片:
static final int REQUEST_IMAGE_GET = 1;
public void selectImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_IMAGE_GET);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
Bitmap thumbnail = data.getParcelable("data");
Uri fullPhotoUri = data.getData();
// Do work with photo saved at fullPhotoUri
...
}
}
匹配的Intent-filter:
當SDK版本為Android 4.4 或以上時,可以通過ACTION_OPEN_DOCUMENT
這個action及特定的MIME類型打開一個其他應用的文件並管理它,您還可以通過ACTION_CREATE_DOCUMENT
這個action來寫入一個文件。
Action:ACTION_OPEN_DOCUMENT 或 ACTION_CREATE_DOCUMENT
Data URI Scheme:空
MIME Type:由用戶選擇的文件類型確定
Extras:
EXTRA_MIME_TYPES,對應值是一個請求文件類型的MIME類型數組,必須最少指定類型為"*/*"
。
EXTRA_ALLOW_MULTIPLE,對應值是一個boolean類型,用戶設置用戶是否每次可同時選擇多個文件。
EXTRA_TITLE,對應著ACTION_CREATE_DOCUMENT
這個action,為新建的文件起一個標題。
EXTRA_LOCAL_ONLY,對應值為boolean類型,用於設定選擇的文件是否來自本地(即選擇文件後是否可立即返回)。
示例:
static final int REQUEST_IMAGE_OPEN = 1;
public void selectImage() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
// Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
Uri fullPhotoUri = data.getData();
// Do work with full size photo saved at fullPhotoUri
...
}
}
為了讓第三方APP也能識別ACTION_OPEN_DOCUMENT
這個action,徐這樣配置ContentProvider:
Action:ACTION_VIEW
Data URI Scheme:
geo:latitude,longitude
:在地圖上顯示指定的位置,如:"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
:在地圖上按一定的放大級別顯示指定的位置,1表示最遠,顯示的是全球地圖,中心點在是給定的經緯度;23表示最接近地面(closest) 。如:"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
:顯示指定的位置並顯示一個label。如:"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
:在地圖上顯示指定的某個地址的位置。如:"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
。
!注意:由geo
開頭的Uri所解析的字符串參數必須被編碼,例如字符串"1st & Pike, Seattle"
所表示的地址應被編碼為"1st%20%26%20Pike%2C%20Seattle"
,才能傳入Uri.parse()方法中,其中字符串中的空格應被編碼成%20
或者加號( + )。
示例:
public void showMap(Uri geoLocation) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(geoLocation);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
Action:ACTION_VIEW
Data URI Scheme:
file:
content:
http:
MIME Type:
"audio/*"
"application/x-ogg"
"application/itunes"
示例:
public void playMedia(Uri file) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
Action:ACTION_CREATE_NOTE
Data URI Scheme:空
MIME Type:
PLAIN_TEXT_TYPE
"*/*"
Extras:
EXTRA_NAME ,表示備忘錄的標題
EXTRA_TEXT,表示備忘錄的內容
示例:
public void createNote(String subject, String text) {
Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE)
.putExtra(NoteIntents.EXTRA_NAME, subject)
.putExtra(NoteIntents.EXTRA_TEXT, text);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
您可以通過 ACTION_DIAL
這個action打開電話應用程序的撥號界面,並把電話號碼作為參數到撥號框中,用戶點擊“撥打”按鈕開始撥號。這無需任何權限。
您也可以通過ACTION_CALL
這個action直接撥打電話,而無需點擊“撥打”按鈕。這需要添加如下權限:
Intent的具體設置方式如下:
Action:
ACTION_DIAL,打開撥號界面。
ACTION_CALL,直接撥打電話。
Data URI Scheme:
tel:
voicemail:
MIME Type:空
合法的電話號碼格式請參照這個鏈接:the IETF RFC 3966。合法的電話號碼形如:
tel:2125551212
tel:(212) 555 1212
示例:
public void dialPhoneNumber(String phoneNumber) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + phoneNumber));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:"com.google.android.gms.actions.SEARCH_ACTION"
,,支持通過Google Now 語音搜索。
Extras:QUERY,該鍵對應值是一個字符串,表示用戶輸入的搜索信息。
如希望自己的應用程序可以被搜索到,可以在intent-filter中按如下方式配置:
Action:ACTION_WEB_SEARCH
Data URI Scheme:空
MIME Type:空
Extras:SearchManager.QUERY。一個字符串,表示搜索的內容。
示例:
public void searchWeb(String query) {
Intent intent = new Intent(Intent.ACTION_SEARCH);
intent.putExtra(SearchManager.QUERY, query);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
您可能需要在使用app的過程中調整某些系統設置,以便更好地使用應用(比如應用需要開啟藍牙功能以便傳輸文件,這時app可以跳轉至系統設置的藍牙開關選項中,引導用戶開啟藍牙功能)。您只需要在Intent中添加需要下列action,就能跳轉至相應的設置界面。
Action:
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
Data URI Scheme:空
MIME Type:空
示例:
public void openWifiSettings() {
Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:
ACTION_SENDTO
ACTION_SEND
ACTION_SEND_MULTIPLE
Data URI Scheme:
sms:
smsto:
mms:
mmsto:
以上四種方式效果相同
MIME Type:
"text/plain"
"image/*"
"video/*"
Extras:
"subject"
,該鍵對應值是一個字符串,表示發送短信的標題(通常只適用於發短信)。
"sms_body"
,該鍵對應值是一個字符串,表示消息內容。
EXTRA_STREAM,該鍵對應的值是一個Uri地址,它指向了附加文件,若action為ACTION_SEND_MULTIPLE
,則這個值應該是一個ArrayList
對象。
示例:
public void composeMmsMessage(String message, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType(HTTP.PLAIN_TEXT_TYPE);
intent.putExtra("sms_body", message);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
若您通過intent打開的確實是一個發送短消息的應用(而不是Email或是社交類的應用),那麼可以按如下方式操作:
public void composeMmsMessage(String message, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("smsto:")); // This ensures only SMS apps respond
intent.putExtra("sms_body", message);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
與之匹配的intent-filter配置如下:
Action:ACTION_VIEW
Data URI Scheme:
http:
https:
MIME Type:
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
示例:
public void openWebPage(String url) {
Uri webpage = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
與之匹配的intent-filter:
OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名稱「攔截器」一樣,攔截你的 Reque
android手機內存本來就不大,要是老把數據放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把數據要放到SD卡中,以減少手機內存的使用,本文僅寫入文件
零、Gallery的使用回顧我們有時候在iPhone手機上或者Windows上面看到動態的圖片,可以通過鼠標或者手指觸摸來移動它,產生動態的圖片滾動效果,還可以根據你的點
概述:目前,豎直索引欄還是很流行的,微信、美團、手機通訊錄等各種常用軟件都要用到它。Demo寫一個自定義View,利用觀察者模式,自定義其中的點擊事件。public cl