Android - 드디어 자신의 app 에서 사용 할 서 비 스 를 적 었 습 니 다.

필요:
    (승차 요청 정보) - 백그라운드 에서 실행 되 며 승차 요청 을 받 을 수 있 도록 설정 되 어 있 고 5KM 이내 의 사용자 에 게 는 "* 사용 자 는 당신 * * 미터 거리 에서 * * 주소 에 접근 하여 * * 목적 지 를 생각 하고 탑승 을 기다 리 고 있 습 니 다. 당신 의 도움 을 받 고 싶 습 니 다!" 라 는 알림 을 받 습 니 다. 알림 은 맨 앞 창 으로 표시 되 어 알림 소 리 를 냅 니 다."승차 요청 정보". 카운트다운 10 초 후 창 이 자동 으로 닫 힙 니 다. 디자인:
    우선, 이 서 비 스 는 서버 가 보 낸 요청 메 시 지 를 계속 백 스테이지 에서 실행 하고 Activity 에 보 내야 합 니 다.
    그 다음 에 대화 상 자 를 표시 합 니 다. 물론 대화 상 자 는 사용자 의 현재 Activity 를 방해 할 수 없습니다. 여기 서 dialog 를 TYPE SYSTEM ALERT 로 설정 합 니 다.
    마지막 으로 카운트다운 10 초 를 표시 합 니 다.
초보 적 으로 실 현 된 Code (서비스 와 의 상호작용 없 음):
사용 권한 추가 필요: 
/**
 * ShareCarBGService is a service run in background and 
 * deliver msgs from server to user. 
 * Attention: build thread for self.
 * @author xinyan
 * @date 2011-10-23
 */
public class ShareCarBGService extends Service {
	public static final String TAG = "ReserveActivity";
	public static final int MSG_DIALOG_TIME_COUNT = 0;
	public static final int MSG_SHOW_REQUEST_DIALOG = 1;

	private static AlertDialog mDialog;
	private final String mDialogTitle = "      ";

	String strRequest = "**      **      **  ,  **    ,      ,        !";

	private Looper mServiceLooper;
	private ServiceHandler mServiceHandler;
	private Runnable mDialogRunnable;
	private int mTimeCount = 10;

	// Handler that receives messages from the thread
	private final class ServiceHandler extends Handler {
		public ServiceHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_DIALOG_TIME_COUNT:
				mServiceHandler.postDelayed(mDialogRunnable, 1000);
				break;
			case MSG_SHOW_REQUEST_DIALOG:
				showNewRequestDialog(strRequest);
				break;

			default:
				break;
			}

		}
	}

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

		// Start up the thread running the service. Note that we create a
		// separate thread because the service normally runs in the process's
		// main thread, which we don't want to block. We also make it
		// background priority so CPU-intensive work will not disrupt our UI.
		HandlerThread thread = new HandlerThread("ServiceStartArguments",
				Process.THREAD_PRIORITY_BACKGROUND);
		thread.start();

		// Get theHandlerThread's Looper and use it for our Handler
		mServiceLooper = thread.getLooper();
		mServiceHandler = new ServiceHandler(mServiceLooper);

		Log.v(TAG, "service started.");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {

		// For each start request, send a message to start a job and deliver the
		// start ID so we know which request we're stopping when we finish the
		// job
		Message msg = mServiceHandler.obtainMessage();
		msg.arg1 = startId;
		msg.what = MSG_SHOW_REQUEST_DIALOG;
		mServiceHandler.sendMessageDelayed(msg, 5000);

		mDialogRunnable = new Runnable() {

			@Override
			public void run() {
				if (mTimeCount > 0) {
					mDialog.setTitle(mDialogTitle + "(" + mTimeCount + ")");

					mTimeCount--;
					mServiceHandler.postDelayed(mDialogRunnable, 1000);
				} else { // 10s later, dismiss the request msg dialog.
					mDialog.dismiss();
				}
			}
		};

		Log.v(TAG, "onStartCommand");

		// If we get killed, after returning from here, restart
		return START_STICKY;
	}

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

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

		Log.v(TAG, "service destroyed.");
	}

	/**
	 * show a msg dialog when a new pickride request received.
	 * @param request the content of request
	 */
	public void showNewRequestDialog(String request) {

		// i don't know whether a static dialog can use as this.
		if (null == mDialog) {
			mDialog = new AlertDialog.Builder(this).create();
			mDialog.setTitle(mDialogTitle);
			mDialog.setMessage(request);

			// This the point, this dialog won't block the user's current
			// activity
			// via this attr
			mDialog.getWindow().setType(
					WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

			mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "  ",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.dismiss();
						}
					});
			mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "  ",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							// Bundle bundle = new Bundle();
							Intent intent = new Intent();

							intent.setClass(ShareCarBGService.this,
									ReserveRequestListTabWidgetActivity.class);
							startActivity(intent);
						}
					});
		} else {
			mDialog.setMessage(request);

		}

		mDialog.show();
		mServiceHandler.sendEmptyMessage(MSG_DIALOG_TIME_COUNT);
	}
}


좋은 웹페이지 즐겨찾기