| /** |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.util; |
| |
| import android.app.Service; |
| import android.content.Intent; |
| import android.os.Handler; |
| import android.os.IBinder; |
| import android.os.Message; |
| import android.os.Messenger; |
| import android.util.Slog; |
| |
| /** |
| * A service that receives Intents and IBinder transactions |
| * as messages via an AsyncChannel. |
| * <p> |
| * The Start Intent arrives as CMD_ASYNC_SERVICE_ON_START_INTENT with msg.arg1 = flags, |
| * msg.arg2 = startId, and msg.obj = intent. |
| * <p> |
| */ |
| abstract public class AsyncService extends Service { |
| private static final String TAG = "AsyncService"; |
| |
| protected static final boolean DBG = true; |
| |
| /** The command sent when a onStartCommand is invoked */ |
| public static final int CMD_ASYNC_SERVICE_ON_START_INTENT = IBinder.LAST_CALL_TRANSACTION; |
| |
| /** The command sent when a onDestroy is invoked */ |
| public static final int CMD_ASYNC_SERVICE_DESTROY = IBinder.LAST_CALL_TRANSACTION + 1; |
| |
| /** Messenger transport */ |
| protected Messenger mMessenger; |
| |
| /** Message Handler that will receive messages */ |
| Handler mHandler; |
| |
| public static final class AsyncServiceInfo { |
| /** Message Handler that will receive messages */ |
| public Handler mHandler; |
| |
| /** |
| * The flags returned by onStartCommand on how to restart. |
| * For instance @see android.app.Service#START_STICKY |
| */ |
| public int mRestartFlags; |
| } |
| |
| AsyncServiceInfo mAsyncServiceInfo; |
| |
| /** |
| * Create the service's handler returning AsyncServiceInfo. |
| * |
| * @return AsyncServiceInfo |
| */ |
| abstract public AsyncServiceInfo createHandler(); |
| |
| /** |
| * Get the handler |
| */ |
| public Handler getHandler() { |
| return mHandler; |
| } |
| |
| /** |
| * onCreate |
| */ |
| @Override |
| public void onCreate() { |
| super.onCreate(); |
| mAsyncServiceInfo = createHandler(); |
| mHandler = mAsyncServiceInfo.mHandler; |
| mMessenger = new Messenger(mHandler); |
| } |
| |
| /** |
| * Sends the CMD_ASYNC_SERVICE_ON_START_INTENT message. |
| */ |
| @Override |
| public int onStartCommand(Intent intent, int flags, int startId) { |
| if (DBG) Slog.d(TAG, "onStartCommand"); |
| |
| Message msg = mHandler.obtainMessage(); |
| msg.what = CMD_ASYNC_SERVICE_ON_START_INTENT; |
| msg.arg1 = flags; |
| msg.arg2 = startId; |
| msg.obj = intent; |
| mHandler.sendMessage(msg); |
| |
| return mAsyncServiceInfo.mRestartFlags; |
| } |
| |
| /** |
| * Called when service is destroyed. After returning the |
| * service is dead an no more processing should be expected |
| * to occur. |
| */ |
| @Override |
| public void onDestroy() { |
| if (DBG) Slog.d(TAG, "onDestroy"); |
| |
| Message msg = mHandler.obtainMessage(); |
| msg.what = CMD_ASYNC_SERVICE_DESTROY; |
| mHandler.sendMessage(msg); |
| } |
| |
| /** |
| * Returns the Messenger's binder. |
| */ |
| @Override |
| public IBinder onBind(Intent intent) { |
| return mMessenger.getBinder(); |
| } |
| } |