מדריך Windows Phone

מדריך Windows Phone – מחזור החיים של אפליקציה

‏ • Sela

בפרק זה נלמד על מחזור החיים של אפליקציה שרצה על Windows Phone.

מה הכוונה במחזור חיים של אפליקציה?

הכוונה במחזור החיים של אפליקציה היא מתי אפליקציה מופעלת ומתי היא מסתיימת. באפליקציות שרצות על Windows Phone פעולות אלו של הפעלה וסיום לא מתרחשות רק בהתחלה ובסוף! זאת מאחר ומערכת ההפעלה מותאמת לשמירת מרבית על הבטרייה ומשאבים נוספים. לצורך כך יש מצבים שבהם האפליקציה תיכנס למצב רדום (Dormant) ואפילו תיסגר לחלוטין אבל עם יכולת לחזור לתחיה (Tombstone).

 

אז מהו מחזור החיים של אפליקציה?

בראשית, כאשר אפליקציה (App) מופעלת לראשונה היא נכנסת למצב Running. בעת כניסה למצב זה בפעם הראשונה יופעל האירוע Launching. לאחר שהאפליקציה תיטען, יטען הדף (Page) הראשי ותקרא הפונקציה OnNavigatedTo של הדף, אותה ניתן לדרוס.

כעת במצב Running האפליקציה עלולה להיסגר ע"י לחיצה על מקש Back (מהמסך הראשון). במקרה שהאפליקציה תיסגר ראשית תקרא הפונקציה OnNavigatedFrom של הדף שבו היינו, אותה ניתן לדרוס . לאחר מכן יופעל האירוע Closing ואז האפליקציה תיסגר, ללא אפשרות ל"תחייה". (כמובן שאפשר להפעיל מחדש את האפליקציה אבל זו כבר תהיה ריצה חדשה נקייה).

לחילופין, ממצב Running ניתן לבצע פעולות מסוימות שיכניסו את האפליקציה למצב Dormant, פעולות לדוגמא הן לחיצה על כפתור ה Start שמחזיר את המכשיר לדף הקוביות, או שימוש באובייקט Launcher או Chooser (ילמד בהמשך המדריך) שיגרום ליציאה זמנית מהאפליקציה. במקרים שבהם האפליקציה תכנס למצב Dormant, לפני כן יופעל האירוע Deactivated.

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

  1. המשתמש יחזור להשתמש באפליקציה, אם ע"י לחיצת Back או ע"י סגירת ה Launcher או Chooser שהוא הפעיל.
  2. מערכת ההפעלה תחליט שהיא זקוקה למשאבים שאותה אפליקציה תופסת ואז תכניס את האפליקציה למצב Tombstone שבו האפליקציה לחלוטין לא נמצאת בזיכרון. מצב זה ידרוש מאתנו, המפתחים של האפליקציה, לשחזר את מצב האפליקציה כאשר היא תחזור לחיים. אם האפליקציה חוזרת לחיים (למשל, המשתמש חזר אליה ע"י לחיצה על Back) אזי מערכת ההפעלה תטען מחדש את האפליקציה.

לאחר שהייה במצב Dormant או Tombstone וחזרה לחיים ע"י המשתמש, האירוע הראשון שיופעל יהיה Activated ולאחריו תופעל פונקציית OnNavigatedTo של הדף שבו היינו לפני היציאה.

הדיאגרמה הבאה מסכמת את המצבים השונים והמעברים ביניהם:

מדריך Windows Phone – מחזור החיים

 

איך מחזור החיים משפיע על המפתח של האפליקציה?

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

נעיר כי אם חזרנו ממצב Dormant אזי אין צורך לשחזר את מצב האפליקציה מאחר וזיכרון האפליקציה נשאר (היא מעולם לא נסגרה).

 

איך שומרים את הזיכרון ואיך משחזרים אותו?

שמירת מצב האפליקציה נעשית באמצעות דריסת הפונקציה OnNavigatedFrom. השמירה נעשית לתוך תכונה בשם State שיש לכל דף (PhoneApplicationPage) באפליקציה.

להלן דוגמא לקוד שמבצע שמירת נתונים:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
  State.Clear();
  State.Add(
"has data", true
);
  State.Add(
"current user"
, _userName);
  State.Add(
"current user score", _userScore);
}

התכונה State נשמרת ע"י מערכת ההפעלה בזמן ביצוע Tombstone ומשוחזרת כאשר חוזרים ממצב Tombstone.

שחזור הנתונים נעשה באמצעות דריסת הפונקציה OnNavigatedTo. השחזור נעשה באמצעות אותה תכונה בשם State. נעיר כי במידה וחזרנו ממצב Dormant ולא ממצב Tombstone אין צורך בביצוע השחזור שכן הזיכרון לא נמחק.

להלן דוגמא לקוד שמבצע את שחזור הנתונים:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
     
if (App
.IsApplicationInstancePreserved)
      {
       
// no restore needed when returning from dormant
        return
;
      }

     
if (State.ContainsKey("has data"
))
      {
        _userName = (
string)State["current user"
];
        _userScore = (
int)State["current user score"];
      }
    }

המשתנה IsApplicationInstancePreserved נשמר בעת אירוע Activated של האפליקציה:

    public static bool IsApplicationInstancePreserved 
    {
     
get
;
     
set
;
    }

   
private void Application_Activated(object sender, ActivatedEventArgs e)
    {
      IsApplicationInstancePreserved = e.IsApplicationInstancePreserved;
    }

תגיות: , , , ,

arikp

אריק פוזננסקי הוא יועץ בכיר ומרצה בסלע. הוא השלים שני תארי B.Sc. במתמטיקה ומדעי המחשב בהצטיינות יתרה בטכניון. לאריק ידע נרחב בטכנולוגיות מיקרוסופט, כולל .NET עם C#, WPF, Silverlight, WinForms, Interop, COM/ATL, C++ Win32 ו reverse engineering.

תגובות בפייסבוק