Monday, April 25, 2011

תכנות לאנדרואיד בקלות פרק 13 – עבודה ברקע – Services

תכנות לאנדרואיד בקלות
פרק 13 – עבודה ברקע – Services
מהם services? למעשה ניתן לסווג אותם כתהליכים שרצים ברקע, ללא תלות באפליקציה
לדוגמא: שעון הוא service, שעון מעורר, מזג אוויר, מד סוללה, כל אלה הם services שאינם "אפליקציות במלוא מובן המילה" ורוב הפעמים גם אין להם ממשק משתמש – UI
מדוע אנחנו צריכים services?
מכיוון שאנחנו צריכים תהליכים שירוצו ברקע ללא התערבות שלנו, לדוגמא:
Facebook, במידה וישנם עדכונים רלוונטים, אני צריך לקבל עדכון, דהיינו יש update service שרץ ברקע ודוגם את השרת כל X שניות/דקות לקבלת מידע חדש, כנ"ל עבור gmail, calendar וכו..
מה אנחנו צריכים בשביל לפתח service?
1. להצהיר עליו ב manifest שלנו, בדיוק כמו שהיינו עושים עם Activity בצורה הבאה:
<service android:enabled="true" android:name=".MyService" />
כאשר ה name שלו הוא אותו השם של ה Class אותו נכתוב בסעיף הבא.
2. לכתוב את ה Service עצמו:
מדובר ב service שמתחיל לנגן קובץ מדיה כשלוחצים על play, ועוצר כשלוחצים על stop
כמו כן, מציג חיווים מתאימים לגבי הstate של ה service ברגע שישנם שינויים ע"י Toast messages
// must extend Service Class
public class MyService extends Service {
private static final String TAG = "MyService";
MediaPlayer player;
//must implement
@Override
public IBinder onBind(Intent intent) {
return null;
}
//must implement
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
player = MediaPlayer.create(this, R.raw.braincandy);
player.setLooping(false); // Set looping
}
// what to do when stoping service
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
player.stop();
}
// what to do when service starts
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
player.start();
}
}
3. לקרוא ל service מתוך Activity
למעשה יש לנו כאן שני כפתורים, שע"פ ה id שלהם אנחנו יודעים מה לעשות אל מול ה service
או להתחיל אותו (ניגון של קובץ המדיה) או להפסיק אותו (הפסקה של ניגון קובץ המדיה)
אנו מעבירים intent ל Service שבעצם כולל את הcontext הנוכחי ואת החתימה של ה Service
MyService.class.
public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
Log.d(TAG, "onClick: starting srvice");
startService(new Intent(this, MyService.class));
break;
case R.id.buttonStop:
Log.d(TAG, "onClick: stopping srvice");
stopService(new Intent(this, MyService.class));
break;
}
}