Service.java revision 1066cbcac08268e2254ed6818181949d83e9ba1c
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
27d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.util.Log;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Service is an application component that runs in the background, not
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interacting with the user, for an indefinite period of time.  Each service
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class must have a corresponding
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestService <service>}
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * declaration in its package's <code>AndroidManifest.xml</code>.  Services
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be started with
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#startService Context.startService()} and
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#bindService Context.bindService()}.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that services, like other application objects, run in the main
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * thread of their hosting process.  This means that, if your service is going
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do any CPU intensive (such as MP3 playback) or blocking (such as
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * networking) operations, it should spawn its own thread in which to do that
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * work.  More information on this can be found in
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#procthread">Application Fundamentals:
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Processes and Threads</a>.</p>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Service class is an important part of an
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">application's overall lifecycle</a>.</p>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here:
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ServiceLifecycle">Service Lifecycle</a>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ServiceLifecycle"></a>
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Service Lifecycle</h3>
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are two reasons that a service can be run by the system.  If someone
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls {@link android.content.Context#startService Context.startService()} then the system will
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieve the service (creating it and calling its {@link #onCreate} method
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed) and then call its {@link #onStart} method with the
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * arguments supplied by the client.  The service will at this point continue
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running until {@link android.content.Context#stopService Context.stopService()} or
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #stopSelf()} is called.  Note that multiple calls to
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.startService() do not nest (though they do result in multiple corresponding
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls to onStart()), so no matter how many times it is started a service
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be stopped once Context.stopService() or stopSelf() is called.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clients can also use {@link android.content.Context#bindService Context.bindService()} to
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtain a persistent connection to a service.  This likewise creates the
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * service if it is not already running (calling {@link #onCreate} while
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doing so), but does not call onStart().  The client will receive the
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.IBinder} object that the service returns from its
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onBind} method, allowing the client to then make calls back
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the service.  The service will remain running as long as the connection
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is established (whether or not the client retains a reference on the
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * service's IBinder).  Usually the IBinder returned is for a complex
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface that has been <a href="{@docRoot}guide/developing/tools/aidl.html">written
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in aidl</a>.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A service can be both started and have connections bound to it.  In such
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a case, the system will keep the service running as long as either it is
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * started <em>or</em> there are one or more connections to it with the
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#BIND_AUTO_CREATE Context.BIND_AUTO_CREATE}
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flag.  Once neither
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of these situations hold, the service's {@link #onDestroy} method is called
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the service is effectively terminated.  All cleanup (stopping threads,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unregistering receivers) should be complete upon returning from onDestroy().
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a>
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3>
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Global access to a service can be enforced when it is declared in its
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manifest's {@link android.R.styleable#AndroidManifestService &lt;service&gt;}
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag.  By doing so, other applications will need to declare a corresponding
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission &lt;uses-permission&gt;}
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * element in their own manifest to be able to start, stop, or bind to
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the service.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition, a service can protect individual IPC calls into it with
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permissions, by calling the
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #checkCallingPermission}
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method before executing the implementation of that call.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a>
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3>
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Android system will attempt to keep the process hosting a service
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * around as long as the service has been started or has clients bound to it.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When running low on memory and needing to kill existing processes, the
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * priority of a process hosting the service will be the higher of the
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following possibilities:
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><p>If the service is currently executing code in its
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate onCreate()}, {@link #onStart onStart()},
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link #onDestroy onDestroy()} methods, then the hosting process will
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a foreground process to ensure this code can execute without
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being killed.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><p>If the service has been started, then its hosting process is considered
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be less important than any processes that are currently visible to the
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user on-screen, but more important than any process not visible.  Because
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only a few processes are generally visible to the user, this means that
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the service should not be killed except in extreme low memory conditions.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><p>If there are clients bound to the service, then the service's hosting
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process is never less important than the most important client.  That is,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if one of its clients is visible to the user, then the service itself is
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * considered to be visible.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note this means that most of the time your service is running, it may
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be killed by the system if it is under heavy memory pressure.  If this
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * happens, the system will later try to restart the service.  An important
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * consequence of this is that if you implement {@link #onStart onStart()}
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to schedule work to be done asynchronously or in another thread, then you
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may want to write information about that work into persistent storage
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * during the onStart() call so that it does not get lost if the service later
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * gets killed.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Other application components running in the same process as the service
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (such as an {@link android.app.Activity}) can, of course, increase the
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * importance of the overall
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process beyond just the importance of the service itself.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Service extends ContextWrapper implements ComponentCallbacks {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Service";
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Service() {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(null);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Return the application that owns this service. */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Application getApplication() {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mApplication;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system when the service is first created.  Do not call this method directly.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate() {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system every time a client explicitly starts the service by calling
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Context#startService}, providing the arguments it supplied and a
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unique integer token representing the start request.  Do not call this method directly.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent supplied to {@link android.content.Context#startService},
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  as given.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startId A unique integer representing this specific request to
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                start.  Use with {@link #stopSelfResult(int)}.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSelfResult(int)
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStart(Intent intent, int startId) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the system to notify a Service that it is no longer used and is being removed.  The
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * service should clean up an resources it holds (threads, registered
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * receivers, etc) at this point.  Upon return, there will be no more calls
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to this Service object and it is effectively dead.  Do not call this method directly.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDestroy() {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the communication channel to the service.  May return null if
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clients can not bind to the service.  The returned
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.IBinder} is usually for a complex interface
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that has been <a href="{@docRoot}guide/developing/tools/aidl.html">described using
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * aidl</a>.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p><em>Note that unlike other application components, calls on to the
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IBinder interface returned here may not happen on the main thread
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the process</em>.  More information about this can be found
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in <a href="{@docRoot}guide/topics/fundamentals.html#procthread">Application Fundamentals:
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes and Threads</a>.</p>
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent that was used to bind to this service,
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as given to {@link android.content.Context#bindService
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Context.bindService}.  Note that any extras that were included with
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Intent at that point will <em>not</em> be seen here.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return an IBinder through which clients can call on to the
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         service.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract IBinder onBind(Intent intent);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when all clients have disconnected from a particular interface
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * published by the service.  The default implementation does nothing and
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent that was used to bind to this service,
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as given to {@link android.content.Context#bindService
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Context.bindService}.  Note that any extras that were included with
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Intent at that point will <em>not</em> be seen here.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return true if you would like to have the service's
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onRebind} method later called when new clients bind to it.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onUnbind(Intent intent) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when new clients have connected to the service, after it had
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * previously been notified that all had disconnected in its
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onUnbind}.  This will only be called if the implementation
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of {@link #onUnbind} was overridden to return true.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent that was used to bind to this service,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as given to {@link android.content.Context#bindService
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Context.bindService}.  Note that any extras that were included with
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Intent at that point will <em>not</em> be seen here.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onRebind(Intent intent) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stop the service, if it was previously started.  This is the same as
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling {@link android.content.Context#stopService} for this particular service.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSelfResult(int)
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void stopSelf() {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stopSelf(-1);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Old version of {@link #stopSelfResult} that doesn't return a result.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSelfResult
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void stopSelf(int startId) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityManager == null) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.stopServiceToken(
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new ComponentName(this, mClassName), mToken, startId);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
282105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Stop the service if the most recent time it was started was
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>startId</var>.  This is the same as calling {@link
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.content.Context#stopService} for this particular service but allows you to
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * safely avoid stopping if there is a start request from a client that you
286105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * haven't yet seen in {@link #onStart}.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startId The most recent start identifier received in {@link
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                #onStart}.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the startId matches the last start request
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the service will be stopped, else false.
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #stopSelf()
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean stopSelfResult(int startId) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityManager == null) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mActivityManager.stopServiceToken(
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new ComponentName(this, mClassName), mToken, startId);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
308d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * @deprecated This is a now a no-op, use
309d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * {@link #startForeground(int, Notification)} instead.
310d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     */
311d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    @Deprecated
312d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    public final void setForeground(boolean isForeground) {
313d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn        Log.w(TAG, "setForeground: ignoring old API call on " + getClass().getName());
314d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    }
315d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn
316d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    /**
317d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * Make this service run in the foreground, supplying the ongoing
318d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * notification to be shown to the user while in this state.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * By default services are background, meaning that if the system needs to
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill them to reclaim more memory (such as to display a large page in a
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * web browser), they can be killed without too much harm.  You can set this
322d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * flag if killing your service would be disruptive to the user, such as
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if your service is performing background music playback, so the user
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would notice if their music stopped playing.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
326d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * @param id The identifier for this notification as per
327d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * {@link NotificationManager#notify(int, Notification)
328d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * NotificationManager.notify(int, Notification)}.
329d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * @param notification The Notification to be displayed.
330d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     *
331d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * @see #stopForeground(boolean)
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
333d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    public final void startForeground(int id, Notification notification) {
334d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn        try {
335d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn            mActivityManager.setServiceForeground(
336d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn                    new ComponentName(this, mClassName), mToken, id,
337d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn                    notification, true);
338d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn        } catch (RemoteException ex) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
340d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    }
341d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn
342d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    /**
343d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * Remove this service from foreground state, allowing it to be killed if
344d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * more memory is needed.
3451066cbcac08268e2254ed6818181949d83e9ba1cDianne Hackborn     * @param removeNotification If true, the notification previously provided
3461066cbcac08268e2254ed6818181949d83e9ba1cDianne Hackborn     * to {@link #startForeground} will be removed.  Otherwise it will remain
3471066cbcac08268e2254ed6818181949d83e9ba1cDianne Hackborn     * until a later call removes it (or the service is destroyed).
348d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * @see #startForeground(int, Notification)
349d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     */
350d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    public final void stopForeground(boolean removeNotification) {
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.setServiceForeground(
353d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn                    new ComponentName(this, mClassName), mToken, 0, null,
354d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn                    removeNotification);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Print the Service's state into the given stream.  This gets invoked if
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you run "adb shell dumpsys activity service <yourservicename>".
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is distinct from "dumpsys <servicename>", which only works for
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * named system services and which invokes the {@link IBinder#dump} method
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the {@link IBinder} interface registered with ServiceManager.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The raw file descriptor that the dump is being sent to.
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param writer The PrintWriter to which you should dump your state.  This will be
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed for you after you return.
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args additional arguments to the dump request.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writer.println("nothing to dump");
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i("Service", "Finalizing Service: " + this);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void attach(
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Context context,
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityThread thread, String className, IBinder token,
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Application application, Object activityManager) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = thread;           // NOTE:  unused - remove?
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClassName = className;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToken = token;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mApplication = application;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityManager = (IActivityManager)activityManager;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final String getClassName() {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mClassName;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set by the thread after the constructor and before onCreate(Bundle icicle) is called.
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityThread mThread = null;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mClassName = null;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mToken = null;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Application mApplication = null;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IActivityManager mActivityManager = null;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
409