2013년 7월 14일 일요일

Android의 서비스를 이해해보자 (2)Service class

2.Service -------------------------------------------------------------------------------------------------------------------------
package bit.java39.servicetest;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.widget.Toast;

public class NewsService extends Service {
 boolean mQuit;

 // Service life cycle
 // startService called => onCreate called => onStartCommand / onBind =>
 // onDestory

 @Override
 public void onCreate() {
  super.onCreate();
 }

 // -intent : 클라이언트가 서비스를 시작할 때 전달한 인텐트
 // -flags : 서비스의 요청에 대한 추가 정보
 // -startID : 서비스 요청에 대한 고유 식별번호. 차후 stopSelfResult 메서드로 서비스가
 // 스스로 종료할 때 식별자로 이용한다.
 // -return value : 서비스의 동작모드를 지정하는데 주로 접착식과 비접착식 둘 중 하나를 리턴한다.
 // 접착식은 시작과 종료가 명시적이고 비접착식은 명령을 처리하는 동안만 실행된다는 점이 다르며 프로세스가
 // 강제종료 될 때 재시작 여부가 다르다.
 // -서비스는 프로세스의 메인스레드에서 실행되므로 너무 오래 시간을 끌거나 블로킹해서는 안된다.
 // 즉시 리턴해야 하므로 오래 걸리는 작업이나 지속적으로 해야 할 작업은 반드시 스레드로 분리해야한다.
 // 데몬(Unix 용어:일반적으로 생각하는 백그라운드 서비스)의 경우는 지속적으로 실행되어야 하므로
 // 스레드를 생성하여 실행시키는 것이 보통이다.
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {

  super.onStartCommand(intent, flags, startId);

  mQuit = false;
  NewsThread thread = new NewsThread(this, mHandler);
  thread.start();

  // START_STICKY : START_STICKY 형태로 호출된 Service 는
  // null Intent 가 담긴 onStartCommand() 콜백 함수가 호출된다.
  return START_STICKY;
 }

 @Override
 public void onDestroy() {
  super.onDestroy();

  Toast.makeText(this, "Service End", Toast.LENGTH_SHORT).show();
  mQuit = true;
 }

 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }

 class NewsThread extends Thread {
  NewsService mParent;
  Handler mHandler;
  String[] arrNews = { "신창근", "이현진", "최준석", "임정현", "박용성", "김홍준" };

  public NewsThread(NewsService parent, Handler handler) {
   mParent = parent;
   mHandler = handler;
  }

  public void run() {
   for (int i = 0; mQuit == false; i++) {
    Message msg = new Message();
    msg.what = 0;
    msg.obj = arrNews[i % arrNews.length];
    mHandler.sendMessage(msg);
    try { Thread.sleep(5000); } catch (Exception e) {}
   }
  }
 }

 Handler mHandler = new Handler() {
  public void handleMessage(Message msg) {
   if (msg.what == 0) {
    String news = (String) msg.obj;
    Toast.makeText(NewsService.this, news, Toast.LENGTH_SHORT).show();
   }
  }
 };
}

댓글 없음:

댓글 쓰기