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