680 likes | 928 Views
Android Intent. 建國科技大學 資管系 饒瑞佶 2011/1. Android Intent (I). Android 的事件處理機制稱為「 Intent 」 Intent 的作用與事件 (event) 很像,但與傳統的事件處理仍然有些差異 傳統的事件 處理,講求的是「處理者( handler )的觸發」,當一事件發生時,便 callback 事件的處理者,或是直接將該事件 forward 給應用程式,由應用程式處理
E N D
AndroidIntent 建國科技大學 資管系 饒瑞佶 2011/1
AndroidIntent(I) • Android的事件處理機制稱為「Intent」 • Intent 的作用與事件(event)很像,但與傳統的事件處理仍然有些差異 • 傳統的事件處理,講求的是「處理者(handler)的觸發」,當一事件發生時,便callback事件的處理者,或是直接將該事件forward給應用程式,由應用程式處理 • 在Intent裡,Android 將事件看成「應用程式的意圖」或「使用者的意圖」,並去解釋該意圖的目的,若 Android 系統本身能理解應用程式的意圖,便會「自行」去處理該意圖所應執行的工作
AndroidIntent (II) • Android的做法是讓每個Intent都帶有一個action,並根據不同的action去進行需要的處理 • Android內部有許多內建的action,例如「ACTION_VIEW」,用來「檢視」(view)一個「URI」資料,當Android看到「ACTION_VIEW」時,便「自行」依據資料(data)處理(action)該Intent,處理的方式隨data不同而不同 • Intent intent=new Intent(action,data) • data範例 • http:// 開啟瀏覽器 • geo: 開啟Google Maps • tel: 撥電話
AndroidIntent (III) • Android內建的Intent action分為二種: • Activity Action: 啟動Activity的action • Broadcast Action: 透過廣撥器處理的action • 另外,可自行定義一個Intent,設定可接收此Intent的Service(這就是Action),並透過「送出Intent」的方式,請Android啟動該Service • 除了action外,Intent還包含「data」 • Intent的action指定這個Intent的「動作」是什麼,Android會依指定的動作進行處理;但有些action可以附帶資料(data),這個資料是以URI的格式撰寫
範例一、內建的動作“ACTION_VIEW” • 使用內建的動作“ACTION_VIEW” 做一個「啟動瀏覽器上網」的應用程式 • 可以在 Android 應用程式裡顯示自已的 HTML 文件,或是線上的網頁 • data格式 • http://網址
不用“ACTION_VIEW” • 建立新專案: HelloWeb
不用“ACTION_VIEW” loadData() 的參數如下: 第一個參數:HTML 內容 第二個參數:MimeType類型,指定為 text/html,即 HTML 類型文件 第三個參數:文字編碼方法,指定為 utf-8(Unicode) • HelloWeb.java 程式 使用HTML標籤當參數
不用“ACTION_VIEW” • main.xml
不用“ACTION_VIEW” loadData() 的參數如下: 第一個參數:HTML 內容 第二個參數:MimeType類型,指定為 text/html,即 HTML 類型文件 第三個參數:文字編碼方法,指定為 utf-8(Unicode) • HelloWeb.java 程式 使用網址當參數
不用“ACTION_VIEW” • androidmanifest.xml裡,需要加入 android.permission.INTERNET android.permission.ACCESS_NETWORK_STATE 的權限才能上
不用“ACTION_VIEW” • 如果使用emulator還是不能上網,可能是DNS問題,請 • 執行:adb shell • 輸入:getprop • 輸入:setprop net.dns1 168.95.1.1 這是目前DNS設定 請改成一個可以用的 例如中華電信168.95.1.1
使用內建的動作“ACTION_VIEW” • 改用ACTION_VIEW data action
範例二、利用Intent 玩Google Maps • 建立新專案: HelloMaps 沒有Google APIs target
範例二、利用Intent 玩Google Maps • 如果沒有Google APIs target • 請選擇Available packages進行安裝
範例二、利用Intent 玩Google Maps • 安裝完Google APIs target畫面
範例二、利用Intent 玩Google Maps • 建立新專案: IntentMaps
顯示Google Maps地圖 都是ACTION_VIEW,但資料格式不同
範例二、利用Intent 玩Google Maps • AVD也要對應具備Google APIs功能
範例二、利用Intent 玩Google Maps • 增加 <uses-permission android:name="android.permission.INTERNET" />
範例二、利用Intent 玩Google Maps • Google MapsURI 格式:geo:latitude,longitudegeo:latitude,longitude?z=zoomgeo:0,0?q=my+street+addressgeo:0,0?q=business+near+city • Google StreetviewURI 格式:google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom
範例二、利用Intent 玩Google Maps • 顯示地圖Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); • 路徑規劃Uri uri = Uri.parse("http://maps.google.com/maps? f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456
範例二、HelloIntentDialer • 啟動撥號器(dialer)並撥號 • action: ACTION_CALL • 執行步驟: 1. 先產生一個Intent物件: Intent dial = new Intent(); 2. 設定Intent的action為「android.intent.action.CALL」,這是一個內建的action: dial.setAction("android.intent.action.CALL"); 內建action「CALL」需要附帶一筆資料,而資料的寫法是使用URI格式: dial.setData(Uri.parse("tel:119")); 4. 「CALL」是一個activity action,所以呼叫startActivity()向Intent送給框架: startActivity(dial);
範例二、HelloIntentDialer • HelloIntentDialer.java的完整程式 http://www.jollen.org/blog/2009/08/jollen-android-programming-27.html
範例二、HelloIntentDialer • 因為permission的關係,所以也要在AndroidManifest.xml裡加上「CALL_PHONE」的權限。AndroidManifest.xml的完整內容如下
??HelloIntentMusic • 使用者按下「Select Music」後,可以由音樂清單裡選擇音樂並撥放 • action: ACTION_GET_CONTENT http://blogold.chinaunix.net/u1/44301/showart_2360056.html
切換Activity • 使用Eclipse建立新專案 • Project Name=Jao • Application Name=MyButton • Package Name=com.android.jao • Create Activity=Jao
Close application按鈕程式 1 main.xml中的android:id屬性 2 3
切換Activity • 建立對應的新畫面sample_page.xml • res/layout/sample_page.xml • 建立對應的程式sample_page.java • src/com.example.android.button/ sample_page.java • 在AndroidManiFest.xml中加入Activity
切換Activity • 建立對應的畫面sample_page.xml 2 1
按鈕元件切換Activity • 建立對應的畫面sample_page.xml 複製main.xml的結構
按鈕元件切換Activity • 建立對應的畫面sample_page.xml
按鈕元件切換Activity • 建立對應的程式sample_page.java
按鈕元件切換Activity • 建立對應的程式sample_page.java 1 2
按鈕元件切換Activity • 建立對應的程式sample_page.java 輸入activity 3 4
按鈕元件切換Activity • 建立對應的程式sample_page.java 5
按鈕元件切換Activity • 建立對應的程式sample_page.java 出現基本結構 複製HelloBMI.java內的程式 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.Sample_page); } 這裡要改
按鈕元件切換Activity • 建立對應的程式sample_page.java 1 2 3 4
按鈕元件切換Activity • 建立對應的程式sample_page.java
按鈕元件切換Activity • 加入從Jao.java呼叫sample_page.java • 先在main.xml加入一個按鈕
按鈕元件切換Activity • 在Jao.java加入呼叫按鈕與程式
按鈕元件切換Activity • 在AndroidManifest.xml中加入Activity 1
按鈕元件切換Activity • 在AndroidManifest.xml中加入Activity 2