שאלות ראיון Android ומובייל — 34 שאלות ותשובות
זמן קריאה: 8 דקות
שאלות ראיון Android ומובייל מכסות את שפת Kotlin, את מחזור החיים של Activity ו-Fragment, קונקרנטיות עם Coroutines, ארכיטקטורה (MVVM), ו-UI מודרני עם Jetpack Compose. במדריך זה ריכזנו 34 שאלות ותשובות אמיתיות מקובצות לפי נושא. Kotlin היא היום שפת הפיתוח הרשמית ל-Android, וזו נקודת מבחן מרכזית בראיונות בישראל.
Kotlin — יסודות
Kotlin היא שפת החובה לפיתוח Android מודרני, ורוב שאלות הפתיחה מתמקדות בה. ריכזנו את הבסיס בקצרה, ומעמיקים בהמשך בכל נושא. שליטה ב-null safety, ב-coroutines ובתכונות השפה היא ההבדל בין מועמד שנשמע "יודע Java עם תחביר אחר" למועמד שחושב Kotlin.
למה Kotlin ולא Java לאנדרואיד?
Kotlin תמציתית יותר, בטוחה מפני null במערכת הטיפוסים, ובעלת תכונות מודרניות (data classes, extension functions, coroutines). Google הכריזה עליה כשפה המועדפת ל-Android, והיא הסטנדרט בפיתוח חדש.
איך Kotlin מטפלת ב-null safety?
הטיפוסים מבחינים בין nullable (String?) ל-non-null (String). כדי לגשת ל-nullable משתמשים ב-safe call (?.), ב-Elvis operator (?:) לערך ברירת מחדל, או ב-!! (שזורק אם null). כך נמנעים NullPointerException בקומפילציה.
מה ההבדל בין val ל-var?
val הוא read-only (לא ניתן להשמה מחדש), var ניתן לשינוי. מעדיפים val כברירת מחדל לקוד בטוח וצפוי יותר. val אינו בהכרח immutable עמוק — האובייקט עצמו עדיין עשוי להשתנות.
מה זה data class?
data class מייצר אוטומטית equals, hashCode, toString ו-copy על בסיס השדות שבקונסטרוקטור. מיועד לאובייקטים שמחזיקים נתונים, וחוסך boilerplate רב לעומת Java.
מה זו extension function?
extension function מאפשרת להוסיף מתודה לטיפוס קיים בלי לרשת אותו או לשנות את המקור. שימושי מאוד לכתיבת קוד קריא ולפונקציות עזר, ונפוץ מאוד ב-Android.
מה ההבדל בין sealed class ל-enum?
enum מגדיר קבוצה קבועה של ערכים זהים. sealed class מגדיר היררכיה סגורה של טיפוסים שיכולים להחזיק נתונים שונים — מושלם למידול state (Loading/Success/Error) עם when ממצה.
מה ההבדל בין lazy ל-lateinit?
lazy מאתחל val פעם אחת בגישה הראשונה (thread-safe כברירת מחדל), ומתאים לחישוב יקר שאולי לא יידרש. lateinit מיועד ל-var לא-nullable שיאותחל מאוחר (למשל ב-onCreate); גישה לפניה זורקת חריגה.
מה ההבדל בין List ל-MutableList ב-Kotlin?
List הוא read-only interface — אי אפשר להוסיף או להסיר דרכו. MutableList מאפשר שינוי. חשיפת List במקום MutableList מגבירה אנקפסולציה ומונעת שינוי לא-רצוי מבחוץ. הבחנה זו נבדקת בראיון.
מחזור חיים ורכיבים
מחזור החיים הוא מקור נפוץ לבאגים ולשאלות. הטבלה מסכמת מצבים מרכזיים:
| שיטה | מתי נקראת | מה עושים בה |
|---|---|---|
| onCreate | יצירת המסך | אתחול, ניפוח layout |
| onResume | המסך בחזית | חידוש אנימציות/מצלמה |
| onPause | מאבד פוקוס | שמירה, עצירת עדכונים |
| onDestroy | סגירת המסך | שחרור משאבים |
מהו מחזור החיים של Activity?
onCreate → onStart → onResume (פעילה) → onPause → onStop → onDestroy. מבינים מתי לשמור מצב (onSaveInstanceState) ומתי לשחרר משאבים. סיבוב מסך מפעיל recreate — מקור נפוץ לבאגים.
מה ההבדל בין Activity ל-Fragment?
Activity הוא מסך עצמאי; Fragment הוא רכיב UI מודולרי שחי בתוך Activity ובעל מחזור חיים משלו. Fragments מאפשרים ריבוי-פאנלים וניהול ניווט גמיש, אך מוסיפים מורכבות במחזור החיים.
איך שומרים מצב בזמן סיבוב מסך?
ViewModel שורד את שינוי הקונפיגורציה ולכן מתאים לשמירת state של UI. onSaveInstanceState שומר מעט נתונים לשחזור אחרי הריגת התהליך. שילוב נכון מונע אובדן מידע בסיבוב.
מה זה Intent?
Intent הוא הודעה להפעלת רכיב — explicit (מסך מסוים) או implicit (פעולה כמו שיתוף שהמערכת מנתבת). מעבירים דרכו נתונים (extras) בין מסכים ואפליקציות.
מה זה RecyclerView ולמה הוא יעיל?
RecyclerView מציג רשימות ארוכות ביעילות על ידי מיחזור views שיצאו מהמסך (ViewHolder pattern), במקום ליצור view לכל פריט. חוסך זיכרון ומשפר גלילה, ומחליף את ListView הישן.
קונקרנטיות
מה זו Coroutine?
Coroutine היא מנגנון קונקרנטיות קל-משקל ב-Kotlin לכתיבת קוד אסינכרוני בסגנון סינכרוני. suspend functions משהות ומתחדשות בלי לחסום thread, מה שמחליף callbacks מקוננים בקוד קריא.
מה ההבדל בין Dispatchers.IO, Main ו-Default?
Main רץ על ה-UI thread (לעדכוני ממשק). IO מיועד לפעולות רשת ודיסק. Default מיועד לעבודה כבדת CPU. בחירת dispatcher נכונה מונעת חסימת ה-UI ו-ANR.
מה זה structured concurrency?
Coroutines חיות בתוך scope (למשל viewModelScope). כאשר ה-scope מבוטל, כל ה-coroutines שבו מבוטלות אוטומטית — מונע דליפות ועבודה מיותרת אחרי שהמסך נסגר.
מה ההבדל בין launch ל-async?
launch מפעיל coroutine שלא מחזיר תוצאה (fire-and-forget). async מחזיר Deferred שממנו מקבלים ערך עם await. משתמשים ב-async כשצריך תוצאה, ולעיתים למקבול כמה קריאות.
מה זה ANR ואיך נמנעים ממנו?
ANR (Application Not Responding) קורה כשה-UI thread חסום מעל זמן סף. נמנעים בכך שמעבירים כל עבודה כבדה (רשת, DB, חישוב) ל-thread רקע דרך coroutines עם dispatcher מתאים.
ארכיטקטורה ו-Jetpack
מה זה MVVM וכיצד הוא עובד באנדרואיד?
MVVM מפריד: View (UI) → ViewModel (state ולוגיקת תצוגה) → Model (נתונים). ה-View צופה ב-state שה-ViewModel חושף, וה-ViewModel אינו מכיר את ה-View — מה שמקל על בדיקות והפרדת אחריות.
מה זה LiveData ו-StateFlow?
שניהם מחזיקים נתונים נצפים (observable) ומודעים למחזור החיים בהתאמה. StateFlow הוא הגישה המודרנית מבוססת Coroutines, מחזיק תמיד ערך נוכחי, ומשולב היטב עם Jetpack Compose.
מה זה Jetpack Compose?
Compose הוא ה-UI toolkit ההצהרתי המודרני של Android: מתארים את ה-UI כפונקציה של state, וה-framework מרנדר מחדש כשה-state משתנה. מחליף את מערכת ה-XML ומצמצם boilerplate.
מה זה recomposition ב-Compose?
recomposition הוא הרצה מחדש של composable כשה-state שהוא קורא משתנה, כדי לעדכן את ה-UI. חשוב לכתוב composables יעילות ולהשתמש ב-remember ו-keys כדי למנוע חישובים מיותרים.
מה זה Dependency Injection ב-Android (Hilt)?
Hilt (מעל Dagger) מזריק תלויות אוטומטית ל-Activities, ViewModels ורכיבים, מנהל scopes ומחזורי חיים. חוסך יצירת אובייקטים ידנית ומקל על בדיקות והחלפת מימושים.
מה ההבדל בין Flow ל-StateFlow ב-Kotlin?
Flow הוא זרם ערכים אסינכרוני "קר" — הוא מתחיל לזרום רק כשאוספים אותו. StateFlow הוא "חם" ומחזיק תמיד ערך נוכחי יחיד, מתאים לייצוג state של UI. בממשק לרוב חושפים StateFlow, ומשתמשים ב-Flow לזרמי נתונים מ-Room או מהרשת.
מה זה Room?
Room הוא שכבת הפשטה מעל SQLite עם ולידציה בזמן קומפילציה, DAOs, ותמיכה ב-Coroutines/Flow. מקל על גישה מקומית לנתונים ומצמצם קוד boilerplate של SQLite גולמי.
מה זה Navigation Component?
Navigation Component מנהל את הניווט בין מסכים דרך גרף ניווט מרכזי, מטפל ב-back stack ובהעברת ארגומנטים בבטיחות טיפוסים (Safe Args). הוא מחליף ניהול ידני של Fragment transactions ומקטין באגים בניווט.
מה זה Repository pattern באנדרואיד?
Repository מרכז את הגישה לנתונים ומפשט אותה עבור ה-ViewModel: הוא מחליט אם למשוך מ-cache מקומי (Room) או מהרשת (Retrofit), וחושף API אחיד. כך ה-ViewModel אינו יודע מהיכן מגיעים הנתונים — הפרדת אחריות נקייה.
מעשי ומערכתי
איך מקטינים גודל APK/AAB?
עם R8/ProGuard (הסרת קוד מת וטשטוש), App Bundle (הורדה מותאמת למכשיר), אופטימיזציית משאבים ותמונות, והסרת תלויות מיותרות. גודל קטן משפר שיעורי התקנה.
איך מטפלים בהרשאות (permissions)?
הרשאות מסוכנות מתבקשות בזמן ריצה, לא רק ב-Manifest, ומסבירים למשתמש למה. בודקים אם ההרשאה ניתנה לפני כל שימוש, ומטפלים באלגנטיות במצב שבו נדחתה.
מה ההבדל בין ROOM/SQLite ל-SharedPreferences?
SharedPreferences מיועד למעט נתונים פשוטים (key-value, הגדרות). Room/SQLite מיועד לנתונים מובנים ומורכבים. בחירה שגויה (למשל אחסון רשימות ב-Prefs) פוגעת בביצועים.
מה ההבדל בין native ל-cross-platform (React Native/Flutter)?
Native (Kotlin/Swift) נותן ביצועים וגישה מלאה ל-API אך דורש קוד נפרד לכל פלטפורמה. Cross-platform משתף קוד ומקצר זמן פיתוח, במחיר של ביצועים וגמישות. הבחירה תלויה בצרכי המוצר.
מה זה WorkManager ומתי משתמשים בו?
WorkManager מריץ משימות רקע שחייבות להסתיים גם אם האפליקציה נסגרת (סנכרון, העלאת קבצים), ומתחשב במגבלות סוללה ורשת של המערכת. מתאים לעבודה מתוזמנת או מותנית, בשונה מ-coroutine קצרה בזמן הריצה.
מה ההבדל בין apply, let, run ו-with (scope functions)?
אלו פונקציות scope של Kotlin: apply מחזיר את האובייקט (הגדרת מאפיינים), let מריץ בלוק על ערך ומחזיר תוצאה (שימושי ל-null checks), run משלב בין השניים, with פועל על אובייקט נתון. בחירה נכונה משפרת קריאות.
Compose מול XML — טבלת השוואה
שאלה נפוצה היא מתי לבחור בכל גישה. הטבלה מסכמת:
| היבט | Jetpack Compose | XML Views |
|---|---|---|
| סגנון | הצהרתי (state → UI) | אימפרטיבי (findViewById) |
| כמות קוד | תמציתי | מרובה boilerplate |
| בשלות ומערכת קיימת | חדש, בפיתוח פעיל | ותיק, נפוץ בקוד קיים |
| עדכון UI | recomposition אוטומטי | עדכון ידני של views |
בחירת Dispatcher — טבלת עזר
בחירת ה-dispatcher הנכון היא מקור נפוץ לבאגים ולשאלות בראיון:
| סוג עבודה | Dispatcher | דוגמה |
|---|---|---|
| עדכון ממשק | Main | שינוי טקסט, ניווט |
| רשת ודיסק | IO | קריאת API, גישה ל-DB |
| חישוב כבד | Default | מיון, עיבוד רשימות |
טעויות נפוצות בראיון מובייל
- לחסום את ה-UI thread: עבודה כבדה ב-Main גורמת ל-ANR.
- דליפות זיכרון: החזקת הפניה ל-Context/Activity אחרי onDestroy.
- התעלמות ממחזור חיים: עדכון UI אחרי שהמסך כבר לא פעיל.
- שימוש ב-!! ללא צורך: מבטל את null safety של Kotlin.
- לא לטפל בסיבוב מסך: אובדן state בשינוי קונפיגורציה.
מיני-צ'קליסט להכנה לראיון Android
- לשלוט ב-Kotlin: null safety, data classes, sealed classes.
- להבין מחזור חיים של Activity/Fragment ושמירת state.
- לתרגל Coroutines, dispatchers ו-structured concurrency.
- לדעת MVVM, StateFlow/LiveData ו-Hilt.
- להכיר Jetpack Compose ו-recomposition.
- להכין דיון על native מול cross-platform.
למסלול הכניסה לתפקיד ראו איך הופכים למפתח Frontend, ולרוחב שאלות ה-frontend את שאלות ראיון Frontend/React. מוכנים? עיינו במשרות Kotlin ובכלל המשרות הפתוחות.
שאלות נפוצות
כמה משרות מובייל/Kotlin יש בישראל כרגע?
נכון להיום פתוחות אצלנו ב-HiTakeJob 15 משרות שמזכירות Kotlin. שוק המובייל בישראל ממוקד יחסית, ולצד Android יש ביקוש ל-iOS ולפתרונות cross-platform, ולכן כדאי להיערך בהתאם.
האם חייבים לדעת Kotlin לפיתוח Android?
כן, Kotlin היא היום השפה הרשמית והמועדפת ל-Android. אמנם עדיין קיים קוד Java רב, אך פיתוח חדש נכתב ב-Kotlin, ומראיינים מצפים לשליטה ב-null safety, coroutines ותכונות השפה.
על מה הכי שמים דגש בראיון Android?
על מחזור החיים של רכיבים, Coroutines וניהול threads (למניעת ANR), ארכיטקטורת MVVM, וניהול state. בפרויקטים מודרניים מוסיפים Jetpack Compose. הבנת ניהול הזיכרון והדליפות חשובה מאוד.
האם כדאי ללמוד Jetpack Compose או XML?
Compose הוא העתיד וכיוון הפיתוח החדש, וכדאי מאוד להכיר אותו. עם זאת, פרויקטים קיימים רבים עדיין מבוססי XML, ולכן היכרות עם שתי הגישות נותנת יתרון בשוק.
מה ההבדל בין ראיון מובייל לג'וניור לסניור?
לג'וניור: Kotlin, מחזור חיים ו-UI בסיסי. לסניור: ארכיטקטורה, ניהול state מורכב, ביצועים וזיכרון, בחירות native מול cross-platform, ותכנון מודולרי של אפליקציה בקנה מידה.