編輯:關於Android編程
Intent中文意思指”意圖”,按照Android的設計理念,Android使用Intent來封裝程序的”調用意圖”,不管啟動Activity、Service、BroadcastReceiver,Android都使用統一的Intent對象來封裝這一”啟動意圖”。此外,Intent也是應用程序組件之間通信的重要媒介。在Android中指定的了具體是某個組件,那麼就是顯性意圖;如果只是提出要求沒有指定具體的某個人,在Android中即沒有指定某個具體的組件,那麼就是隱式意圖;所有Intent頁面跳轉的方式又分為顯示跳轉和隱式跳轉。
Android應用程序包含三種重要組件:Activity、Service、BroadcastReceiver,應用程序采用一致的方式啟動它們,都是依靠Intent來進行啟動的,Intent中封裝了程序要啟動的意圖。
下面是Intent啟動不同組件的部分方法:
Activity組件:
startActivity(Intent intent);startActivityForResult(Intent intent,int requestCode);
Service組件:
startService(Intent intent);bindService(Intent intent,ServiceConnection conn,int flags);
BroadcastReceiver組件:
sendBroadcast(Intent intent);sendOrderedBroadcast(Intent intent,String receiverPermission);
Intent的屬性及intent-filter的配置相結合使用;Intent的屬性大致包含:Component,Action,Category,Data,Type,Extra,Flag這7種屬性,其中Component用於明確指定需要啟動的組件,而Extra則用於”攜帶”需要交換的數據。
關於Intent屬性的詳解,在簡單使用後再介紹。
這裡的Intent使用,主要是使用它來執行頁面的跳轉功能。
如果Intent對象中包含了目標的class文件,那麼就是顯示意圖的跳轉;如果Intent沒有包含目標的class文件,就是隱式意圖跳轉,隱式意圖跳轉就涉及到比較多的Intent對象的屬性值的比較。
其中實現跳轉的java代碼非常簡單:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
其中具體實現是通過Intent的屬性類Component來實現,不過Component類的方法都封裝在Intent的方法裡面了,不需要我們過多的去了解。
這如果要傳遞數據也可以通過Intent對象使用putExtra方法來傳遞數據。
這裡的目標文件必須是要在AndroidManifest.xml裡面注冊。
隱式意圖的跳轉是本文主要講解的內容,也是比較難理解的內容!
這裡先使用Intent的Action和Data屬性來跳轉頁面做示例(特別要注意的是這裡的Data不是Intent的數據,而是Action動作對應的數據):
上面的xml布局文件設計有5個按鈕,具體功能開java代碼,下面詳細解釋。
2.java文件MainActivity.xml文件的設計
package com.example.intent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//打開一個數據視圖,但是沒有要求,系統會默認讓你從多個中選擇其中一個打開
public void action(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
startActivity(intent);
}
//打開一個數據視圖,有數據要求,系統幫你打開一個浏覽器,並連接到相關的頁面
public void actionUri(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
//使用顯示跳轉的方法跳轉到第二個頁面
public void ToSecondActivity(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
//這裡只用自己定義的Action字符串來找到對應的頁面
public void MyAction(View v) {
Intent intent = new Intent("HelloWorld");//Action字符串可以直接放在Intent的構造函數裡面,也可以單獨寫
// intent.setAction("HelloWorld");
intent.addCategory("android.intent.category.DEFAULT");//可以沒有
//但是自定義的Action的xml文件裡面必須要有category元素,否則會報錯
startActivity(intent);
}
//打開程序入口,特征是桌面
public void actionMain(View v) {
try {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
} catch (Exception e) {
Toast.makeText(this, "找不到目標頁面", Toast.LENGTH_SHORT).show();
}
}
}
這要重點理解的代碼,下面會詳細介紹。
3.java文件SecondActivity.java文件的設計
K
一個簡單Activity的設計,使用代碼設計一個線程布局並添加兩個文本,第二個文本添加的是跳轉後顯示的Intent屬性。
4.在AndroidManifest注冊一下SecondActivity.class文件
文件中使用intent-filter(意圖過濾器),用來存放意圖的屬性
其中MainActivity.java文件是要重點理解的;上面寫了五個按鈕對應的監聽方法。
運行程序後顯示的界面:
頁面顯示有五個按鈕,每個按鈕對應的是一個按鈕的監聽方法。下面分別介紹:
第一個按鈕使用的是隱式意圖跳轉頁面,Action屬性是系統的Action對象值,是指跳轉到一個View的視圖,這沒有指向具體目標。
點擊這個按鈕會顯示多個View的視圖供你選擇,效果如圖:
可以點擊對應的視圖按鈕,進入相關界面。
其中這裡的Action值是通過構造方法來傳進去的,也可以通過Intent對象進行設置。
第二個按鈕也是打開一個視圖,但是這個視圖有動作對應的數據,所以它會直接打開一個浏覽器,來顯示你要打開的網頁。
效果如圖:
對於常用的一些頁面跳轉的Action和它對應的Date是需要我們程序員花時間去記一下的。後面會有常用的Action和Data介紹。
第三個按鈕是顯示跳轉到另一個頁面,因為這個頁面是自定義的,所以需要在注冊表AndroidManifest裡面中注冊。如果被顯式調用,只需要添加Activity的name屬性就可以了,不需要設置Activity的過濾器intent-filter也可以。
點擊按鈕後顯示的結果:
這裡的Action對象的值和Category對象的值都是空的。因為前面的跳轉的Intent對象沒有這個值,所以它的對象是空的,對比下面一個按鈕就知道了。
第四個按鈕是隱式意圖跳轉去另一個頁面,使用的Action值也不是系統定義的,而是自己定義的一個字符串。這裡是通過Action和Category的值來確定一個頁面。Category代表的是動作的類別的意思。
點擊按鈕後顯示的結果:
可以考到頁面顯示了,Intent裡面包含的Action的值和Category的值。如果之前沒有傳進去就不會有。
第五個按鈕,也是隱式意圖跳轉的使用,這裡的Action值和Category值都是系統定義的都具有特定的含義,兩個結合使用就相對於使用了Home鍵直接顯示到桌面。
還有就是這個按鈕的方法裡面使用到了try catch方法,這是防止程序崩潰的方法,正確情況如果輸入的Action值或CategZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcnnWtcO709DWuM/yxLPSu7j2u/LSu9Cp0rPD5qOsz7XNs7vh1rG907HAwKOjrMv509DKudPDdHJ5IGNhdGNoysfKrrfWsdjSqrXEoaM8YnIgLz4NCtLizbzM+NeqyrHKudPDdHJ5IGNhdGNowLS3wNa5s/a07crHt8ezo7HY0qq1xKGjPC9jb2RlPjwvcD4NCjxoMSBpZD0="三intent-filter詳細屬性的介紹">三.intent-filter詳細屬性的介紹
(一)全部屬性的簡介
Intent通過下面的屬性來描述的某個意圖:
1. action(動作): 用來表示意圖的動作,如:查看,發郵件,打電話
2. category(類別): 用來表示動作的類別。
3. data(數據): 表示與動作要操作的數據。如:查看指定的聯系人
4. type(數據類型): 對data類型的描述。
5. extras(附件信息): 附件信息。如:詳細資料,一個文件,某事。
6. component(目標組件): 目標組件。
下面詳細介紹各個組件的使用
(一)component屬性
指定了component屬性的Intent(調用setComponent(ComponentName)或者
setClass(Context, Class),Class其實就是顯式調用需要的目標類的文件名。這個屬性用得比較少,最好不用。如果是顯示調用直接指定目標類的class文件名就可以使用了。
比如:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
Intent在後台已經幫我們實現了component屬性的設置,我們不需要很麻煩的再去實現它的過程。
(二)action動作屬性
動作很大程序上決定了Intent如何構建,特別是數據和附加信息,就像一個方法名決定了參數和返回值一樣,所以應該盡可能明確地指定動作,並緊密關聯到其他的Intent字段,如Category和Data。
常用動作
最常用的是Action_MAIN(作為初始的Activity啟動,沒有數據的輸入輸出)
1. ACTION_MAIN 作為一個主要的進入口,而並不期望去接受數據
2. ACTION_VIEW 向用戶去顯示數據
3. ACTION_ATTACH_DATA 別用於指定一些數據應該附屬於一些其他的地方,例如,圖片數據應該附
屬於聯系人
4. ACTION_EDIT 訪問已給的數據,提供明確的可編輯
5. ACTION_GET_CONTENT 允許用戶選擇特殊種類的數據,並返回(特殊種類的數據:照一張相片或
錄一段音) ACTION_DIAL 撥打一個指定的號碼,顯示一個帶有號碼的用戶界面,允許
用戶去啟動呼叫
6. ACTION_CALL 根據指定的數據執行一次呼叫(有缺陷,使用ACTION_DIAL)
7. ACTION_SEND 傳遞數據,被傳送的數據沒有指定,接收的action請求用戶發數據
8. ACTION_SENDTO 發送一條信息到指定的某人
9. ACTION_ANSWER 處理一個打進電話呼叫
10. ACTION_INSERT 插入一條空項目到已給的容器
11. ACTION_DELETE 從容器中刪除已給的數據
12. ACTION_SEARCH 執行一次搜索
13. ACTION_WEB_SEARCH 執行一次web搜索
上面的動作都是Intent對象引用才有實際意義的。
setAction(String action) 用來設置Intent的動作,參數可以為常量
getAction() 方法用來獲取Intent動作名稱
上面的Action都是系統定義好的,具有一定意義的動作指向的動作。
Intent的Action對象其實就是一個字符串常量,系統的Action對象是系統定義好的字符串常量,我們也可以自己定義自己的Action作為字符串常量。就像上面的例子使用到了自定義的Action字符串對象。(三)category類別屬性
Intent的action、category屬性都是普通的字符串,其中action表示Intent需要完成的一個抽象”動作”,而category則為action添加額外的類別信息,通常action和category一塊使用。
需要指出的是,一個Intent中只能包含一個action屬性,但可以包含多個category屬性。當程序創建Intent時,該Intent默認啟動常量值為andorid.intent.category.DEFAULT的組件。這裡的一個Intent中只能包含一個action屬性,並不是Activity中xml的設置規范,而是你要跳轉到的頁面去,你只能設置一個Action的值。
常用的Category:
1.CATEGORY_DEFAULT:Android系統中默認的執行方式,按照普通Activity的執行方式執行。
2.CATEGORY_HOME:設置該組件為Home Activity。
3.CATEGORY_PREFERENCE:設置該組件為Preference。
4.CATEGORY_LAUNCHER:設置為當前應用程序優先級最高的Activity,通常與ACTION_MAIN配合使用。
5.CATEGORY_BROWSABLE:設置該組件可以使用浏覽器啟動。
6.CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。
上面的類別都是Intent對象引用才有實際意義的。(四)data動作數據
Data數據用來向Action屬性提供動作的數據。這裡的Data不是Intent裡面的數據,而是指明動作的具體數據,比如說動作是打電話,那麼打給具體的某一個人,就用到了date裡面的數據來指定。同樣發郵件、或打開具體的某一個網址也是通過Data數據。
Data屬性只接受Uri對象,Uri對象是統一資源標識符。對應概念不用太多理解,只需知道裡面某些具體值的表現形式就可以了。
Uri其實就是相當於一個網址,如圖所示:網址只是Uri其中一種格式的字符串,要使用它還要把它解析後轉化為Uri類型。
為Intent對象添加Data數據,代碼:
intent.setData(Uri.parse(“http://www.baidu.com“));
這裡的Uri的有兩個沒顯示的屬性:port的值是8080,path的值是/index
通過下面三句代碼就可以跳轉到百度主頁面:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
(五)type數據類型
與Data有關的,這個不是Intent的數據類型,是Intent的Action的Data數據的類型。
比如:
{“.mp3”, “audio/x-mpeg”},
{“.mp4”, “video/mp4”},
{“.gif”, “image/gif”},
{“.rmvb”, “audio/x-pn-realaudio”},
這裡只是做幾個簡單的示例介紹,如果是打開gif格式的數據文件,設置type=“image/gif”(六)extras額外的數據信息
Extras屬性主要用於傳遞目標組件所需要的額外的數據。這個數據是可以通過Intent來保存的數據和Intent對象來獲取數據。
通過putExtras()方法設置。保存數據
通過putExtras()方法設置。獲取數據
通常我們使用Intent來直接傳遞Bundle對象,但也可以傳遞其他系統內置的一些參數。
如果要傳遞是是對象,那麼對象必須實現序列化。(七)intent-filter在AndroidManifest中
1.在裡可以有多個
,只需匹配其中一個即可。
語法:
也可以分開寫,如:
等同於這樣寫:
等同於Uri uri = Uri.parse("something://project.example.com:80");
Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
如果scheme沒有指定,那其它的屬性均無效;
如果host沒有指定,那麼port,path,pathPrefix,pathPattern均無效;
如果在manifest裡這樣寫:
那麼Uri uri = Uri.parse(“something://project.example.com”); 才可以匹配2.在裡可以有多個data或action ,只需匹配其中一個即可。
3.當匹配不上任何Activity的話,會發生異常,跳出對話框:很抱歉…某某應用程序意外停止,請重試。
4.上面所說的全部適用於Service和BroadcastReceiver。(八)幾個簡單示例的代碼
/**
* 跳轉到指定的網址頁面
*/
public void toView(View v) {
Intent intent = new Intent();
//設置Data數據
intent.setData(Uri.parse("http://www.baidu.com"));
//設置Action數據
intent.setAction(Intent.ACTION_VIEW);
//頁面跳轉
startActivity(intent);
}
/**
* 跳轉到編輯聯系人的信息
* 這裡聯系人的姓名是:1
*/
public void toEdit(View v) {
Intent intent = new Intent();
//設置Data數據
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
//設置Action數據
intent.setAction(Intent.ACTION_EDIT);
//頁面跳轉
try {
startActivity(intent);
} catch (Exception e) {
Toast.makeText(this, "找不到該聯系人!", Toast.LENGTH_SHORT).show();
}
}
/**
* 跳轉到撥打電話的頁面
* Data可以設置電話號碼
*/
public void toDial(View v) {
Intent intent = new Intent();
//設置Data數據
intent.setData(Uri.parse("tel:13814236512"));
//設置Action數據
intent.setAction(Intent.ACTION_DIAL);
//頁面跳轉
startActivity(intent);
}
三.下面是一些Intent對象的常量值
附部分Intent屬性值:
Action:
ACTION_MAIN:Android Application的入口,每個Android應用必須且只能包含一個此類型的Action聲明。
ACTION_VIEW:系統根據不同的Data類型,通過已注冊的對應Application顯示數據。
ACTION_EDIT:系統根據不同的Data類型,通過已注冊的對應Application編輯示數據。
ACTION_DIAL:系統默打開撥號程序,如果Data中設置電話號碼,則撥號框中會顯示此號碼。
ACTION_CALL:直接呼叫Data中所帶的號碼。
ACTION_ANSWER:接聽來電。
ACTION_SEND:由用戶指定發送方式進行數據發送操作。
ACTION_SENDTO:系統根據不同的Data類型,通過已注冊的對應Application進行數據發送操作。
ACTION_BOOT_COMPLETED:Android系統在啟動完畢後發出帶有此Action的廣播(Broadcast)。
ACTION_TIME_CHANGED:Android系統的時間發生改變後發出帶有此Action的廣播(Broadcast)。
ACTION_PACKAGE_ADDED:Android系統安裝了新的App之後發出帶有此Action的廣播(Broadcast)。
ACTION_PACKAGE_CHANGED:Android系統中已存在的App發生改變之後(如更新)發出帶有此Action的廣播(Broadcast)。
ACTION_PACKAGE_REMOVED:Android系統卸載App之後發出帶有此Action的廣播(Broadcast)。 Category:
CATEGORY_DEFAULT:Android系統中默認的執行方式,按照普通Activity的執行方式執行。
CATEGORY_HOME:設置該組件為Home Activity。
CATEGORY_PREFERENCE:設置該組件為Preference。
CATEGORY_LAUNCHER:設置為當前應用程序優先級最高的Activity,通常與ACTION_MAIN配合使用。
CATEGORY_BROWSABLE:設置該組件可以使用浏覽器啟動。
CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。 Extras:
EXTRA_BCC:存放郵件密送人地址的字符串數組。
EXTRA_CC:存放郵件抄送人地址的字符串數組。
EXTRA_EMAIL:存放郵件地址的字符串數組。
EXTRA_SUBJECT:存放郵件主題字符串。
EXTRA_TEXT:存放郵件內容。
EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent的按鍵。
EXTRA_PHONE_NUMBER:存放調用ACTION_CALL時的電話號碼。
Data:
tel://:號碼數據格式,後跟電話號碼。
mailto://:郵件數據格式,後跟郵件收件人地址。
smsto://:短息數據格式,後跟短信接收號碼。
content://:內容數據格式,後跟需要讀取的內容。
file://:文件數據格式,後跟文件路徑。
market://search?q=pname:pkgname:市場數據格式,在Google Market裡搜索包名為pkgname的應用。
geo://latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。
MimeType:
{“.3gp”, “video/3gpp”},
{“.apk”, “application/vnd.android.package-archive”},
{“.asf”, “video/x-ms-asf”},
{“.avi”, “video/x-msvideo”},
{“.bin”, “application/octet-stream”},
{“.bmp”, “image/bmp”},
{“.c”, “text/plain”},
{“.class”, “application/octet-stream”},
{“.conf”, “text/plain”},
{“.cpp”, “text/plain”},
{“.doc”, “application/msword”},
{“.docx”, “application/vnd.openxmlformats-officedocument.wordprocessingml.document”},
{“.xls”, “application/vnd.ms-excel”},
{“.xlsx”, “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”},
{“.exe”, “application/octet-stream”},
{“.gif”, “image/gif”},
{“.gtar”, “application/x-gtar”},
{“.gz”, “application/x-gzip”},
{“.h”, “text/plain”},
{“.htm”, “text/html”},
{“.html”, “text/html”},
{“.jar”, “application/Java-archive”},
{“.java”, “text/plain”},
{“.jpeg”, “image/jpeg”},
{“.jpg”, “image/jpeg”},
{“.js”, “application/x-JavaScript”},
{“.log”, “text/plain”},
{“.m3u”, “audio/x-mpegurl”},
{“.m4a”, “audio/mp4a-latm”},
{“.m4b”, “audio/mp4a-latm”},
{“.m4p”, “audio/mp4a-latm”},
{“.m4u”, “video/vnd.mpegurl”},
{“.m4v”, “video/x-m4v”},
{“.mov”, “video/quicktime”},
{“.mp2”, “audio/x-mpeg”},
{“.mp3”, “audio/x-mpeg”},
{“.mp4”, “video/mp4”},
{“.mpc”, “application/vnd.mpohun.certificate”},
{“.mpe”, “video/mpeg”},
{“.mpeg”, “video/mpeg”},
{“.mpg”, “video/mpeg”},
{“.mpg4”, “video/mp4”},
{“.mpga”, “audio/mpeg”},
{“.msg”, “application/vnd.ms-outlook”},
{“.ogg”, “audio/ogg”},
{“.pdf”, “application/pdf”},
{“.png”, “image/png”},
{“.pps”, “application/vnd.ms-powerpoint”},
{“.ppt”, “application/vnd.ms-powerpoint”},
{“.pptx”, “application/vnd.openxmlformats-officedocument.presentationml.presentation”},
{“.prop”, “text/plain”},
{“.rc”, “text/plain”},
{“.rmvb”, “audio/x-pn-realaudio”},
{“.rtf”, “application/rtf”},
{“.sh”, “text/plain”},
{“.tar”, “application/x-tar”},
{“.tgz”, “application/x-compressed”},
{“.txt”, “text/plain”},
{“.wav”, “audio/x-wav”},
{“.wma”, “audio/x-ms-wma”},
{“.wmv”, “audio/x-ms-wmv”},
{“.wps”, “application/vnd.ms-works”},
{“.xml”, “text/plain”},
{“.z”, “application/x-compress”},
{“.zip”, “application/x-zip-compressed”}, 總結:
本文只要是對Intent知識中隱式Intent意圖的講解,其實這部分內容並不是很常用,也是比較難理解一些。
學習Intent只要學會下面幾個知識點就差不多了:
1.Intent顯式頁面跳轉的實現
2.Intent跳轉到撥打電話頁面,固定網頁上等基礎功能。
3.Intent學會使用數據的傳入和拿出。
本文實例講述了Android開發之自定義控件用法。分享給大家供大家參考,具體如下:今天和大家分享下組合控件的使用。很多時候android自定義控件並不能滿足需求,如何做呢
顯示百度地圖百度地圖SDK為開發者提供了便捷的顯示百度地圖數據的接口,通過以下幾步操作,即可在您的應用中使用百度地圖數據:第一步:創建並配置工程(具體方法參見工程配置部分
除非我們特別為某個操作指定特定的線程,否則大部分在前台UI界面上的操作任務都執行在一個叫做UI Thread的特殊線程中。這可能存在某些隱患,因為部分在UI界面上的耗時操
1.UI組件-AdapterView及其子類(二) 1)自動完成文本框(AutoCompleteTextView)的用法MultiAutoCompleteTex