1d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville/** 2d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Copyright (C) 2010 The Android Open Source Project 3d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 4d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * you may not use this file except in compliance with the License. 6d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * You may obtain a copy of the License at 7d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 8d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 10d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Unless required by applicable law or agreed to in writing, software 11d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * See the License for the specific language governing permissions and 14d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * limitations under the License. 15d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 16d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 17d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savillepackage com.android.internal.util; 18d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 19d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.app.Service; 20d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.content.Intent; 21d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Handler; 22d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.IBinder; 23d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Message; 24d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Messenger; 25d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.util.Slog; 26d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 27d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville/** 28d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * A service that receives Intents and IBinder transactions 29d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * as messages via an AsyncChannel. 30d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * <p> 31d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * The Start Intent arrives as CMD_ASYNC_SERVICE_ON_START_INTENT with msg.arg1 = flags, 32d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg2 = startId, and msg.obj = intent. 33d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * <p> 34d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 35d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleabstract public class AsyncService extends Service { 36d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static final String TAG = "AsyncService"; 37d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 38d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville protected static final boolean DBG = true; 39d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 40d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The command sent when a onStartCommand is invoked */ 41d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public static final int CMD_ASYNC_SERVICE_ON_START_INTENT = IBinder.LAST_CALL_TRANSACTION; 42d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 43d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The command sent when a onDestroy is invoked */ 44d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public static final int CMD_ASYNC_SERVICE_DESTROY = IBinder.LAST_CALL_TRANSACTION + 1; 45d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 46d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Messenger transport */ 47d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville protected Messenger mMessenger; 48d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 49d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Message Handler that will receive messages */ 50d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Handler mHandler; 51d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 52d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public static final class AsyncServiceInfo { 53d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Message Handler that will receive messages */ 54d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Handler mHandler; 55d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 56d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 57d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * The flags returned by onStartCommand on how to restart. 58d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * For instance @see android.app.Service#START_STICKY 59d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 60d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public int mRestartFlags; 61d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 62d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 63d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville AsyncServiceInfo mAsyncServiceInfo; 64d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 65d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 66d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Create the service's handler returning AsyncServiceInfo. 67d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 68d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return AsyncServiceInfo 69d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 70d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville abstract public AsyncServiceInfo createHandler(); 71d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 72d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 73d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Get the handler 74d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 75d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Handler getHandler() { 76d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return mHandler; 77d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 78d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 79d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 80d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * onCreate 81d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 82d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 83d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onCreate() { 84d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville super.onCreate(); 85d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mAsyncServiceInfo = createHandler(); 86d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mHandler = mAsyncServiceInfo.mHandler; 87d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mMessenger = new Messenger(mHandler); 88d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 89d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 90d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 91d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends the CMD_ASYNC_SERVICE_ON_START_INTENT message. 92d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 93d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 94d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public int onStartCommand(Intent intent, int flags, int startId) { 95d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) Slog.d(TAG, "onStartCommand"); 96d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 97d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = mHandler.obtainMessage(); 98d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = CMD_ASYNC_SERVICE_ON_START_INTENT; 99d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = flags; 100d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = startId; 101d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = intent; 102d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mHandler.sendMessage(msg); 103d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 104d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return mAsyncServiceInfo.mRestartFlags; 105d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 106d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 107d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 108d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Called when service is destroyed. After returning the 109f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * service is dead and no more processing should be expected 110d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * to occur. 111d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 112d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 113d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onDestroy() { 114d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) Slog.d(TAG, "onDestroy"); 115d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 116d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = mHandler.obtainMessage(); 117d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = CMD_ASYNC_SERVICE_DESTROY; 118d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mHandler.sendMessage(msg); 119d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 120d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 121d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 122d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Returns the Messenger's binder. 123d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 124d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 125d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public IBinder onBind(Intent intent) { 126d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return mMessenger.getBinder(); 127d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 128d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville} 129