Android - เจตนาและตัวกรอง
แอนดรอยด์ Intentเป็นคำอธิบายนามธรรมของการดำเนินการที่จะดำเนินการ สามารถใช้กับstartActivity เพื่อเปิดตัวกิจกรรม broadcastIntent เพื่อส่งไปยังส่วนประกอบ BroadcastReceiver ที่สนใจและ startService(Intent) หรือ bindService(Intent, ServiceConnection, int) เพื่อสื่อสารกับบริการพื้นหลัง
The intent itself, an Intent object, is a passive data structure holding an abstract description of an operation to be performed.
ตัวอย่างเช่นสมมติว่าคุณมีกิจกรรมที่ต้องเปิดโปรแกรมรับส่งอีเมลและส่งอีเมลโดยใช้อุปกรณ์ Android ของคุณ เพื่อจุดประสงค์นี้กิจกรรมของคุณจะส่ง ACTION_SEND ไปพร้อมกับความเหมาะสมchooserไปยัง Android Intent Resolver ตัวเลือกที่ระบุจะให้อินเทอร์เฟซที่เหมาะสมสำหรับผู้ใช้ในการเลือกวิธีการส่งข้อมูลอีเมลของคุณ
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));
ไวยากรณ์ด้านบนเรียกใช้เมธอด startActivity เพื่อเริ่มกิจกรรมอีเมลและผลลัพธ์ควรเป็นดังที่แสดงด้านล่าง -
ตัวอย่างเช่นสมมติว่าคุณมีกิจกรรมที่ต้องเปิด URL ในเว็บเบราว์เซอร์บนอุปกรณ์ Android ของคุณ เพื่อจุดประสงค์นี้กิจกรรมของคุณจะส่ง ACTION_WEB_SEARCH Intent ไปยัง Android Intent Resolver เพื่อเปิด URL ที่กำหนดในเว็บเบราว์เซอร์ Intent Resolver จะแยกวิเคราะห์ตามรายการกิจกรรมและเลือกกิจกรรมที่ตรงกับความตั้งใจของคุณมากที่สุดในกรณีนี้คือกิจกรรมเว็บเบราว์เซอร์ Intent Resolver จะส่งผ่านหน้าเว็บของคุณไปยังเว็บเบราว์เซอร์และเริ่มกิจกรรมเว็บเบราว์เซอร์
String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
ตัวอย่างด้านบนจะค้นหาเป็น tutorialspoint บนเครื่องมือค้นหาของ Android และให้ผลลัพธ์ของการสอนจุดในกิจกรรมของคุณ
มีกลไกแยกต่างหากสำหรับการส่งมอบความตั้งใจให้กับองค์ประกอบแต่ละประเภท ได้แก่ กิจกรรมบริการและเครื่องรับสัญญาณออกอากาศ
ซีเนียร์ No | วิธีการและคำอธิบาย |
---|---|
1 | Context.startActivity() Intent object จะถูกส่งผ่านไปยังเมธอดนี้เพื่อเปิดใช้งานกิจกรรมใหม่หรือรับกิจกรรมที่มีอยู่เพื่อทำสิ่งใหม่ |
2 | Context.startService() Intent object ถูกส่งผ่านไปยังเมธอดนี้เพื่อเริ่มต้นบริการหรือส่งคำสั่งใหม่ไปยังบริการที่กำลังดำเนินอยู่ |
3 | Context.sendBroadcast() Intent object จะถูกส่งผ่านไปยังเมธอดนี้เพื่อส่งข้อความไปยังเครื่องรับการออกอากาศที่สนใจทั้งหมด |
วัตถุเจตนา
วัตถุเจตนาคือชุดข้อมูลที่ใช้โดยส่วนประกอบที่รับเจตนาเช่นเดียวกับข้อมูลที่ระบบ Android ใช้
วัตถุแสดงเจตจำนงสามารถมีส่วนประกอบต่อไปนี้ตามสิ่งที่กำลังสื่อสารหรือกำลังจะดำเนินการ -
หนังบู๊
นี่เป็นส่วนบังคับของอ็อบเจ็กต์ Intent และเป็นสตริงที่ตั้งชื่อแอ็คชันที่จะดำเนินการ - หรือในกรณีของการออกอากาศ Intent การกระทำที่เกิดขึ้นและกำลังถูกรายงาน การดำเนินการส่วนใหญ่กำหนดว่าส่วนที่เหลือของวัตถุเจตนามีโครงสร้างอย่างไร ชั้น Intent กำหนดค่าคงที่ของการดำเนินการจำนวนหนึ่งที่สอดคล้องกับเจตนาที่แตกต่างกัน นี่คือรายการการดำเนินการตามเจตจำนงมาตรฐานของAndroid
การดำเนินการในวัตถุเจตนาสามารถตั้งค่าได้โดยเมธอด setAction () และอ่านโดย getAction ()
ข้อมูล
เพิ่มข้อกำหนดข้อมูลไปยังตัวกรองความตั้งใจ ข้อกำหนดอาจเป็นเพียงชนิดข้อมูล (แอตทริบิวต์ mimeType) เพียง URI หรือทั้งชนิดข้อมูลและ URI URI ถูกระบุโดยแอตทริบิวต์แยกต่างหากสำหรับแต่ละส่วน -
แอตทริบิวต์เหล่านี้ที่ระบุรูปแบบ URL เป็นทางเลือก แต่ยังขึ้นอยู่กันด้วย -
- หากไม่ได้ระบุรูปแบบสำหรับตัวกรองความตั้งใจแอ็ตทริบิวต์ URI อื่น ๆ ทั้งหมดจะถูกละเว้น
- หากไม่ได้ระบุโฮสต์สำหรับตัวกรองแอ็ตทริบิวต์พอร์ตและแอ็ตทริบิวต์พา ธ ทั้งหมดจะถูกละเว้น
เมธอด setData () ระบุข้อมูลเป็น URI เท่านั้น setType () ระบุเป็นประเภท MIME เท่านั้นและ setDataAndType () ระบุเป็นทั้ง URI และชนิด MIME URI ถูกอ่านโดย getData () และพิมพ์ตาม getType ()
ตัวอย่างบางส่วนของคู่การกระทำ / ข้อมูล ได้แก่ -
ซีเนียร์ | คู่การกระทำ / ข้อมูลและคำอธิบาย |
---|---|
1 | ACTION_VIEW content://contacts/people/1 แสดงข้อมูลเกี่ยวกับบุคคลที่มีตัวระบุคือ "1" |
2 | ACTION_DIAL content://contacts/people/1 แสดงหมายเลขโทรศัพท์พร้อมกับบุคคลที่กรอกข้อมูล |
3 | ACTION_VIEW tel:123 แสดงหมายเลขโทรศัพท์พร้อมหมายเลขที่ระบุ |
4 | ACTION_DIAL tel:123 แสดงหมายเลขโทรศัพท์พร้อมหมายเลขที่ระบุ |
5 | ACTION_EDIT content://contacts/people/1 แก้ไขข้อมูลเกี่ยวกับบุคคลที่มีตัวระบุคือ "1" |
6 | ACTION_VIEW content://contacts/people/ แสดงรายชื่อบุคคลซึ่งผู้ใช้สามารถเรียกดูได้ |
7 | ACTION_SET_WALLPAPER แสดงการตั้งค่าสำหรับการเลือกวอลเปเปอร์ |
8 | ACTION_SYNC มันจะซิงโครไนซ์ข้อมูลค่าคงที่คือ android.intent.action.SYNC |
9 | ACTION_SYSTEM_TUTORIAL มันจะเริ่มบทช่วยสอนที่กำหนดแพลตฟอร์ม (บทแนะนำเริ่มต้นหรือบทช่วยสอนเริ่มต้น) |
10 | ACTION_TIMEZONE_CHANGED มันใกล้ชิดเมื่อโซนเวลาเปลี่ยนไป |
11 | ACTION_UNINSTALL_PACKAGE ใช้เพื่อเรียกใช้โปรแกรมถอนการติดตั้งเริ่มต้น |
ประเภท
หมวดหมู่เป็นส่วนเสริมของ Intent object และเป็นสตริงที่มีข้อมูลเพิ่มเติมเกี่ยวกับประเภทของส่วนประกอบที่ควรจัดการกับ Intent เมธอด addCategory () วางหมวดหมู่ในวัตถุ Intent, removeCategory () ลบหมวดหมู่ที่เพิ่มไว้ก่อนหน้านี้และ getCategories () รับชุดของหมวดหมู่ทั้งหมดที่อยู่ในออบเจ็กต์ นี่คือรายการของAndroid เจตนาหมวดหมู่มาตรฐาน
คุณสามารถตรวจสอบรายละเอียดเกี่ยวกับ Intent Filters ในส่วนด้านล่างเพื่อทำความเข้าใจว่าเราใช้หมวดหมู่เพื่อเลือกกิจกรรมที่เหมาะสมกับ Intent ได้อย่างไร
พิเศษ
สิ่งนี้จะอยู่ในคู่คีย์ - ค่าสำหรับข้อมูลเพิ่มเติมที่ควรส่งไปยังองค์ประกอบที่จัดการความตั้งใจ ความพิเศษสามารถตั้งค่าและอ่านได้โดยใช้เมธอด putExtras () และ getExtras () ตามลำดับ นี่คือรายการข้อมูลเพิ่มเติมสำหรับAndroid Intent Standard
ธง
แฟล็กเหล่านี้เป็นส่วนเสริมของ Intent object และสั่งให้ระบบ Android เปิดใช้งานกิจกรรมและวิธีปฏิบัติหลังจากเปิดตัวเป็นต้น
ซีเนียร์ No | ธงและคำอธิบาย |
---|---|
1 | FLAG_ACTIVITY_CLEAR_TASK หากตั้งค่าใน Intent ที่ส่งผ่านไปยัง Context.startActivity () แฟล็กนี้จะทำให้งานที่มีอยู่ซึ่งจะเกี่ยวข้องกับกิจกรรมถูกล้างก่อนที่กิจกรรมจะเริ่มต้น นั่นคือกิจกรรมจะกลายเป็นรูทใหม่ของงานที่ว่างเปล่าและกิจกรรมเก่า ๆ จะเสร็จสิ้น สามารถใช้ร่วมกับ FLAG_ACTIVITY_NEW_TASK เท่านั้น |
2 | FLAG_ACTIVITY_CLEAR_TOP หากตั้งค่าไว้และกิจกรรมที่กำลังเรียกใช้กำลังทำงานอยู่ในงานปัจจุบันแล้วแทนที่จะเปิดอินสแตนซ์ใหม่ของกิจกรรมนั้นกิจกรรมอื่น ๆ ทั้งหมดที่อยู่ด้านบนจะถูกปิดและเจตจำนงนี้จะถูกส่งไปยัง (ตอนนี้บน ด้านบน) กิจกรรมเก่าเป็นเจตนาใหม่ |
3 | FLAG_ACTIVITY_NEW_TASK โดยทั่วไปแล้วแฟล็กนี้ใช้โดยกิจกรรมที่ต้องการนำเสนอลักษณะการทำงานของรูปแบบ "ตัวเรียกใช้งาน" โดยจะให้รายการสิ่งต่างๆที่สามารถทำได้แก่ผู้ใช้ซึ่งจะทำงานโดยไม่ขึ้นกับกิจกรรมที่เปิดใช้งาน |
ชื่อส่วนประกอบ
ช่องที่ไม่บังคับนี้คือแอนดรอยด์ ComponentNameอ็อบเจ็กต์ที่เป็นตัวแทนของคลาส Activity, Service หรือ BroadcastReceiver หากมีการตั้งค่าวัตถุ Intent จะถูกส่งไปยังอินสแตนซ์ของคลาสที่กำหนดมิฉะนั้น Android จะใช้ข้อมูลอื่นในวัตถุ Intent เพื่อค้นหาเป้าหมายที่เหมาะสม
ชื่อคอมโพเนนต์ถูกกำหนดโดย setComponent (), setClass () หรือ setClassName () และอ่านโดย getComponent ()
ประเภทของเจตนา
มี Intent สองประเภทที่รองรับโดย Android
เจตนาที่ชัดเจน
เจตนาที่ชัดเจนจะเชื่อมต่อกับโลกภายในของแอปพลิเคชันสมมติว่าคุณต้องการเชื่อมต่อกิจกรรมหนึ่งกับกิจกรรมอื่นเราสามารถอ้างถึงโดยเจตนาที่ชัดเจนด้านล่างภาพกำลังเชื่อมต่อกิจกรรมแรกกับกิจกรรมที่สองโดยคลิกที่ปุ่ม
เจตจำนงเหล่านี้กำหนดองค์ประกอบเป้าหมายตามชื่อและโดยทั่วไปจะใช้สำหรับข้อความภายในแอปพลิเคชันเช่นกิจกรรมเริ่มต้นบริการรองหรือเปิดตัวกิจกรรมน้องสาว ตัวอย่างเช่น -
// Explicit Intent by specifying its class name
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
// Starts TargetActivity
startActivity(i);
เจตนาโดยปริยาย
Intent เหล่านี้ไม่ได้ตั้งชื่อเป้าหมายและฟิลด์สำหรับชื่อส่วนประกอบจะเว้นว่างไว้ เจตนาโดยปริยายมักใช้เพื่อเปิดใช้งานส่วนประกอบในแอปพลิเคชันอื่น ๆ ตัวอย่างเช่น -
Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);
โค้ดด้านบนจะให้ผลลัพธ์ตามที่แสดงด้านล่าง
องค์ประกอบเป้าหมายที่ได้รับความตั้งใจสามารถใช้ไฟล์ getExtras()วิธีการรับข้อมูลเพิ่มเติมที่ส่งโดยคอมโพเนนต์ต้นทาง ตัวอย่างเช่น -
// Get bundle object at appropriate place in your code
Bundle extras = getIntent().getExtras();
// Extract data using passed keys
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงการทำงานของ Android Intent เพื่อเปิดใช้งานแอปพลิเคชันในตัวของ Android ต่างๆ
ขั้นตอน | คำอธิบาย |
---|---|
1 | คุณจะใช้ Android สตูดิโอ IDE ในการสร้างแอพลิเคชัน Android และชื่อเป็นแอพลิเคชันของฉันภายใต้แพคเกจcom.example.saira_000.myapplication |
2 | แก้ไขไฟล์src / main / java / MainActivity.javaและเพิ่มรหัสเพื่อกำหนดผู้ฟังสองคนที่สอดคล้องกันสองปุ่มคือ เริ่มเบราว์เซอร์และเริ่มโทรศัพท์ |
3 | แก้ไขไฟล์ XML เค้าโครงres / layout / activity_main.xmlเพื่อเพิ่มปุ่มสามปุ่มในเลย์เอาต์เชิงเส้น |
4 | เรียกใช้แอปพลิเคชันเพื่อเปิดโปรแกรมจำลอง Android และตรวจสอบผลลัพธ์ของการเปลี่ยนแปลงที่ทำในแอปพลิเคชัน |
ต่อไปนี้เป็นเนื้อหาของไฟล์กิจกรรมหลักที่แก้ไข src/com.example.My Application/MainActivity.java.
package com.example.saira_000.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("tel:9510300000"));
startActivity(i);
}
});
}
}
ต่อไปนี้จะเป็นเนื้อหาของ res/layout/activity_main.xml ไฟล์ -
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Browser"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Phone"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>
ต่อไปนี้จะเป็นเนื้อหาของ res/values/strings.xml เพื่อกำหนดค่าคงที่ใหม่สองค่า -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Applicaiton</string>
</resources>
ต่อไปนี้เป็นเนื้อหาเริ่มต้นของ AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.saira_000.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ลองเรียกใช้ไฟล์ My Applicationใบสมัคร ฉันถือว่าคุณได้สร้างไฟล์AVDในขณะที่ทำการตั้งค่าสภาพแวดล้อม ในการเรียกใช้แอพจาก Android Studio ให้เปิดไฟล์กิจกรรมของโปรเจ็กต์ของคุณแล้วคลิก
ตอนนี้คลิกที่ Start Browser ซึ่งจะเริ่มต้นเบราว์เซอร์ที่กำหนดค่าและแสดง http://www.example.com ดังที่แสดงด้านล่าง -
ในทำนองเดียวกันคุณสามารถเปิดอินเทอร์เฟซโทรศัพท์โดยใช้ปุ่มเริ่มโทรศัพท์ซึ่งจะช่วยให้คุณสามารถหมุนหมายเลขโทรศัพท์ที่ระบุไว้แล้วได้
ตัวกรองเจตนา
คุณได้เห็นแล้วว่า Intent ถูกใช้เพื่อเรียกกิจกรรมอื่นอย่างไร ระบบปฏิบัติการ Android ใช้ตัวกรองเพื่อระบุชุดของกิจกรรมบริการและตัวรับการออกอากาศที่สามารถจัดการกับเจตจำนงด้วยความช่วยเหลือของชุดการกระทำหมวดหมู่โครงร่างข้อมูลที่เกี่ยวข้องกับ Intent ที่ระบุ คุณจะใช้<intent-filter> องค์ประกอบในไฟล์รายการเพื่อแสดงรายการการกระทำหมวดหมู่และประเภทข้อมูลที่เกี่ยวข้องกับกิจกรรมบริการหรือเครื่องรับสัญญาณออกอากาศ
ต่อไปนี้เป็นตัวอย่างส่วนหนึ่งของ AndroidManifest.xml ไฟล์เพื่อระบุกิจกรรม com.example.My Application.CustomActivity ซึ่งสามารถเรียกใช้โดยการกระทำที่กล่าวถึงสองประเภทหนึ่งหมวดหมู่และข้อมูลเดียว -
<activity android:name=".CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.My Application.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
เมื่อกำหนดกิจกรรมนี้พร้อมกับตัวกรองที่กล่าวถึงข้างต้นแล้วกิจกรรมอื่น ๆ จะสามารถเรียกใช้กิจกรรมนี้โดยใช้ไฟล์ android.intent.action.VIEWหรือใช้ไฟล์ com.example.My Application.LAUNCH การดำเนินการจัดให้มีหมวดหมู่ android.intent.category.DEFAULT.
<data> องค์ประกอบระบุประเภทข้อมูลที่คาดหวังโดยกิจกรรมที่จะเรียกและตัวอย่างข้างต้นกิจกรรมที่กำหนดเองของเราคาดว่าข้อมูลจะเริ่มต้นด้วย "http: //"
อาจมีสถานการณ์ที่เจตนาสามารถผ่านตัวกรองของกิจกรรมหรือบริการมากกว่าหนึ่งรายการผู้ใช้อาจถูกถามว่าจะเปิดใช้งานองค์ประกอบใด จะมีการเพิ่มข้อยกเว้นหากไม่พบเป้าหมาย
มีการทดสอบการตรวจสอบ Android ดังต่อไปนี้ก่อนที่จะเรียกใช้กิจกรรม -
ตัวกรอง <intent-filter> อาจแสดงรายการมากกว่าหนึ่งการกระทำดังที่แสดงด้านบน แต่รายการนี้ต้องไม่ว่างเปล่า ตัวกรองต้องมีองค์ประกอบ <action> อย่างน้อยหนึ่งองค์ประกอบมิฉะนั้นจะปิดกั้นเจตนาทั้งหมด หากมีการกล่าวถึงการกระทำมากกว่าหนึ่งรายการ Android จะพยายามจับคู่การกระทำที่กล่าวถึงก่อนที่จะเรียกใช้กิจกรรม
ตัวกรอง <intent-filter> อาจแสดงรายการเป็นศูนย์หนึ่งหรือมากกว่าหนึ่งหมวดหมู่ หากไม่มีหมวดหมู่ที่กล่าวถึง Android จะผ่านการทดสอบนี้เสมอ แต่หากมีการกล่าวถึงมากกว่าหนึ่งหมวดหมู่เพื่อเจตนาที่จะผ่านการทดสอบหมวดหมู่ทุกหมวดหมู่ในวัตถุเจตนาจะต้องตรงกับหมวดหมู่ในตัวกรอง
แต่ละองค์ประกอบ <data> สามารถระบุ URI และประเภทข้อมูล (ประเภทสื่อ MIME) มีแอตทริบิวต์แยกต่างหากเช่นscheme, host, portและ pathสำหรับแต่ละส่วนของ URI วัตถุเจตนาที่มีทั้ง URI และชนิดข้อมูลจะส่งผ่านส่วนประเภทข้อมูลของการทดสอบก็ต่อเมื่อประเภทของวัตถุนั้นตรงกับประเภทที่แสดงในตัวกรอง
ตัวอย่าง
ตัวอย่างต่อไปนี้เป็นการปรับเปลี่ยนตัวอย่างข้างต้น ที่นี่เราจะดูว่า Android แก้ปัญหาความขัดแย้งได้อย่างไรหากเจตนาหนึ่งเรียกกิจกรรมสองอย่างที่กำหนดไว้ในถัดไปวิธีเรียกใช้กิจกรรมที่กำหนดเองโดยใช้ตัวกรองและอันที่สามเป็นกรณียกเว้นหาก Android ไม่ยื่นกิจกรรมที่เหมาะสมซึ่งกำหนดไว้สำหรับเจตนา
ขั้นตอน | คำอธิบาย |
---|---|
1 | คุณจะใช้ android studio เพื่อสร้างแอปพลิเคชัน Android และตั้งชื่อเป็นMy Applicationภายใต้แพ็คเกจcom.example.tutorialspoint7.myapplication . |
2 | แก้ไขไฟล์src / Main / Java / MainActivity.javaและเพิ่มโค้ดเพื่อกำหนดตัวฟังสามตัวที่สอดคล้องกับปุ่มสามปุ่มที่กำหนดในไฟล์เค้าโครง |
3 | เพิ่มไฟล์src / Main / Java / CustomActivity.javaใหม่เพื่อให้มีกิจกรรมที่กำหนดเองหนึ่งกิจกรรมซึ่งจะถูกเรียกใช้โดย Intent ต่างๆ |
4 | แก้ไขไฟล์ XML เค้าโครงres / layout / activity_main.xmlเพื่อเพิ่มปุ่มสามปุ่มในเลย์เอาต์เชิงเส้น |
5 | เพิ่มไฟล์ XML เค้าโครงres / layout / custom_view.xmlเพื่อเพิ่ม <TextView> แบบง่ายเพื่อแสดงข้อมูลที่ส่งผ่านความตั้งใจ |
6 | แก้ไขAndroidManifest.xmlเพื่อเพิ่ม <intent-filter> เพื่อกำหนดกฎสำหรับความตั้งใจในการเรียกใช้กิจกรรมที่กำหนดเอง |
7 | เรียกใช้แอปพลิเคชันเพื่อเปิดโปรแกรมจำลอง Android และตรวจสอบผลลัพธ์ของการเปลี่ยนแปลงที่ทำในแอปพลิเคชัน |
ต่อไปนี้เป็นเนื้อหาของไฟล์กิจกรรมหลักที่แก้ไข src/MainActivity.java.
package com.example.tutorialspoint7.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button b1,b2,b3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b2 = (Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.
tutorialspoint7.myapplication.
LAUNCH",Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b3 = (Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.
My Application.LAUNCH",
Uri.parse("https://www.example.com"));
startActivity(i);
}
});
}
}
ต่อไปนี้เป็นเนื้อหาของไฟล์กิจกรรมหลักที่แก้ไข src/com.example.My Application/CustomActivity.java.
package com.example.tutorialspoint7.myapplication;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}
ต่อไปนี้จะเป็นเนื้อหาของ res/layout/activity_main.xml ไฟล์ -
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.tutorialspoint7.myapplication.MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Browser"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start browsing with launch action"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignEnd="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exceptional condition"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_toStartOf="@+id/editText"
android:layout_alignParentEnd="true" />
</RelativeLayout>
ต่อไปนี้จะเป็นเนื้อหาของ res/layout/custom_view.xml ไฟล์ -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/show_data"
android:layout_width="fill_parent"
android:layout_height="400dp"/>
</LinearLayout>
ต่อไปนี้จะเป็นเนื้อหาของ res/values/strings.xml เพื่อกำหนดค่าคงที่ใหม่สองค่า -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>
ต่อไปนี้เป็นเนื้อหาเริ่มต้นของ AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.tutorialspoint7.myapplication.CustomActivity">
<intent-filter>
<action android:name = "android.intent.action.VIEW" />
<action android:name = "com.example.tutorialspoint7.myapplication.LAUNCH" />
<category android:name = "android.intent.category.DEFAULT" />
<data android:scheme = "http" />
</intent-filter>
</activity>
</application>
</manifest>
ลองเรียกใช้ไฟล์ My Applicationใบสมัคร ฉันถือว่าคุณได้สร้างไฟล์AVDในขณะที่ทำการตั้งค่าสภาพแวดล้อม หากต้องการเรียกใช้แอปจาก Android Studio ให้เปิดไฟล์กิจกรรมของโครงการแล้วคลิก
ตอนนี้เริ่มจากปุ่มแรก "เริ่มเบราว์เซอร์ด้วย VIEW Action" ที่นี่เราได้กำหนดกิจกรรมที่กำหนดเองของเราด้วยตัวกรอง "android.intent.action.VIEW" และมีกิจกรรมเริ่มต้นหนึ่งกิจกรรมที่ต่อต้านการกระทำ VIEW ที่กำหนดโดย Android ซึ่งกำลังเปิดตัวเว็บเบราว์เซอร์ดังนั้น android จึงแสดงสองตัวเลือกต่อไปนี้เพื่อเลือกกิจกรรมที่คุณ ต้องการเปิดตัว
ตอนนี้ถ้าคุณเลือกเบราว์เซอร์ Android จะเปิดเว็บเบราว์เซอร์และเปิดเว็บไซต์ example.com แต่ถ้าคุณเลือกตัวเลือก IndentDemo Android จะเปิด CustomActivity ซึ่งไม่ทำอะไรเลยนอกจากจับข้อมูลที่ส่งผ่านและแสดงในมุมมองข้อความดังนี้ -
ย้อนกลับไปโดยใช้ปุ่มย้อนกลับและคลิกที่ปุ่ม "เริ่มเบราว์เซอร์พร้อมกับการเปิดตัวการกระทำ" ที่นี่ Android ใช้ตัวกรองเพื่อเลือกกำหนดกิจกรรมและเพียงแค่เปิดกิจกรรมที่คุณกำหนดเอง
ย้อนกลับไปอีกครั้งโดยใช้ปุ่มย้อนกลับและคลิกที่ปุ่ม "เงื่อนไขข้อยกเว้น" ที่นี่ Android พยายามค้นหาตัวกรองที่ถูกต้องสำหรับเจตนาที่กำหนด แต่ไม่พบกิจกรรมที่ถูกต้องที่กำหนดไว้เนื่องจากในครั้งนี้เราใช้ข้อมูลเป็น https แทน http แม้ว่าเราจะดำเนินการที่ถูกต้องดังนั้น Android จึงยกข้อยกเว้นและแสดงหน้าจอต่อไปนี้ -