יום ראשון, נובמבר 28

Notifications

 notification - מה עושים עם זה? מדובר במנגנון לשליחת הודעות למשתמש. ההודעות יכללו בד"כ הצבת icon ב-status bar, טקסט ראשוני שמופיע עם הגעת ה-notification, טקסט, ואף אפשרות להפעלת צליל, רעידות (vibrations), והפעלת אור.

נתחיל עם הצגת שני מסכים לדוגמא. בראשון מופיע ה-icon של ה-notification בצד שמאל למעלה. בשני, מופיע חלון תצוגת ה-notifications. חלון זה אפשר לפתוח דרך התפריט הראשי או ע"י גרירת פס הפנל העליון כלפי מטה.

תמונה מס 1: Notification Icon



תמונה מס 2: Notifications Window








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

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

 תמונה מס 3: כפתורי ההפעלה.


איך שולחים notification?
....אז שנעבור לתכלס? יש צורך לטפל בשני classes.
  1. Notification class  - משמש להגדרת המאפיינים של ה- notification. 
  2. NotificationManager class - אחראי על הטיפול בכל ה-notifications בכל המערכת. הוא מקבל את אובייקט ה-notification שמכיל את הגדרות המאפיינים, ומבצע את פעולת השליחה.

 נפרט את שלבי יצירת ה-notification שלב אחרי שלב.


שלב 1: יצירת אובייקט של class ה-Notifications.
יצירת האובייקט דורשת הגדרה של 3 מאפיינים:
  1. ה-Icon שיופיע על ה-toobar.
  2. tickerText - הטקסט שיופיע על ה-toolbar ברגע הופעת ה- notification.
  3. when - השעה שתוצג ב-notification.
והנה קטע הקוד שיוצר את אובייקט ה-Notification.

  1. int icon = R.drawable.icon;
  2. CharSequence tickerText = "Read tickerText!";
  3. long when = System.currentTimeMillis();
  4. final Notification mNotification = new Notification(icon, tickerText, when);

שורה 1: נשתמש בקובץ icon.png שנמצא ב-/res/drawable
שורה 2: tickerText - זה הטקסט שיוצג לפרק זמן קצר עם הופעת ה-notification.
שורה 3: השעה שתופיע עם ההודעה (במקרה שלנו יוצג הזמן האמיתי ) - ראה 11:38 בתמונה מס 2 למעלה.
שורה 4: ה-constructor יוצר את האובייקט.



שלב 2: הוספת 3 מאפיינים נוספים ל-notification, תוך שימוש במתודה setLatestEventInfo:
המאפיינים הנוספים:
1. הכותרת:  contentTitle - ראה שורה 1 כאן למטה.
2. תוכן הודעת הטקסט - ראה שורה 2.
3. ה-intent שיופעל עם הפעלת ה-notification. נסתכל על הקוד ואחכ" נרחיב את ההסבר על בניית ה-intent.
 קטע הקוד לפניכם:



  1. String contentTitle = "Content Title";
  2. String contentText = "Click to enter my Blog";
  3. Intent mIntent = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://ronenhalevy-android.blogspot.com/"));
  4. PendingIntent mPendingIntent = PendingIntent.getActivity(this, 0, mIntent, 0);
  5. mNotification.setLatestEventInfo(this, contentTitle, contentText, mPendingIntent);



המשך הסבר ה-intent : ל-notification יכולת להפעיל Activity חדש בעזרת ה-intent המצורף אליו. לצורך זה, צריך לבנות אובייקט מסוג PendingIntent (שורות 3 ו-4).   זהו  intent המיועד להרצה ע"י גורם שלישי. נבנה את ה-PendingIntent בשני שלבים:
א. יצירת ה-intent הרגיל (שורה 3). בדוגמא זו, ה-intent יפעיל Browser וייגש לבלוג הזה.
ב. יצירת  אובייקט ה-PendingIntent תוך שימוש במתודה getActivity (שורה 4). המתודה getActivity מקבלת 4 פרמטרים:
  1. ה-context שבו ה-pending intent יתחיל את ה-Activity החדש.
  2. request code - לא בשימוש. שמנו 0.
  3. ה-intent
  4. flags - אפשר לבחור את הדגלים הבאים. אנחנו לא הדלקנו אף דגל. 

  • FLAG_CANCEL_CURRENT 

  • FLAG_NO_CREATE 

  • FLAG_ONE_SHOT

  • FLAG_UPDATE_CURRENT

כעת כששלושת הפרמטרים הנוספים מוכנים, נוסיף אותם ל-notification -  שורה 5 כאן למעלה.

שלב 3: הוספת קול, ויברציות ואור להודעה.

נדגים את היכולת להוסיף אמצי התרעה נוספים להודעה.

