מתן הרשאה לאפליקציות אחרות להתחיל את הפעילות

אם האפליקציה יכולה לבצע פעולה שעשויה להיות מועילה לאפליקציה אחרת, להכין אותו להגיב לבקשות פעולה באמצעות ציון מסנן ה-Intent המתאים בפעילות שלכם.

לדוגמה, אם לפתח אפליקציה חברתית שיכולה לשתף הודעות או תמונות עם החברים של המשתמש, תומכים ב-Intent ACTION_SEND. לאחר מכן, כשמשתמשים יוזמים פעולת 'שיתוף' פעולה מאפליקציה אחרת, האפליקציה שלכם מופיעה כאפשרות תיבת הדו-שיח של הבורר (שנקראת גם תיבת דו-שיח של הבהרה), כפי שמוצג באיור 1.

איור 1. תיבת הדו-שיח של הבורר.

כדי לאפשר לאפליקציות אחרות להתחיל את הפעילות כך, צריך להוסיף <intent-filter> בקובץ המניפסט של הרכיב <activity> המתאים.

כשהאפליקציה שלך מותקנת במכשיר, המערכת מזהה את הכוונה שלך מסנן ומוסיף את המידע לקטלוג פנימי של Intents שנתמכים על ידי כל האפליקציות המותקנות. כשאפליקציה מתקשרת ל-startActivity() או ל-startActivityForResult() מתוך כוונה מרומזת, המערכת מחפשת פעילויות שיכולות להגיב בכוונה טובה.

הוספה של מסנן Intent

כדי להגדיר בצורה נכונה עם אילו כוונות הפעילות שלך יכולה לטפל, צריך להגדיר כל מסנן Intent שמוסיפים ספציפי ככל האפשר מבחינת סוג הפעולה והנתונים שהפעילות מקבל.

המערכת עשויה לשלוח Intent נתון לפעילות, אם הפעילות מסנן Intent שעונה על הקריטריונים הבאים של האובייקט Intent:

פעולה
מחרוזת עם שם לפעולה שצריך לבצע. בדרך כלל אחד מהערכים שמוגדרים על ידי הפלטפורמה, כגון בתור ACTION_SEND או ACTION_VIEW.

מציינים זאת במסנן Intent באמצעות הרכיב <action>. הערך שמציינים ברכיב הזה צריך להיות שם המחרוזת המלא של הפעולה, במקום שם המחרוזת. קבוע API, כפי שמוצג בדוגמאות בדף הזה.

נתונים
תיאור של הנתונים שמשויכים ל-Intent.

מציינים זאת במסנן Intent באמצעות הרכיב <data>. שימוש באחד או מאפיינים נוספים ברכיב הזה, ניתן לציין סוג MIME, קידומת URI, סכימת URI, או שילוב של האפשרויות האלה ואחרים שמציין את סוג הנתונים. התקבל.

הערה: אם אין לכם צורך להצהיר פרטים על הנתונים Uri, למשל מתי שמטפל בפעילות שלך סוג אחר של 'תוספת תקציב' במקום URI, מציינים רק את המאפיין android:mimeType שבו רוצים להצהיר על סוג הנתונים נתונים שמטפלים בפעילות שלך, למשל text/plain או image/jpeg.

קטגוריה
מספק דרך נוספת לאפיין את הפעילות שמטפלת בכוונה, בדרך כלל קשורה לתנועה או למיקום שמהם היא התחילה. יש כמה קטגוריות שונות נתמכים על ידי המערכת, אך רובם נמצאים בשימוש לעיתים רחוקות. עם זאת, כל הכוונות המרומזות מוגדרות באמצעות CATEGORY_DEFAULT כברירת מחדל.

יש לציין זאת במסנן Intent באמצעות התג <category> לרכיב מסוים.

במסנן Intent אתם יכולים להצהיר אילו קריטריונים הפעילות שלכם מקבלת באמצעות הצהרה על כל אחד מהם עם רכיבי XML תואמים, בתוך התג <intent-filter> לרכיב מסוים.

לדוגמה, זו פעילות עם מסנן Intent שמטפל ב-Intent ACTION_SEND כשסוג הנתונים הוא טקסט או תמונה:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

טיפ: אם רוצים שהסמל בתיבת הדו-שיח של הבורר יהיה שונה מסמל ברירת המחדל של הפעילות שלך, הוסף את android:icon ב<intent-filter> לרכיב מסוים.

כל Intent נכנס מציין רק פעולה אחת וסוג נתונים אחד, אבל מותר להצהיר על כמה פעולות את המופעים של הרכיבים <action>, <category> ו-<data> בכל אחד מהרכיבים <intent-filter>.

