560 likes | 708 Views
12. Android Intents. Notes are based on: Android Developers http://developer.android.com/index.html. 12. Android – Intents Intents. Android Activities Một ứng dụng Android có thể bao gồm nhiều activity.
E N D
12 Android Intents Notes are based on: Android Developers http://developer.android.com/index.html
12. Android – Intents Intents • Android ActivitiesMột ứng dụng Android có thể bao gồm nhiều activity. • Một activity dùng phương thức setContentView(...) để hiện một (thông thường) giao diện người dùng mà từ đó có thể thực hiện các hành động. • Các activity tồn tại độc lập với nhau, nhưng chúng thường trao đổi dữ liệu và các action (hành động). • Thông thường, một activity được chỉ định là activity đầu tiên (main) cái sẽ hiện ra đầu tiên khi ứng dụng được bật. • Việc chuyển từ activity này sang activity khác được thực hiện bằng cách yêu cầu activity hiện hành thực thi một intent. • Các activity tương tác với nhau theo hình thức không đồng bộ. 2
12. Android – Intents Intents Android Activities Android Application Main Activity results intents Sub-Activity-1 Sub-Activity-n extras 3 3
12. Android – Intents Invoking intents Taken from: http://code.google.com/android/reference/android/content/Intent.html Intent được kích hoạt qua một trong các cách sau 4
12. Android – Intents Intent primary attributes Taken from: http://code.google.com/android/reference/android/content/Intent.html Các tham số chính của một Intent: Action action có sẵn (built-in) cần thực hiện, chẳng hạn ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, … hoặc user-created-activity Data primary data - dữ liệu dành cho thực hiện action, chẳng hạn số điện thoại cần gọi (biểu diễn dưới dạng một Uri). Activity-1 Intent: { action + data } Activity-2 Optional results 5
12. Android – Intents Intents primary attributes Taken from: http://code.google.com/android/reference/android/content/Intent.html Thông thường, một intent được gọi như sau: IntentmyActivity = new Intent (action, data); startActivity (myActivity); Primary data (as an URI) tel:// http:// sendto:// Built-in or user-created activity 6 6
12. Android – Intents Actions Taken from: http://code.google.com/android/reference/android/content/Intent.html Ví dụ về các cặp action/data: ACTION_DIAL tel:123Bật ứng dụng điện thoại với số điện thoại đã cho được điền sẵn. ACTION_VIEW http://www.google.comMở trang Google trong một browser view. Lưu ý rằng VIEW action thực hiện việc gì mà nó cho là hợp lý nhất đối với mỗi URI cụ thể. ACTION_EDIT content://contacts/people/2Soạn thông tin về người có ID bằng "2“ trong danh sách contacts. ACTION_VIEW content://contacts/people/2 Bật activity để hiện thông tin về người thứ 2 trong danh sách contacts. ACTION_VIEW content://contacts/people/Hiện một danh sách người, người dùng có thể duyệt qua danh sách đó. Việc chọn một người cụ thể để xem chi tiết sẽ gây ra một intent mới 7
12. Android – Intents Standard Activity Actions 8 8
12. Android – Intents Example: Display phone dialer • Taken from: http://code.google.com/android/reference/android/content/Intent.html • Example • Display the phone dialer with the given number filled in. • Intent myActivity2 = new Intent (Intent.ACTION_DIAL, Uri.parse( "tel:555-1234")); • startActivity(myActivity2); 9
12. Android – Intents Secondary Attributes • Taken from: http://code.google.com/android/reference/android/content/Intent.html • Các tham số phụBên cạnh hai tham số chính action/data , còn có các tham số phụ có thể dùng cho intent, ví dụ: • Category 2. Components • 3. Type 4. Extras • Ví dụ: Dùng Google tìm các câu lạc bộ gôn • Intent intent = new Intent (Intent.ACTION_WEB_SEARCH ); • intent.putExtra(SearchManager.QUERY, • "straight hitting golf clubs"); • startActivity(intent); Secondary data 10 Apparently the Google answer is ‘none’
12. Android – Intents Example: sending an SMS Taken from: http://code.google.com/android/reference/android/content/Intent.html Ví dụ: Gửi một tin nhắn Intent intent = new Intent( Intent.ACTION_SENDTO, Uri.parse("sms:5551234")); intent.putExtra("sms_body", "are we playing golf next Saturday?"); startActivity(intent); 11 “address”, “sms_body” are keywords
12. Android – Intents Example: Displaying an image Taken from: http://code.google.com/android/reference/android/content/Intent.html Example: Hiển thị hình ảnh (using extra attributes) Intent myIntent = new Intent(); myIntent.setType("image/pictures/*"); myIntent.setAction(Intent.ACTION_GET_CONTENT); startActivity(myIntent); 12
12. Android – Intents Complete Example Activity1 cho user nhập số điện thoại và yêu cầu Activity2 (built-in) thực hiện cuộc gọi. • <?xml version="1.0" encoding="utf-8"?> • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" • android:orientation="vertical" • android:layout_width="fill_parent" • android:layout_height="fill_parent" > • <TextView • android:id="@+id/label1" • android:layout_width="fill_parent" • android:layout_height="wrap_content" • android:background="#ff0000cc" • android:text="This is Activity1" • android:textStyle="bold" • android:textSize="20sp" /> • <EditText • android:id="@+id/text1" • android:layout_width="fill_parent" • android:layout_height="54px" • android:text="tel:555-1234" • android:textSize="18sp" /> • <Button • android:id="@+id/btnCallActivity2" • android:layout_width="149px" • android:layout_height="wrap_content" • android:text="Make Phone Call" • android:textStyle="bold" /> • </LinearLayout> 13
12. Android – Intents Complete Example Giao diện hoạt động 14
12. Android – Intents Complete Example Mã nguồn //IntentDemo1_Intent: making a phone call Package es.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.*; publicclass IntentDemo1 extends Activity { TextView label1; EditText text1; Button btnCallActivity2; 15
12. Android – Intents Complete Example onCreate: gắn handler vào nút bấm @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.main); label1 = (TextView)findViewById(R.id.label1); text1 = (EditText)findViewById(R.id.text1); btnCallActivity2 = (Button)findViewById(R.id.btnCallActivity2); btnCallActivity2.setOnClickListener(newClickHandler()); } catch (Exception e) { Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show(); } }//onCreate 16
12. Android – Intents Complete Example ClickHandler hoạt động khi người dùng bấm nút • privateclass ClickHandler implements OnClickListener { • @Override • publicvoid onClick(View v) { • try { • // myActivity2 places a phone call • // for ACTION_CALL or ACTION_DIAL • // use 'tel:' formatted data: "tel:555-1234" • String myData = text1.getText().toString(); • Intent myActivity2 = new Intent(Intent.ACTION_DIAL, Uri.parse(myData)); • startActivity(myActivity2); • } • catch (Exception e) { • Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show(); • } • }//onClick • }//ClickHandler • }//IntentDemo1 17
12. Android – Intents Complete Example Manifest file <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="es.demo" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="7" /> <applicationandroid:icon="@drawable/icon" android:label="@string/app_name"> <activityandroid:name=".IntentDemo1" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> Action/category 18
12. Android – Intents Standard Broadcast Actions 19
12. Android – Intents Example: Call immediately More Examples: Using Standard Actions Thực hiện cuộc gọi Sửa ví dụ, thay phương thức ‘ClickHandler’ bằng đoạn mã sau String myData = "tel:555-1234"; Intent myActivity2 = new Intent(Intent.ACTION_CALL, Uri.parse(myData)); startActivity(myActivity2); Cần permission (soạn trong file manifest): <uses-permission android:name="android.permission.CALL_PHONE" /> 20
12. Android – Intents Example: Show all contacts More Examples: Using Standard Actions Xem tất cả các Contact Sửa ví dụ, thay phương thức ‘ClickHandler’ bằng đoạn mã sau String myData = "content://contacts/people/"; Intent myActivity2 = new Intent(Intent.ACTION_VIEW, Uri.parse(myData)); startActivity(myActivity2); 21
12. Android – Intents Example: Show a contact More Examples: Using Standard Actions Hiển thị một contact (ID=2) Sửa ví dụ, thay phương thức ‘ClickHandler’ bằng đoạn mã sau String myData = "content://contacts/people/2"; Intent myActivity2 = new Intent(Intent.ACTION_VIEW, Uri.parse(myData)); startActivity(myActivity2); 22
12. Android – Intents Example: Edit a contact More Examples: Using Standard Actions Sửa một Contact (ID = 2) Sửa ví dụ, thay phương thức ‘ClickHandler’ bằng đoạn mã sau String myData = "content://contacts/people/2"; Intent myActivity2 = new Intent(Intent.ACTION_EDIT, Uri.parse(myData)); startActivity(myActivity2); 23
12. Android – Intents Example: View a Webpage More Examples: Using Standard Actions Xem một trang web Sửa ví dụ, thay phương thức ‘ClickHandler’bằng đoạn mã sau String myData = "http://www.youTube.com"; Intent myActivity2 = new Intent(Intent.ACTION_VIEW, Uri.parse(myData)); startActivity(myActivity2); Lưu ý. Bổ sung vào Manifest một yêu cầu sử dụng Internet: <uses-permission android:name="android.permission.INTERNET" /> 24
12. Android – Intents Geo Mapping an Address More Examples: Using Standard Actions Geo Mapping một địa chỉ Dùng một biểu thức geoCode cho một địa chỉ theo phố (hoặc địa danh, chẳng hạn ‘golden gate ca’ ) Thay các dấu cách bằng ‘+’. String geoCode = "geo:0,0?q=1860+east+18th+street+cleveland+oh"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoCode)); startActivity(intent); Sửa Manifest để bổ sung các yêu cầu sau: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> 25
12. Android – Intents Geo Mapping Coordinates More Examples: Geo Mapping tọa độ (vĩ độ, kinh độ) Dùng một geoCode chứa vĩ độ và kinh độ (và hệ số zoom ‘?z=xx’ với xx trong khoảng 1..23) String geoCode = "geo:41.5020952,-81.6789717"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoCode)); startActivity(intent); Sửa Manifest để bổ sung các yêu cầu sau: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> 26
12. Android – Intents Get driving directions More Examples: Tìm đường từ địa điểm A đến B String url = "http://maps.google.com/maps?"+ "saddr=9.938083,-84.054430&daddr=9.926392,-84.055964"; Intent intent = newIntent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent);
12. Android – Intents Use a mnemonic to articulate an address More Examples // use a mnemonic to articulate an address String thePlace = “Cleveland State University”; Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("geo:0,0?q= (" + thePlace + ")“ );startActivity(intent);
12. Android – Intents Google StreetView More Examples: Using Standard Actions Geo Mapping - Google StreetView geoCode Uri structure: google.streetview:cbll=lat,lng&cbp=1, yaw,,pitch,zoom&mz=mapZoom Reference: http://developer.android.com/guide/appendix/g-app-intents.html String geoCode = "google.streetview:cbll=41.5020952,-81.6789717&cbp=1,270,,45,1&mz=1"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoCode)); startActivity(intent); Modify the Manifest adding the following requests: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> 29
12. Android – Intents Launching the Music Player More Examples: Using Standard Actions Launching the Music Player Reference: http://developer.android.com/guide/appendix/g-app-intents.html //launch music player Intent myActivity2 = new Intent("android.intent.action.MUSIC_PLAYER"); startActivity(myActivity2); 30
12. Android – Intents Playing a song More Examples: Using Standard Actions Playing a song stored in the SD card Reference: http://developer.android.com/guide/appendix/g-app-intents.html // play song "amarcord.mp3" saved in the SD Intent myActivity2 = new Intent(android.content.Intent.ACTION_VIEW); Uri data = Uri.parse("file:///sdcard/amarcord.mp3"); String type = "audio/mp3"; myActivity2.setDataAndType(data, type); startActivity(myActivity2); 31
12. Android – Intents Sending MMS More Examples: Using Standard Actions Sending MMS Add picture #1 from SD to MMS Reference: http://developer.android.com/guide/appendix/g-app-intents.html //send mms attach picture #1 to it Uri uri = Uri.parse("content://media/external/images/media/1"); myActivity2 = new Intent(Intent.ACTION_SEND); myActivity2.putExtra("address", "555-1234"); myActivity2.putExtra("sms_body", "some text message goes here"); myActivity2.putExtra(Intent.EXTRA_STREAM, uri); myActivity2.setType("image/png"); startActivity(myActivity2); 32
12. Android – Intents Sending Email More Examples: Using Standard Actions Sending Email Reference: http://developer.android.com/guide/appendix/g-app-intents.html // send email Uri uri = Uri.parse("mailto:v.matos@csuohio.edu"); Intent myActivity2 = new Intent(Intent.ACTION_SENDTO, uri); // you may skip the next two pieces [subject/text] myActivity2.putExtra(Intent.EXTRA_SUBJECT, "subject goes here"); myActivity2.putExtra(Intent.EXTRA_TEXT, "The email's body goes here"); startActivity(myActivity2); 33
12. Android – Intents Setting System More Examples: Using Standard Actions Setting System Reference: http://developer.android.com/reference/android/provider/Settings.html Intentintent = new Intent( android.provider.Settings.ACTION_SETTINGS); startActivity(intent); 34
12. Android – Intents Setting System Locale More Examples: Using Standard Actions Setting System Locale: Language & Keyboard Reference: http://developer.android.com/reference/android/provider/Settings.html Intent intent = new Intent( android.provider.Settings.ACTION_LOCALE_SETTINGS); startActivity(intent); 35
12. Android – Intents Starting Activities and Getting Results • Gọi activity và lấy kết quả • Phương thức startActivity(Intent) dùng để bật một activity mới và nó sẽ được đặt trên đỉnh activity stack. • Đôi khi, ta muốn lấy kết quả trả về từ activity được gọi (sub-activity) khi nó kết thúc. • Ví dụ, ta bật một activity cho phép người dùng chọn một người từ danh sách contact; khi activity đó kết thúc, nó trả về người được chọn. 36
12. Android – Intents Starting Activities and Getting Results Để có thể lấy kết quả trả về từ activity được gọi, ta dùng phương thức sau để gọi activity: startActivityForResult ( Intent, requestCodeID ) Trong đó, tham số thứ hai (requestCodeID) định danh lời gọi activity. Phương thức không đồng bộ sau lấy kết quả trả về từ sub-activity onActivityResult ( requestCodeID, resultCode, Intent ) 37
12. Android – Intents Starting Activities and Getting Results • Trước khi một activity kết thúc, nó có thể gọi setResult (resultCode) • để gửi một tín hiệu kết thúc về cho nơi gọi nó (parent activity). • Trong đó, result code có thể có giá trị chuẩn như Activity.RESULT_CANCELED, Activity.RESULT_OK, • hoặc một giá trị tùy biến khác. • Tất cả thông tin trên có thể được nhận bởi phương thức tại activity cha • onActivityResult (int requestCodeID, int resultCode, Intent data) • với ID mà activity cha đã cung cấp từ trước. • Nếu một activity con thất bại vì lí do nào đó (chẳng hạn crash), activity cha sẽ nhận được một kết quả trả về với giá trị RESULT_CANCELED. 38
12. Android – Intents Starting Activities and Getting Results Intent: {action + data + requestCodeID } Activity-1 startActivityForResult … … __________________ onActivityResult() … … Activity-2 _________________ onResult() … … requestCodeID resultCode optional data 39
12. Android – Intents Intents Example2. Let’s play golf - Call for a tee-time. Show all contacts and pick a particular one (Intent.ACTION_PICK). For a successful interaction the main-activity accepts the returned URI identifying the person we want to call (content://contacts/people/n). ‘Nicely’ show the selected contact’s entry allowing calling, texting, emailing actions (Intent.ACTION_VIEW). Intent.ACTION_PICK User’s main Activity-1 Built-in Activity-2 (show contact list) Contact’s Uri Call Send text message Send email Intent.ACTION_VIEW Built-in Activity-3 (show selected contact) 40
12. Android – Intents Intents Example2. Let’s play golf - Call for a tee-time. Cont. Main Activity Intent.ACTION_PICK Intent.ACTION_VIEW 41
12. Android – Intents Intents Example2 (cont.) Let’s play golf - Call for a tee-time 42 Selected contact’s URI Place the call Terminate the call
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. //IntentDemo2_Intent: making a phone call //receiving results from a sub-activity package cis493.intents; importandroid.app.Activity; importandroid.content.Intent; importandroid.net.Uri; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.*; publicclass IntentDemo2 extends Activity { TextViewlabel1; EditTexttext1; Button btnCallActivity2; 43
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. • @Override • publicvoidonCreate(Bundle savedInstanceState) { • super.onCreate(savedInstanceState); • try { • setContentView(R.layout.main); • label1 = (TextView)findViewById(R.id.label1); • text1 = (EditText)findViewById(R.id.text1); • btnCallActivity2 = (Button)findViewById(R.id.btnPickContact); • btnCallActivity2.setOnClickListener(newClickHandler()); • } • catch (Exception e) { • Toast.makeText(getBaseContext(), • e.getMessage(), Toast.LENGTH_LONG).show(); • } • }//onCreate 44
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. • privateclassClickHandlerimplementsOnClickListener { • @Override • publicvoidonClick(View v) { • try { • // myData refer to: content://contacts/people/ • String myData = text1.getText().toString(); • //you may also try ACTION_VIEW instead • Intent myActivity2 = new Intent(Intent.ACTION_PICK, • Uri.parse(myData)); • // start myActivity2. • // Tell it that our requestCodeID (or nickname) is 222 • startActivityForResult(myActivity2, 222); • // Toast.makeText(getApplicationContext(), • // "I can't wait for you", 1).show(); • } • catch (Exception e) { • label1.setText(e.getMessage()); • } • }//onClick • }//ClickHandler 45
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. • @Override • protectedvoidonActivityResult(intrequestCode, • intresultCode, • Intent data) { • super.onActivityResult(requestCode, resultCode, data); • try { • // use requestCode to find out who is talking back to us • switch (requestCode){ • case (222): { • // 222 is our friendly contact-picker activity • if (resultCode == Activity.RESULT_OK) { • String selectedContact = data.getDataString(); • // it will return an URI that looks like: • // content://contacts/people/n • // where n is the selected contacts' ID • label1.setText(selectedContact.toString()); • //show a 'nice' screen with the selected contact • Intent myAct3 = new Intent (Intent.ACTION_VIEW, • Uri.parse(selectedContact)); • startActivity(myAct3); • } Listener 46
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. • else { • //user pressed the BACK button • label1.setText("Selection CANCELLED " • + requestCode + " " + resultCode); • } • break; • } • }//switch • } • catch (Exception e) { • Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show(); • } • }// onActivityResult • }//IntentDemo2 47
12. Android – Intents Intents Example2. Calling a sub-activity, receiving results. • <?xml version="1.0" encoding="utf-8"?> • <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" • android:orientation="vertical" • android:layout_width="fill_parent" • android:layout_height="fill_parent“ > • <TextView • android:id="@+id/label1" • android:layout_width="fill_parent" • android:layout_height="wrap_content" • android:background="#ff0000cc" • android:text="This is Activity1" • android:textStyle="bold" • android:textSize="20sp“/> • <EditText • android:id="@+id/text1" • android:layout_width="fill_parent" • android:layout_height="54px" • android:text="content://contacts/people/" • android:textSize="18sp” /> • <Button • android:id="@+id/btnPickContact" • android:layout_width="149px" • android:layout_height="wrap_content" • android:text="Pick a Contact" • android:textStyle="bold“ /> • </LinearLayout> 48
12. Android – Intents Intents Example3. Showing Pictures and Video - Calling a sub-activity, receiving results. • privatevoidshowSoundTracks() { • Intent myIntent = new Intent(); • myIntent.setType("video/*, images/*"); • myIntent.setAction(Intent.ACTION_GET_CONTENT); • startActivityForResult(myIntent, 0); • }//showSoundTracks • @Override • protectedvoidonActivityResult(intrequestCode, intresultCode, Intent intent) { • super.onActivityResult(requestCode, resultCode, intent); • if ((requestCode == 0) && (resultCode == Activity.RESULT_OK)) { • String selectedImage = intent.getDataString(); • Toast.makeText(this, selectedImage, 1).show(); • // show a 'nice' screen with the selected image • Intent myAct3 = new Intent(Intent.ACTION_VIEW, Uri.parse(selectedImage)); • startActivity(myAct3); • } • }//onActivityResult All videos and all still images 49
12. Android – Intents Intents Example3. Showing Pictures and Video - Calling a sub-activity, receiving results. video 50