3.א. הוספת קול:
 mNotification.sound = Uri.parse("file:///sdcard/notifications/test_cbr.mp3");

היה אפשר להשתמש בצלילים המובנים במערכת עבור notifiation, אך משום מה האמולטור מכיל רק אופציה אחת - והיא גם ה-default שלו: silence. לא נראה שאפשר לשנות את זה...לכן, לצורך הדגמת אפקט הוספת הצליל, נאלצתי לשים את קובץ השמע ב-sdcard ולהשתמש בו.
הפעולות להעתקת הקובץ ל- sdcard דרך ה-command line לפניכם:לעבור לספריית tools ולבצע:



  1. ./adb shell
  2. cd /sdcard
  3. mkdir ./notifications
  4. exit
  5.  ./adb push test_cbr.mp3 /sdcard/notifications/test_cbr.mp3

אפשר להפעיל את פקודת ה-put גם מתוך ה-eclipse דרך ה-DDMS.

אגב, הדרך הקלה להוספת קול היא ע"י:
mNotification.defaults |= Notification.DEFAULT_SOUND;
אך כפי שציינתי, ה-Default Sound באמולטור הוא silence ואני לא בטוח אם אפשר לשנות את זה.


3.ב. הוספת ויברציה.

אפשר להוסיף את הויברציה הדיפולטיבית:
mNotification.defaults |= Notification.DEFAULT_VIBRATE;
ואפשר להגדיר ויברציה כך:

  1. long[] vibrate = {0,100,200,300};
  2. mNotification.vibrate = vibrate;
כאשר שורה 1 מתארת את משך האינטרוולים off/on במילי שניה.
הערה חשובה: שמוש בויברציות מחייב הוספת שורת הרשאה ב-manfifest.xml. אחרת יתקבל exception.
שורת ההרשאה לפניכם: (ראו את קובץ המניפסט בחבילת הקבצים)

<uses-permission android:name="android.permission.VIBRATE"/>
בכל אופן, הויברציה לא עובדת באמולטור.

3. ג. הפעלת אורות.
גם כאן, ניתן להשתמש ב-default:
mNotification.defaults |= Notification.DEFAULT_LIGHTS;
או להגדיר צבעים\אלפא וזמני on ו-off:

  1.        mNotification.ledARGB = 0xff000000;
  2.        mNotification.ledOnMS = 200;
  3.        mNotification.ledOffMS = 600;
  4.        mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
 בינתיים גם זה לא עובד באמולטור.

סיימנו את הכנת אובייקט ה-notification.

נעבור לטיפול באובייקט השני: ה- NotificationManager.

שלב 4: יצירת האובייקט.
הגדרנו  את האובייקט:
private NotificationManager mNotificationManager;
כעת ניצור אותו ע"י שימוש ב-getSystemService.
mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
היות שמדובר באובייקט מערכתי שמנהל את ה-notifications של כל המערכת, לא יוצרים instance שלו אלא יוצרים אותו ע"י  getSystemService.
הכל מוכן. אפשר להפעיל.
שלב 5: הפעלת והפסקת ה-notification. בתוכנית הדוגמא, ההפעלה וההפסקה של ה-notification נעשות ע"י כפתורים ב-UI והפעולות מתבצעות ב-onClick callback של כפתור ההפעלה וההפסקה בהתאמה.


הפעלת ה-notification:

            mNotificationManager.notify(MY_NOTFICATION_ID, mNotification);

הפסקת ה-notification:

            mNotificationManager.cancel(MY_NOTFICATION_ID);

הקבוע MY_NOTFICATION_ID, משמש לצורך התייחסות ל-notification, כך שהוא צריך להיות ערך בלעדי בתוך האפליקציה.



 ->שימו לב - הקובץ test_cbr.mp3 המשמש להתראה הקולית מצורף לחבילה. צריך להעתיק אותו ל-sdcard - ראה הנחיות למעלה.




4 תגובות:

  1. יש אופצייה לטעון את הקובץ מתקיית ASSET של הפרוייקט :
    mNotification.sound = Uri.parse("file:///android_asset/test_cbr.mp3");

    אני לא בטוח אם זה יעבוד ביחד אם Notification צריך לבדוק .

    אם זה לא עובד , אפשר להכליל את הקובץ בתקיית res/ASSET ואם ההפעלה הראשונה של התוכנית להעתיק את הקובץ לתקייה שרוצים בכרטיס , כך בכל התקנה יהיה את הצלילים שרוצים.

    השבמחק
  2. האם ידועה לך על אופציה להלביש מספר על ICON , כמו שיש בIPHONE .
    למשל כמו לדוגמא כאשר מגיעה הודאה חדשה שיופיעה 1 מעל הICON של קיצור הדרך להודעות .

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

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

    notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

    השבמחק