אם שני צמדים של פעולה ונתונים ייחודיים את ההתנהגות שלהם, ליצור מסנני Intent נפרדים כדי לציין אילו פעולות קבילות. כשיש התאמה עם אילו סוגי נתונים.

לדוגמה, נניח שהפעילות שלך מטפלת גם בטקסט וגם בתמונות עבור ה-Intent ACTION_SEND וגם ב-ACTION_SENDTO. במקרה כזה צריך להגדיר מסנני Intent לשתי הפעולות, כי ה-Intent מסוג ACTION_SENDTO חייב להשתמש בנתונים Uri כדי לציין כתובת של הנמען באמצעות סכימת ה-URI send או sendto. אפשר לראות זאת בדוגמה הבאה:

<activity android:name="ShareActivity">
    <!-- Filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- Filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

הערה: כדי לקבל כוונות מרומזות, צריך לכלול את הקטגוריה CATEGORY_DEFAULT במסנן Intent. השיטות startActivity() ו-startActivityForResult() מתייחסות לכל הכוונות כאילו הן הצהרת על הקטגוריה CATEGORY_DEFAULT. אם לא תצהירו על כך במסנן Intent, שום כוונות מרומזות לא קשורות לפעילות שלכם.

למידע נוסף על שליחה וקבלה של ACTION_SEND של כוונות שמבצעות התנהגויות של שיתוף ברשתות חברתיות, ראו קבלת נתונים פשוטים מאפליקציות אחרות. אפשר גם למצוא מידע שימושי על שיתוף נתונים ב: שיתוף נתונים פשוטים וכן שיתוף קבצים.

טיפול בכוונה בפעילות שלכם

כדי להחליט איזו פעולה לבצע בפעילות שלך, כדאי לקרוא את Intent המשמש להפעלתו.

כשהפעילות מתחילה, צריך להתקשר למספר getIntent() כדי לאחזר את Intent שהתחיל את הפעילות. אפשר לעשות את זה בכל שלב במהלך במחזור החיים של הפעילות, אבל בדרך כלל עושים זאת במהלך קריאה חוזרת (callbacks) מוקדמים, כמו onCreate() או onStart().

אפשר לראות זאת בדוגמה הבאה:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.main)

    val data: Uri? = intent?.data

    // Figure out what to do based on the intent type
    if (intent?.type?.startsWith("image/") == true) {
        // Handle intents with image data
    } else if (intent?.type == "text/plain") {
        // Handle intents with text
    }
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text
    }
}

החזרת תוצאה

כדי להחזיר תוצאה לפעילות שהפעילה את שלך, יש להתקשר למספר setResult() ולציין את קוד התוצאה והתוצאה Intent. כשהפעולה מסתיימת והמשתמש חוזר לדף המקורי פעילות, יש להתקשר אל finish() למספר לסגור את הפעילות שלכם ולהרוס אותה. אפשר לראות זאת בדוגמה הבאה:

Kotlin

// Create intent to deliver some kind of result data
Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result ->
    setResult(Activity.RESULT_OK, result)
}
finish()

Java

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();

תמיד צריך לציין קוד תוצאה עם התוצאה. בדרך כלל זה RESULT_OK או RESULT_CANCELED. לאחר מכן אפשר לספק נתונים נוספים באמצעות Intent, לפי הצורך.

הערה: התוצאה המוגדרת היא RESULT_CANCELED כברירת מחדל. כך, אם המשתמש מקיש על לפני השלמת הפעולה ולפני הגדרת התוצאה, הפעילות המקורית מקבלת העמודה 'מבוטלת' תוצאה אחת.

אם אתם פשוט צריכים להחזיר מספר שלם שמציין אחת מכמה אפשרויות של תוצאות, תוכלו להגדיר את קוד התוצאה לכל ערך שגדול מ-0. אם משתמשים בקוד התוצאה כדי להעביר מספר שלם אין צורך לכלול את Intent, אפשר להתקשר אל setResult() ולהעביר רק את קוד התוצאה:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

במקרה כזה, ייתכן שיהיו רק מעט תוצאות אפשריות, לכן קוד התוצאה הוא מקומי מספר שלם מוגדר (גדול מ-0). זה פועל היטב כאשר מחזירים תוצאה לפעילות באפליקציה שלך, כי הפעילות שמקבלת את התוצאה עשויה להתייחס לציבור קבוע כדי לקבוע את הערך של קוד התוצאה.

הערה:אין צורך לבדוק אם הפעילות התחילה עם startActivity() או startActivityForResult(). צריך פשוט להתקשר למספר setResult() אם מדובר בהכוונה שהחלה את הפעילות יכולה לצפות לתוצאה. אם פעילות המקור שנקראת startActivityForResult(), המערכת מספקת אותה התוצאה שסיפקת ל-setResult(); אחרת, המערכת תתעלם מהתוצאה.