ה-Implicit Intent היא הודעה הנשלחת בלי כתובת יעד. יעד ההודעה יקבע על-פי הפרמטרים המוצמדים להודעה:
- Activity
- Category
- Data
שני פוסטים קודמים דנו בנושא ה-Intent:
Intents - מבוא להעברת הודעות במערכת
Explicit Intent - העברת הודעות בין Activities -עם דוגמא.
Intents - מבוא להעברת הודעות במערכת
Explicit Intent - העברת הודעות בין Activities -עם דוגמא.
מומלץ לקרוא אותם קודם.
בכל אופן, ניקח את הדוגמא של ה- Explicit Intent, ובשינויים קלים נהפוך אותה ל-Implicit Intent.
תאור האפליקציה:
- ה-Activity השולח ישלח Implicit Intent שאליו הוצמד Action , ויחכה לתגובה.
- ה-Activity המקבל ירשם ב-Intent Filter כמתאים לקבלת ה-Action הנ"ל.
- ה-Activity השולח והמקבל שייכים לאפליקציות שונות (בדוגמא ל- Exlicit השולח והמקבל היו באותה אפליקציה, אבל גם שם ניתן לשלוח הודעה בין אפליקציות).
- מקבל ההודעה ישלח תגובה חזרה, שתודפס על המסך של יוזם ה-Intent המקורי.
- שליחת ההודעה מופעלת עם כפתור.
כך נראית התצוגה לאחר קבלת התשובה:
נציג את הקוד. הוא כאמור מתפרס על שני פרוייקטים - משדר ומקלט - אותם צריך לקמפל ולטעון בנפרד.
נתחיל עם משדר ההודעה.
רק שורה אחת שונתה לעומת המשדר של ה-Explicit Message.
הנה ה-class :
- public class MessageCalling extends Activity {
- public final static int RECEIVE_MESSAGE = 0;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button sendMessage = (Button) findViewById(R.id.send);
- Button CleanScreen = (Button) findViewById(R.id.clean);
- sendMessage.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- TextView msg2screen = (TextView)findViewById(R.id.pong_message);
- msg2screen.setText("");
- Intent pingIntent = new Intent();
- pingIntent.setAction("com.ahs.ronen.identify");
- // pingIntent.setClass(MessageCalling.this, MessageReceiving.class);
- pingIntent.putExtra( "extra1", new String( "Message Received: Can you hear us?" ) );
- startActivityForResult(pingIntent, RECEIVE_MESSAGE);
- }
- });
- CleanScreen.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- TextView msg2screen = (TextView)findViewById(R.id.pong_message);
- msg2screen.setText("");
- }
- });
- }
- protected void onActivityResult(int requestCode, int resultCode, Intent data){
- switch(requestCode) {
- case RECEIVE_MESSAGE:
- String rec1 = data.getStringExtra("extra1");
- Integer rec2 = data.getIntExtra("extra2",0);
- if( rec1 != null ) {
- TextView msg2screen = (TextView)findViewById(R.id.pong_message);
- msg2screen.setText( rec1 + " " + rec2);
- }
- }
- }
- }
יש כאן שתי מתודות:
- onCreate
- onActivityResult.
רק שורה אחת מהקוד של ה-Explicit שונתה:
ב-onCreate במקום שורה 16, בה נקבע יעד ההודעה, (ראה למעלה, מסומנת כהערה), נוספה שורה15, בה מוצמד להודעה ה-Action:
ingIntent.setAction("com.ahs.ronen.identify");
לא נצלול לפרטים, רק נזכיר מספר דגשים:
- כדי לקבל הודעה זו, על המקלט להוסיף ל-intent filter את ה-Action הנ"ל.
- ה-intent נשלח תוך שימוש במתודה startActivityForResult, כך שמצפים לקבל תגובה מהצד השני שישלח כשהוא יסיים פעולתו. התגובה תטופל על ידי onActivityResult.
- כרגיל אצל אנדרואיד, מערכת ההודעה-תגובה היא אסינכרונית. הצד השולח ממשיך בפעולתו, ועם קבלת התשובה ה-callback הנ"ל יופעל.
- ניתן היה לשלוח את ה-intent בלי לצפות לתגובה עם המתודה startActivity.
- הסבר מפורט לקוד זה יש כמובן באותו פוסט קודם.
נעבור למקלט.
כאן נתעניין בשני קבצים:
- ה-manifest.xml שם מוגדר ה-Intent Filter.
- class ה-ג'אווה שלמעשה לא השתנה, למעט הוצאת הדפסות מיותרות למסך, והחלפת תוכן התשובה.
הנה המניפסט:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.ahs.androheb.implicitintent"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MyImplicitIntentReceive"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="com.ahs.ronen.identify" />
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="8" />
- </manifest>
דגשים בנוגע לקובץ זה:
- בשורות 10-11 מוגדר ה-intent filter המתאים.
- למרות שה-Category לא הוגדר (הוא Don't Care), חייבים להוסיף את ה-Default ראה שורה 11, אלא אם היה מוגדר פילטר נוסף עם Action MAIN.
- הוצאתי את ה-intent filter עם ה-Action MAIN, כך שה-Activity הזה לא יתעורר בהפעלה, אלא רק ע"י ה-intent שלנו.
נציג את class הג'אווה. הוא כאמור זהה לההוא של ה-Explicit למעט שינויים קוסמטיים הכוללים ביטול הדפסות ושינוי תוכן ההודעה החוזרת.
- public class MyImplicitIntentReceive extends Activity {
- /** Called with the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- String extraMsg1 = getIntent().getExtras().getString("extra1");
- if( ( extraMsg1 != null ) ) {
- }
- else
- {
- Log.e("Received Extra is null", "null");
- }
- Intent pongIntent = new Intent();
- pongIntent.putExtra("extra1", "Response Implicit Intent received: Yes, we can hear yall!");
- pongIntent.putExtra("extra2", new Integer(777) );
- setResult(RESULT_OK,pongIntent);
- finish();
- }
- }
רק המתודה onCreate ממומשת.
בשורה 9 נשלפף שדה ה-extra מה-intent שהתקבל.
בשורה 16 יוצרים intent תשובה, ומכניסים לא שני שדות extra שיודפסו על המסך של המקבל.
היי רונן, לינק להורדה לא פועל. תודה רבה על הפוסט :)
השבמחקסידרתי את זה. אתר איחסון הקבצים עושה בעיות.
השבמחק