public abstract class
Service
extends ContextWrapper
implements ComponentCallbacks
java.lang.Object
↳android.content.Context
↳android.content.ContextWrapper
↳ android.app.Service
Known Direct Subclasses
AbstractInputMethodService, AccessibilityService, IntentService, RecognitionService, WallpaperService
AbstractInputMethodService AbstractInputMethodService provides a abstract base class for input
methods.
AccessibilityService An accessibility service runs in the background and receives callbacks
by the system when AccessibilityEvents are fired.
IntentService IntentService is a base class for Services that handle
asynchronous requests (expressed as Intents) on demand.
RecognitionService This class provides a base class for recognition service
implementations.
WallpaperService A wallpaper service is responsible for showing a live wallpaper behind
applications that would like to sit on top of it.
Known Indirect Subclasses
InputMethodService
InputMethodService InputMethodService provides a standard implementation of an InputMethod,
which final implementations can derive from and customize.
Class Overview
A Service is an application component representing either an application's desire to perform a longer-running
operation while not interacting with the user or to supply functionality for other applications to use. Each service
class must have a corresponding declaration in its package's AndroidManifest.xml.
Services can be started with Context.startService() and Context.bindService().
Note that services, like other application objects, run in the main thread of their hosting process. This means that, if
your service is going to do any CPU intensive (such as MP3 playback) or blocking (such as networking) operations,
it should spawn its own thread in which to do that work. More information on this can be found in Application
Fundamentals: Processes and Threads. The IntentService class is available as a standard implementation
of Service that has its own thread where it schedules its work to be done.
The Service class is an important part of an application's overall lifecycle.
Topics covered here:
1. What is a Service?
2. Service Lifecycle
3. Permissions
4. Process Lifecycle
5. Local Service Sample
6. Remote Messenger Service Sample
What is a Service?
Most confusion about the Service class actually revolves around what it is not:
A Service is not a separate process. The Service object itself does not imply it is running in its own process;
unless otherwise specified, it runs in the same process as the application it is part of.
A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not
Responding errors).
Thus a Service itself is actually very simple, providing two main features:
A facility for the application to tell the system about something it wants to be doing in the background (even
when the user is not directly interacting with the application). This corresponds to calls to
Context.startService(), which ask the system to schedule work for the service, to be run until the
service or someone else explicitly stop it.
A facility for an application to expose some of its functionality to other applications. This corresponds to calls
to Context.bindService(), which allows a long-standing connection to be made to the service in order to
interact with it.
When a Service component is actually created, for either of these reasons, all that the system actually does is
instantiate the component and call its onCreate() and any other appropriate callbacks on the main thread. It is
up to the Service to implement these with the appropriate behavior, such as creating a secondary thread in which it
does its work.
Note that because Service itself is so simple, you can make your interaction with it as simple or complicated as you
want: from treating it as a local Java object that you make direct method calls on (as illustrated by Local Service
Sample), to providing a full remoteable interface using AIDL.
Service Lifecycle
There are two reasons that a service can be run by the system. If someone calls Context.startService()
then the system will retrieve the service (creating it and calling its onCreate() method if needed) and then call
its onStartCommand(Intent, int, int) method with the arguments supplied by the client. The service
will at this point continue running until Context.stopService() or stopSelf() is called. Note that
multiple calls to Context.startService() do not nest (though they do result in multiple corresponding calls to
onStartCommand()), so no matter how many times it is started a service will be stopped once Context.stopService()
or stopSelf() is called; however, services can use their stopSelf(int) method to ensure the service is not
stopped until started intents have been processed.
For started services, there are two additional major modes of operation they can decide to run in, depending on the
value they return from onStartCommand(): START_STICKY is used for services that are explicitly started and
stopped as needed, while START_NOT_STICKY or START_REDELIVER_INTENT are used for services
that should only remain running while processing any commands sent to them. See the linked documentation for
more detail on the semantics.
Clients can also use Context.bindService() to obtain a persistent connection to a service. This likewise
creates the service if it is not already running (calling onCreate() while doing so), but does not call
onStartCommand(). The client will receive the IBinder object that the service returns from its
onBind(Intent) method, allowing the client to then make calls back to the service. The service will remain
running as long as the connection is established (whether or not the client retains a reference on the service's
IBinder). Usually the IBinder returned is for a complex interface that has been written in aidl.
A service can be both started and have connections bound to it. In such a case, the system will keep the service
running as long as either it is started or there are one or more connections to it with the
Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy()
method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers)
should be complete upon returning from onDestroy().
Permissions
tag. By doing so,
Global access to a service can be enforced when it is declared in its manifest's
other applications will need to declare a corresponding element in their own manifest to
be able to start, stop, or bind to the service.
In addition, a service can protect individual IPC calls into it with permissions, by calling the
checkCallingPermission(String) method before executing the implementation of that call.
See the Security and Permissions document for more information on permissions and security in general.
Process Lifecycle
The Android system will attempt to keep the process hosting a service around as long as the service has been
started or has clients bound to it. When running low on memory and needing to kill existing processes, the priority of
a process hosting the service will be the higher of the following possibilities:
If the service is currently executing code in its onCreate(), onStartCommand(), or
onDestroy() methods, then the hosting process will be a foreground process to ensure this code can execute
without being killed.
If the service has been started, then its hosting process is considered to be less important than any
processes that are currently visible to the user on-screen, but more important than any process not visible. Because
only a few processes are generally visible to the user, this means that the service should not be killed except in
extreme low memory conditions.
If there are clients bound to the service, then the service's hosting process is never less important than the
most important client. That is, if one of its clients is visible to the user, then the service itself is considered to be
visible.
A started service can use the startForeground(int, Notification) API to put the service
in a foreground state, where the system considers it to be something the user is actively aware of and thus not a
candidate for killing when low on memory. (It is still theoretically possible for the service to be killed under extreme
memory pressure from the current foreground application, but in practice this should not be a concern.)
Note this means that most of the time your service is running, it may be killed by the system if it is under heavy
memory pressure. If this happens, the system will later try to restart the service. An important consequence of this is
that if you implement onStartCommand() to schedule work to be done asynchronously or in another thread,
then you may want to use START_FLAG_REDELIVERY to have the system re-deliver an Intent for you so that it
does not get lost if your service is killed while processing it.
Other application components running in the same process as the service (such as an Activity) can, of course,
increase the importance of the overall process beyond just the importance of the service itself.
Local Service Sample
One of the most common uses of a Service is as a secondary component running alongside other parts of an
application, in the same process as the rest of the components. All components of an .apk run in the same process
unless explicitly stated otherwise, so this is a typical situation.
When used in this way, by assuming the components are in the same process, you can greatly simplify the
interaction between them: clients of the service can simply cast the IBinder they receive from it to a concrete class
published by the service.
An example of this use of a Service is shown here. First is the Service itself, publishing a custom class when bound:
public class LocalService extends Service {
private NotificationManager mNM;
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
* IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// Display a notification about us starting. We put an icon in the status bar.
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onDestroy() {
// Cancel the persistent notification.
mNM.cancel(R.string.local_service_started);
// Tell the user we stopped.
Toast.makeText(this, R.string.local_service_stopped,
Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();
/**
* Show a notification while this service is running.
*/
private void showNotification() {
// In this sample, we'll use the same text for the ticker and the expanded
notification
CharSequence text = getText(R.string.local_service_started);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.stat_sample, text,
System.currentTimeMillis());
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, LocalServiceActivities.Controller.class), 0);
// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this, getText(R.string.local_service_label),
text, contentIntent);
// Send the notification.
// We use a layout id because it is a unique number. We use it later to cancel.
mNM.notify(R.string.local_service_started, notification);
}
}
With that done, one can now write client code that directly accesses the running service, such as:
private LocalService mBoundService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been
// established, giving us the service object we can use to
// interact with the service. Because we have bound to a explicit
// service that we know is running in our own process, we can
// cast its IBinder to a concrete class and directly access it.
mBoundService = ((LocalService.LocalBinder)service).getService();
// Tell the user about this for our demo.
Toast.makeText(Binding.this, R.string.local_service_connected,
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
// Because it is running in our same process, we should never
// see this happen.
mBoundService = null;
Toast.makeText(Binding.this, R.string.local_service_disconnected,
Toast.LENGTH_SHORT).show();
}
};
void doBindService() {
// Establish a connection with the service. We use an explicit
// class name because we want a specific service implementation that
// we know will be running in our own process (and thus won't be
// supporting component replacement by other applications).
bindService(new Intent(Binding.this,
LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
if (mIsBound) {
// Detach our existing connection.
unbindService(mConnection);
mIsBound = false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doUnbindService();
}
Remote Messenger Service Sample
If you need to be able to write a Service that can perform complicated communication with clients in remote
processes (beyond simply the use of Context.startService to send commands to it), then you can use
the Messenger class instead of writing full AIDL files.
An example of a Service that uses Messenger as its client interface is shown here. First is the Service itself,
publishing a Messenger to an internal Handler when bound:
public class MessengerService extends Service {
/** For showing and hiding our notification. */
NotificationManager mNM;
/** Keeps track of all current registered clients. */
ArrayList mClients = new ArrayList();
/** Holds last value set by a client. */
int mValue = 0;
/**
* Command to the service to register a client, receiving callbacks
* from the service. The Message's replyTo field must be a Messenger of
* the client where callbacks should be sent.
*/
static final int MSG_REGISTER_CLIENT = 1;
/**
* Command to the service to unregister a client, ot stop receiving callbacks
* from the service. The Message's replyTo field must be a Messenger of
* the client as previously given with MSG_REGISTER_CLIENT.
*/
static final int MSG_UNREGISTER_CLIENT = 2;
/**
* Command to service to set a new value. This can be sent to the
* service to supply a new value, and will be sent by the service to
* any registered clients with the new value.
*/
static final int MSG_SET_VALUE = 3;
/**
* Handler of incoming messages from clients.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
case MSG_SET_VALUE:
mValue = msg.arg1;
for (int i=mClients.size()-1; i>=0; i--) {
try {
mClients.get(i).send(Message.obtain(null,
MSG_SET_VALUE, mValue, 0));
} catch (RemoteException e) {
// The client is dead. Remove it from the list;
// we are going through the list from back to front
// so this is safe to do inside the loop.
mClients.remove(i);
}
}
break;
default:
super.handleMessage(msg);
}
}
}
/**
* Target we publish for clients to send messages to IncomingHandler.
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
@Override
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// Display a notification about us starting.
showNotification();
}
@Override
public void onDestroy() {
// Cancel the persistent notification.
mNM.cancel(R.string.remote_service_started);
// Tell the user we stopped.
Toast.makeText(this, R.string.remote_service_stopped,
Toast.LENGTH_SHORT).show();
}
/**
* When binding to the service, we return an interface to our messenger
* for sending messages to the service.
*/
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
/**
* Show a notification while this service is running.
*/
private void showNotification() {
// In this sample, we'll use the same text for the ticker and the expanded
notification
CharSequence text = getText(R.string.remote_service_started);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.stat_sample, text,
System.currentTimeMillis());
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, Controller.class), 0);
// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this,
getText(R.string.remote_service_label),
text, contentIntent);
// Send the notification.
// We use a string id because it is a unique number. We use it later to cancel.
mNM.notify(R.string.remote_service_started, notification);
}
}
If we want to make this service run in a remote process (instead of the standard one for its .apk), we can use
android:process in its manifest tag to specify one:
Note that the name "remote" chosen here is arbitrary, and you can use other names if you want additional processes.
The ':' prefix appends the name to your package's standard process name.
With that done, clients can now bind to the service and send messages to it. Note that this allows clients to register
with it to receive messages back as well:
/** Messenger for communicating with service. */
Messenger mService = null;
/** Flag indicating whether we have called bind on the service. */
boolean mIsBound;
/** Some text view we are using to show state information. */
TextView mCallbackText;
/**
* Handler of incoming messages from service.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessengerService.MSG_SET_VALUE:
mCallbackText.setText("Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
}
/**
* Target we publish for clients to send messages to IncomingHandler.
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
/**
* Class for interacting with the main interface of the service.
*/
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
// This is called when the connection with the service has been
// established, giving us the service object we can use to
// interact with the service. We are communicating with our
// service through an IDL interface, so get a client-side
// representation of that from the raw service object.
mService = new Messenger(service);
mCallbackText.setText("Attached.");
// We want to monitor the service for as long as we are
// connected to it.
try {
Message msg = Message.obtain(null,
MessengerService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
// Give it some value as an example.
msg = Message.obtain(null,
MessengerService.MSG_SET_VALUE, this.hashCode(), 0);
mService.send(msg);
} catch (RemoteException e) {
// In this case the service has crashed before we could even
// do anything with it; we can count on soon being
// disconnected (and then reconnected if it can be restarted)
// so there is no need to do anything here.
}
// As part of the sample, tell the user what happened.
Toast.makeText(Binding.this, R.string.remote_service_connected,
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mService = null;
mCallbackText.setText("Disconnected.");
// As part of the sample, tell the user what happened.
Toast.makeText(Binding.this, R.string.remote_service_disconnected,
Toast.LENGTH_SHORT).show();
}
};
void doBindService() {
// Establish a connection with the service. We use an explicit
// class name because there is no reason to be able to let other
// applications replace our component.
bindService(new Intent(Binding.this,
MessengerService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
mCallbackText.setText("Binding.");
}
void doUnbindService() {
if (mIsBound) {
// If we have received the service, and hence registered with
// it, then now is the time to unregister.
if (mService != null) {
try {
Message msg = Message.obtain(null,
MessengerService.MSG_UNREGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
// There is nothing special we need to do if the service
// has crashed.
}
}
// Detach our existing connection.
unbindService(mConnection);
mIsBound = false;
mCallbackText.setText("Unbinding.");
}
}
Summary
Constants
int START_CONTINUATION_MASK Bits returned by onStartCommand(Intent, int, int)
describing how to continue the service if it is killed.
int START_FLAG_REDELIVERY This flag is set in onStartCommand(Intent, int, int)
if the Intent is a re-delivery of a previously delivered intent, because the
service had previously returned START_REDELIVER_INTENT
but had been killed before calling stopSelf(int) for that Intent.
int START_FLAG_RETRY This flag is set in onStartCommand(Intent, int, int)
if the Intent is a a retry because the original attempt never got to or
returned from onStartCommand(Intent, int, int).
int START_NOT_STICKY Constant to return from onStartCommand(Intent, int,
int): if this service's process is killed while it is started (after returning
from onStartCommand(Intent, int, int) ), and there
are no new start intents to deliver to it, then take the service out of the
started state and don't recreate until a future explicit call to
Context.startService(Intent).
int START_REDELIVER_INTENT Constant to return from onStartCommand(Intent, int,
int): if this service's process is killed while it is started (after returning
from onStartCommand(Intent, int, int)), then it will
be scheduled for a restart and the last delivered Intent re-delivered to it
again via onStartCommand(Intent, int, int).
int START_STICKY Constant to return from onStartCommand(Intent, int,
int): if this service's process is killed while it is started (after returning
from onStartCommand(Intent, int, int)), then leave
it in the started state but don't retain this delivered intent.
int START_STICKY_COMPATIBILITY Constant to return from onStartCommand(Intent, int,
int): compatibility version of START_STICKY that does not
guarantee that onStartCommand(Intent, int, int)
will be called again after being killed.
[Expand]
Inherited Constants
From class android.content.Context
String ACCESSIBILITY_SERVICE Use with getSystemService(String) to
retrieve a AccessibilityManager for giving
the user feedback for UI events through the registered
event listeners.
String ACCOUNT_SERVICE Use with getSystemService(String) to
retrieve a AccountManager for receiving intents
at a time of your choosing.
String ACTIVITY_SERVICE Use with getSystemService(String) to
retrieve a ActivityManager for interacting with
the global system state.
String ALARM_SERVICE Use with getSystemService(String) to
retrieve a AlarmManager for receiving intents at a
time of your choosing.
String AUDIO_SERVICE Use with getSystemService(String) to
retrieve a AudioManager for handling
management of volume, ringer modes and audio
routing.
int BIND_AUTO_CREATE Flag for bindService(Intent,
ServiceConnection, int): automatically
create the service as long as the binding exists.
int BIND_DEBUG_UNBIND Flag for bindService(Intent,
ServiceConnection, int): include
debugging help for mismatched calls to unbind.
int BIND_NOT_FOREGROUND Flag for bindService(Intent,
ServiceConnection, int): don't allow this
binding to raise the target service's process to the
foreground scheduling priority.
String CLIPBOARD_SERVICE Use with getSystemService(String) to
retrieve a ClipboardManager for accessing and
modifying the contents of the global clipboard.
String CONNECTIVITY_SERVICE Use with getSystemService(String) to
retrieve a ConnectivityManager for handling
management of network connections.
int CONTEXT_IGNORE_SECURITY Flag for use with
createPackageContext(String, int):
ignore any security restrictions on the Context being
requested, allowing it to always be loaded.
int CONTEXT_INCLUDE_CODE Flag for use with
createPackageContext(String, int):
include the application code with the context.
int CONTEXT_RESTRICTED Flag for use with
createPackageContext(String, int):
a restricted context may disable specific features.
String DEVICE_POLICY_SERVICE Use with getSystemService(String) to
retrieve a DevicePolicyManager for working
with global device policy management.
String DROPBOX_SERVICE Use with getSystemService(String) to
retrieve a DropBoxManager instance for
recording diagnostic logs.
String INPUT_METHOD_SERVICE Use with getSystemService(String) to
retrieve a InputMethodManager for accessing
input methods.
String KEYGUARD_SERVICE Use with getSystemService(String) to
retrieve a NotificationManager for
controlling keyguard.
String LAYOUT_INFLATER_SERVICE Use with getSystemService(String) to
retrieve a LayoutInflater for inflating layout
resources in this context.
String LOCATION_SERVICE Use with getSystemService(String) to
retrieve a LocationManager for controlling
location updates.
int MODE_APPEND File creation mode: for use with
openFileOutput(String, int), if the file
already exists then write data to the end of the existing
file instead of erasing it.
int MODE_PRIVATE File creation mode: the default mode, where the
created file can only be accessed by the calling
application (or all applications sharing the same user
ID).
int MODE_WORLD_READABLE File creation mode: allow all other applications to have
read access to the created file.
int MODE_WORLD_WRITEABLE File creation mode: allow all other applications to have
write access to the created file.
String NOTIFICATION_SERVICE Use with getSystemService(String) to
retrieve a NotificationManager for informing
the user of background events.
String POWER_SERVICE Use with getSystemService(String) to
retrieve a PowerManager for controlling power
management, including "wake locks," which let you
keep the device on while you're running long tasks.
String SEARCH_SERVICE Use with getSystemService(String) to
retrieve a SearchManager for handling searches.
String SENSOR_SERVICE Use with getSystemService(String) to
retrieve a SensorManager for accessing sensors.
String TELEPHONY_SERVICE Use with getSystemService(String) to
retrieve a TelephonyManager for handling
management the telephony features of the device.
String UI_MODE_SERVICE Use with getSystemService(String) to
retrieve a UiModeManager for controlling UI
modes.
String VIBRATOR_SERVICE Use with getSystemService(String) to
retrieve a Vibrator for interacting with the vibration
hardware.
String WALLPAPER_SERVICE Use with getSystemService(String) to
retrieve a com.android.server.WallpaperService for
accessing wallpapers.
String WIFI_SERVICE Use with getSystemService(String) to
retrieve a WifiManager for handling management
of Wi-Fi access.
String WINDOW_SERVICE Use with getSystemService(String) to
retrieve a WindowManager for accessing the
system's window manager.
Public Constructors
Service()
Public Methods
final getApplication()
Application
Return the application that owns this service.
abstract onBind(Intent intent)
IBinder
Return the communication channel to the service.
void onConfigurationChanged(Configuration newConfig)
Called by the system when the device configuration changes while your component is running.
void onCreate()
Called by the system when the service is first created.
void onDestroy()
Called by the system to notify a Service that it is no longer used and is being removed.
void onLowMemory()
This is called when the overall system is running low on memory, and would like actively running process
to try to tighten their belt.
void onRebind(Intent intent)
Called when new clients have connected to the service, after it had previously been notified that all had
disconnected in its onUnbind(Intent).
void onStart(Intent intent, int startId)
This method is deprecated. Implement onStartCommand(Intent, int, int) instead.
int onStartCommand(Intent intent, int flags, int startId)
Called by the system every time a client explicitly starts the service by calling
startService(Intent), providing the arguments it supplied and a unique integer token
representing the start request.
boolean onUnbind(Intent intent)
Called when all clients have disconnected from a particular interface published by the service.
final void setForeground(boolean isForeground)
This method is deprecated. This is a now a no-op, use startForeground(int,
Notification) instead. This method has been turned into a no-op rather than simply being
deprecated because analysis of numerous poorly behaving devices has shown that increasingly often the
trouble is being caused in part by applications that are abusing it. Thus, given a choice between
introducing problems in existing applications using this API (by allowing them to be killed when they would
like to avoid it), vs allowing the performance of the entire system to be decreased, this method was
deemed less important.
final void startForeground(int id, Notification notification)
Make this service run in the foreground, supplying the ongoing notification to be shown to the user while in
this state.
final void stopForeground(boolean removeNotification)
Remove this service from foreground state, allowing it to be killed if more memory is needed.
final void stopSelf()
Stop the service, if it was previously started.
final void stopSelf(int startId)
Old version of stopSelfResult(int) that doesn't return a result.
final stopSelfResult(int startId)
boolean
Stop the service if the most recent time it was started was startId.
Protected Methods
void dump(FileDescriptor fd, PrintWriter writer, String[] args)
Print the Service's state into the given stream.
void finalize()
Is called before the object's memory is being reclaimed by the VM.
[Expand]
Inherited Methods
From class android.content.ContextWrapper
void attachBaseContext(Context base)
Set the base context for this ContextWrapper.
boolean bindService(Intent service, ServiceConnection conn, int flags)
Connect to an application service, creating it if needed.
int checkCallingOrSelfPermission(String permission)
Determine whether the calling process of an IPC or you have been granted a
particular permission.
int checkCallingOrSelfUriPermission(Uri uri, int modeFlags)
Determine whether the calling process of an IPC or you has been granted
permission to access a specific URI.
int checkCallingPermission(String permission)
Determine whether the calling process of an IPC you are handling has been
granted a particular permission.
int checkCallingUriPermission(Uri uri, int modeFlags)
Determine whether the calling process and user ID has been granted
permission to access a specific URI.
int checkPermission(String permission, int pid, int uid)
Determine whether the given permission is allowed for a particular process and
user ID running in the system.
int checkUriPermission(Uri uri, int pid, int uid, int modeFlags)
Determine whether a particular process and user ID has been granted
permission to access a specific URI.
int checkUriPermission(Uri uri, String readPermission, String writePermission, int
pid, int uid, int modeFlags)
Check both a Uri and normal permission.
void clearWallpaper()
This method is deprecated. Use WallpaperManager.clear()
instead.
Context createPackageContext(String packageName, int flags)
Return a new Context object for the given application name.
String[] databaseList()
Returns an array of strings naming the private databases associated with this
Context's application package.
boolean deleteDatabase(String name)
Delete an existing private SQLiteDatabase associated with this Context's
application package.
boolean deleteFile(String name)
Delete the given private file associated with this Context's application package.
void enforceCallingOrSelfPermission(String permission, String message)
If neither you nor the calling process of an IPC you are handling has been
granted a particular permission, throw a SecurityException.
void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message)
If the calling process of an IPC or you has not been granted permission to
access a specific URI, throw SecurityException.
void enforceCallingPermission(String permission, String message)
If the calling process of an IPC you are handling has not been granted a
particular permission, throw a SecurityException.
void enforceCallingUriPermission(Uri uri, int modeFlags, String message)
If the calling process and user ID has not been granted permission to access a
specific URI, throw SecurityException.
void enforcePermission(String permission, int pid, int uid, String message)
If the given permission is not allowed for a particular process and user ID
running in the system, throw a SecurityException.
void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message)
If a particular process and user ID has not been granted permission to access a
specific URI, throw SecurityException.
void enforceUriPermission(Uri uri, String readPermission, String writePermission,
int pid, int uid, int modeFlags, String message)
Enforce both a Uri and normal permission.
String[] fileList()
Returns an array of strings naming the private files associated with this
Context's application package.
Context getApplicationContext()
Return the context of the single, global Application object of the current
process.
ApplicationInfo getApplicationInfo()
Return the full application info for this context's package.
AssetManager getAssets()
Return an AssetManager instance for your application's package.
Context getBaseContext()
File getCacheDir()
Returns the absolute path to the application specific cache directory on the
filesystem.
ClassLoader getClassLoader()
Return a class loader you can use to retrieve classes in this package.
ContentResolver getContentResolver()
Return a ContentResolver instance for your application's package.
File getDatabasePath(String name)
Returns the absolute path on the filesystem where a database created with
openOrCreateDatabase(String, int,
SQLiteDatabase.CursorFactory) is stored.
File getDir(String name, int mode)
Retrieve, creating if needed, a new directory in which the application can place
its own custom data files.
File getExternalCacheDir()
Returns the absolute path to the directory on the external filesystem (that is
somewhere on
Environment.getExternalStorageDirectory() where the
application can place cache files it owns.
File getExternalFilesDir(String type)
Returns the absolute path to the directory on the external filesystem (that is
somewhere on
Environment.getExternalStorageDirectory()) where the
application can place persistent files it owns.
File getFileStreamPath(String name)
Returns the absolute path on the filesystem where a file created with
openFileOutput(String, int) is stored.
File getFilesDir()
Returns the absolute path to the directory on the filesystem where files created
with openFileOutput(String, int) are stored.
Looper getMainLooper()
Return the Looper for the main thread of the current process.
String getPackageCodePath()
Return the full path to this context's primary Android package.
PackageManager getPackageManager()
Return PackageManager instance to find global package information.
String getPackageName()
Return the name of this application's package.
String getPackageResourcePath()
Return the full path to this context's primary Android package.
Resources getResources()
Return a Resources instance for your application's package.
SharedPreferences getSharedPreferences(String name, int mode)
Retrieve and hold the contents of the preferences file 'name', returning a
SharedPreferences through which you can retrieve and modify its values.
Object getSystemService(String name)
Return the handle to a system-level service by name.
Resources.Theme getTheme()
Return the Theme object associated with this Context.
Drawable getWallpaper()
This method is deprecated. Use WallpaperManager.get() instead.
int getWallpaperDesiredMinimumHeight()
This method is deprecated. Use
WallpaperManager.getDesiredMinimumHeight() instead.
int getWallpaperDesiredMinimumWidth()
This method is deprecated. Use
WallpaperManager.getDesiredMinimumWidth() instead.
void grantUriPermission(String toPackage, Uri uri, int modeFlags)
Grant permission to access a specific Uri to another package, regardless of
whether that package has general permission to access the Uri's content
provider.
boolean isRestricted()
Indicates whether this Context is restricted.
FileInputStream openFileInput(String name)
Open a private file associated with this Context's application package for
reading.
FileOutputStream openFileOutput(String name, int mode)
Open a private file associated with this Context's application package for
writing.
SQLiteDatabase openOrCreateDatabase(String name, int mode,
SQLiteDatabase.CursorFactory factory)
Open a new private SQLiteDatabase associated with this Context's application
package.
Drawable peekWallpaper()
This method is deprecated. Use WallpaperManager.peek() instead.
Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String
broadcastPermission, Handler scheduler)
Register to receive intent broadcasts, to run in the context of scheduler.
Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
Register a BroadcastReceiver to be run in the main activity thread.
void removeStickyBroadcast(Intent intent)
Remove the data previously sent with
sendStickyBroadcast(Intent), so that it is as if the sticky
broadcast had never happened.
void revokeUriPermission(Uri uri, int modeFlags)
Remove all permissions to access a particular content provider Uri that were
previously added with grantUriPermission(String, Uri,
int).
void sendBroadcast(Intent intent)
Broadcast the given intent to all interested BroadcastReceivers.
void sendBroadcast(Intent intent, String receiverPermission)
Broadcast the given intent to all interested BroadcastReceivers, allowing an
optional required permission to be enforced.
void sendOrderedBroadcast(Intent intent, String receiverPermission,
BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String
initialData, Bundle initialExtras)
Version of sendBroadcast(Intent) that allows you to receive data
back from the broadcast.
void sendOrderedBroadcast(Intent intent, String receiverPermission)
Broadcast the given intent to all interested BroadcastReceivers, delivering
them one at a time to allow more preferred receivers to consume the broadcast
before it is delivered to less preferred receivers.
void sendStickyBroadcast(Intent intent)
Perform a sendBroadcast(Intent) that is "sticky," meaning the Intent
you are sending stays around after the broadcast is complete, so that others
can quickly retrieve that data through the return value of
registerReceiver(BroadcastReceiver,
IntentFilter).
void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
Version of sendStickyBroadcast(Intent) that allows you to
receive data back from the broadcast.
void setTheme(int resid)
Set the base theme for this context.
void setWallpaper(InputStream data)
This method is deprecated. Use WallpaperManager.set() instead.
void setWallpaper(Bitmap bitmap)
This method is deprecated. Use WallpaperManager.set() instead.
void startActivity(Intent intent)
Launch a new activity.
boolean startInstrumentation(ComponentName className, String profileFile, Bundle
arguments)
Start executing an Instrumentation class.
void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int
flagsValues, int extraFlags)
Like startActivity(Intent), but taking a IntentSender to start.
ComponentName startService(Intent service)
Request that a given application service be started.
boolean stopService(Intent name)
Request that a given application service be stopped.
void unbindService(ServiceConnection conn)
Disconnect from an application service.
void unregisterReceiver(BroadcastReceiver receiver)
Unregister a previously registered BroadcastReceiver.
From class android.content.Context
abstract boolean bindService(Intent service, ServiceConnection conn, int flags)
Connect to an application service, creating it if needed.
abstract int checkCallingOrSelfPermission(String permission)
Determine whether the calling process of an IPC or you have been granted a
particular permission.
abstract int checkCallingOrSelfUriPermission(Uri uri, int modeFlags)
Determine whether the calling process of an IPC or you has been granted
permission to access a specific URI.
abstract int checkCallingPermission(String permission)
Determine whether the calling process of an IPC you are handling has been
granted a particular permission.
abstract int checkCallingUriPermission(Uri uri, int modeFlags)
Determine whether the calling process and user ID has been granted
permission to access a specific URI.
abstract int checkPermission(String permission, int pid, int uid)
Determine whether the given permission is allowed for a particular process and
user ID running in the system.
abstract int checkUriPermission(Uri uri, int pid, int uid, int modeFlags)
Determine whether a particular process and user ID has been granted
permission to access a specific URI.
abstract int checkUriPermission(Uri uri, String readPermission, String writePermission, int
pid, int uid, int modeFlags)
Check both a Uri and normal permission.
abstract void clearWallpaper()
This method is deprecated. Use WallpaperManager.clear()
instead.
abstract Context createPackageContext(String packageName, int flags)
Return a new Context object for the given application name.
abstract String[] databaseList()
Returns an array of strings naming the private databases associated with this
Context's application package.
abstract boolean deleteDatabase(String name)
Delete an existing private SQLiteDatabase associated with this Context's
application package.
abstract boolean deleteFile(String name)
Delete the given private file associated with this Context's application package.
abstract void enforceCallingOrSelfPermission(String permission, String message)
If neither you nor the calling process of an IPC you are handling has been
granted a particular permission, throw a SecurityException.
abstract void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message)
If the calling process of an IPC or you has not been granted permission to
access a specific URI, throw SecurityException.
abstract void enforceCallingPermission(String permission, String message)
If the calling process of an IPC you are handling has not been granted a
particular permission, throw a SecurityException.
abstract void enforceCallingUriPermission(Uri uri, int modeFlags, String message)
If the calling process and user ID has not been granted permission to access a
specific URI, throw SecurityException.
abstract void enforcePermission(String permission, int pid, int uid, String message)
If the given permission is not allowed for a particular process and user ID
running in the system, throw a SecurityException.
abstract void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message)
If a particular process and user ID has not been granted permission to access a
specific URI, throw SecurityException.
abstract void enforceUriPermission(Uri uri, String readPermission, String writePermission,
int pid, int uid, int modeFlags, String message)
Enforce both a Uri and normal permission.
abstract String[] fileList()
Returns an array of strings naming the private files associated with this
Context's application package.
abstract Context getApplicationContext()
Return the context of the single, global Application object of the current
process.
abstract getApplicationInfo()
ApplicationInfo
Return the full application info for this context's package.
abstract getAssets()
AssetManager
Return an AssetManager instance for your application's package.
abstract File getCacheDir()
Returns the absolute path to the application specific cache directory on the
filesystem.
abstract getClassLoader()
ClassLoader
Return a class loader you can use to retrieve classes in this package.
abstract getContentResolver()
ContentResolver
Return a ContentResolver instance for your application's package.
abstract File getDatabasePath(String name)
Returns the absolute path on the filesystem where a database created with
openOrCreateDatabase(String, int,
SQLiteDatabase.CursorFactory) is stored.
abstract File getDir(String name, int mode)
Retrieve, creating if needed, a new directory in which the application can place
its own custom data files.
abstract File getExternalCacheDir()
Returns the absolute path to the directory on the external filesystem (that is
somewhere on
Environment.getExternalStorageDirectory() where the
application can place cache files it owns.
abstract File getExternalFilesDir(String type)
Returns the absolute path to the directory on the external filesystem (that is
somewhere on
Environment.getExternalStorageDirectory()) where the
application can place persistent files it owns.
abstract File getFileStreamPath(String name)
Returns the absolute path on the filesystem where a file created with
openFileOutput(String, int) is stored.
abstract File getFilesDir()
Returns the absolute path to the directory on the filesystem where files created
with openFileOutput(String, int) are stored.
abstract Looper getMainLooper()
Return the Looper for the main thread of the current process.
abstract String getPackageCodePath()
Return the full path to this context's primary Android package.
abstract getPackageManager()
PackageManager
Return PackageManager instance to find global package information.
abstract String getPackageName()
Return the name of this application's package.
abstract String getPackageResourcePath()
Return the full path to this context's primary Android package.
abstract Resources getResources()
Return a Resources instance for your application's package.
abstract getSharedPreferences(String name, int mode)
SharedPreferences
Retrieve and hold the contents of the preferences file 'name', returning a
SharedPreferences through which you can retrieve and modify its values.
final String getString(int resId, Object... formatArgs)
Return a localized formatted string from the application's package's default
string table, substituting the format arguments as defined in Formatter and
format(String, Object...).
final String getString(int resId)
Return a localized string from the application's package's default string table.
abstract Object getSystemService(String name)
Return the handle to a system-level service by name.
final getText(int resId)
CharSequence
Return a localized, styled CharSequence from the application's package's
default string table.
abstract getTheme()
Resources.Theme
Return the Theme object associated with this Context.
abstract Drawable getWallpaper()
This method is deprecated. Use WallpaperManager.get() instead.
abstract int getWallpaperDesiredMinimumHeight()
This method is deprecated. Use
WallpaperManager.getDesiredMinimumHeight() instead.
abstract int getWallpaperDesiredMinimumWidth()
This method is deprecated. Use
WallpaperManager.getDesiredMinimumWidth() instead.
abstract void grantUriPermission(String toPackage, Uri uri, int modeFlags)
Grant permission to access a specific Uri to another package, regardless of
whether that package has general permission to access the Uri's content
provider.
boolean isRestricted()
Indicates whether this Context is restricted.
final TypedArray obtainStyledAttributes(int resid, int[] attrs)
Retrieve styled attribute information in this Context's theme.
final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int
defStyleRes)
Retrieve styled attribute information in this Context's theme.
final TypedArray obtainStyledAttributes(int[] attrs)
Retrieve styled attribute information in this Context's theme.
final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs)
Retrieve styled attribute information in this Context's theme.
abstract openFileInput(String name)
FileInputStream
Open a private file associated with this Context's application package for
reading.
abstract openFileOutput(String name, int mode)
FileOutputStream
Open a private file associated with this Context's application package for
writing.
abstract openOrCreateDatabase(String name, int mode,
SQLiteDatabase SQLiteDatabase.CursorFactory factory)
Open a new private SQLiteDatabase associated with this Context's application
package.
abstract Drawable peekWallpaper()
This method is deprecated. Use WallpaperManager.peek() instead.
abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String
broadcastPermission, Handler scheduler)
Register to receive intent broadcasts, to run in the context of scheduler.
abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
Register a BroadcastReceiver to be run in the main activity thread.
abstract void removeStickyBroadcast(Intent intent)
Remove the data previously sent with
sendStickyBroadcast(Intent), so that it is as if the sticky
broadcast had never happened.
abstract void revokeUriPermission(Uri uri, int modeFlags)
Remove all permissions to access a particular content provider Uri that were
previously added with grantUriPermission(String, Uri,
int).
abstract void sendBroadcast(Intent intent)
Broadcast the given intent to all interested BroadcastReceivers.
abstract void sendBroadcast(Intent intent, String receiverPermission)
Broadcast the given intent to all interested BroadcastReceivers, allowing an
optional required permission to be enforced.
abstract void sendOrderedBroadcast(Intent intent, String receiverPermission,
BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String
initialData, Bundle initialExtras)
Version of sendBroadcast(Intent) that allows you to receive data
back from the broadcast.
abstract void sendOrderedBroadcast(Intent intent, String receiverPermission)
Broadcast the given intent to all interested BroadcastReceivers, delivering
them one at a time to allow more preferred receivers to consume the broadcast
before it is delivered to less preferred receivers.
abstract void sendStickyBroadcast(Intent intent)
Perform a sendBroadcast(Intent) that is "sticky," meaning the Intent
you are sending stays around after the broadcast is complete, so that others
can quickly retrieve that data through the return value of
registerReceiver(BroadcastReceiver,
IntentFilter).
abstract void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
Version of sendStickyBroadcast(Intent) that allows you to
receive data back from the broadcast.
abstract void setTheme(int resid)
Set the base theme for this context.
abstract void setWallpaper(InputStream data)
This method is deprecated. Use WallpaperManager.set() instead.
abstract void setWallpaper(Bitmap bitmap)
This method is deprecated. Use WallpaperManager.set() instead.
abstract void startActivity(Intent intent)
Launch a new activity.
abstract boolean startInstrumentation(ComponentName className, String profileFile, Bundle
arguments)
Start executing an Instrumentation class.
abstract void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int
flagsValues, int extraFlags)
Like startActivity(Intent), but taking a IntentSender to start.
abstract startService(Intent service)
ComponentName
Request that a given application service be started.
abstract boolean stopService(Intent service)
Request that a given application service be stopped.
abstract void unbindService(ServiceConnection conn)
Disconnect from an application service.
abstract void unregisterReceiver(BroadcastReceiver receiver)
Unregister a previously registered BroadcastReceiver.
From class java.lang.Object
Object clone()
Creates and returns a copy of this Object.
boolean equals(Object o)
Compares this instance with the specified object and indicates if they are
equal.
void finalize()
Is called before the object's memory is being reclaimed by the VM.
final getClass()
Class
Returns the unique instance of Class which represents this object's
class.
int hashCode()
Returns an integer hash code for this object.
final void notify()
Causes a thread which is waiting on this object's monitor (by means of
calling one of the wait() methods) to be woken up.
final void notifyAll()
Causes all threads which are waiting on this object's monitor (by means
of calling one of the wait() methods) to be woken up.
String toString()
Returns a string containing a concise, human-readable description of this
object.
final void wait(long millis, int nanos)
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object or until the
specified timeout expires.
final void wait(long millis)
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object or until the
specified timeout expires.
final void wait()
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object.
From interface android.content.ComponentCallbacks
abstract onConfigurationChanged(Configuration newConfig)
void
Called by the system when the device configuration changes while your component is
running.
abstract onLowMemory()
void
This is called when the overall system is running low on memory, and would like actively
running process to try to tighten their belt.
Constants
public static final int START_CONTINUATION_MASK
Since: API Level 5
Bits returned by onStartCommand(Intent, int, int) describing how to continue the service if it is
killed. May be START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT, or
START_STICKY_COMPATIBILITY.
Constant Value: 15 (0x0000000f)
public static final int START_FLAG_REDELIVERY
Since: API Level 5
This flag is set in onStartCommand(Intent, int, int) if the Intent is a re-delivery of a previously
delivered intent, because the service had previously returned START_REDELIVER_INTENT but had been
killed before calling stopSelf(int) for that Intent.
Constant Value: 1 (0x00000001)
public static final int START_FLAG_RETRY
Since: API Level 5
This flag is set in onStartCommand(Intent, int, int) if the Intent is a a retry because the original
attempt never got to or returned from onStartCommand(Intent, int, int).
Constant Value: 2 (0x00000002)
public static final int START_NOT_STICKY
Since: API Level 5
Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it
is started (after returning from onStartCommand(Intent, int, int)), and there are no new start
intents to deliver to it, then take the service out of the started state and don't recreate until a future explicit call to
Context.startService(Intent). The service will not receive a onStartCommand(Intent,
int, int) call with a null Intent because it will not be re-started if there are no pending Intents to deliver.
This mode makes sense for things that want to do some work as a result of being started, but can be stopped when
under memory pressure and will explicit start themselves again later to do more work. An example of such a service
would be one that polls for data from a server: it could schedule an alarm to poll every N minutes by having the
alarm start its service. When its onStartCommand(Intent, int, int) is called from the alarm, it
schedules a new alarm for N minutes later, and spawns a thread to do its networking. If its process is killed while
doing that check, the service will not be restarted until the alarm goes off.
Constant Value: 2 (0x00000002)
public static final int START_REDELIVER_INTENT
Since: API Level 5
Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it
is started (after returning from onStartCommand(Intent, int, int)), then it will be scheduled for a
restart and the last delivered Intent re-delivered to it again via onStartCommand(Intent, int, int).
This Intent will remain scheduled for redelivery until the service calls stopSelf(int) with the start ID provided
to onStartCommand(Intent, int, int). The service will not receive a
onStartCommand(Intent, int, int) call with a null Intent because it will will only be re-started if it is
not finished processing all Intents sent to it (and any such pending events will be delivered at the point of restart).
Constant Value: 3 (0x00000003)
public static final int START_STICKY
Since: API Level 5
Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it
is started (after returning from onStartCommand(Intent, int, int)), then leave it in the started state
but don't retain this delivered intent. Later the system will try to re-create the service. Because it is in the started
state, it will guarantee to call onStartCommand(Intent, int, int) after creating the new service
instance; if there are not any pending start commands to be delivered to the service, it will be called with a null intent
object, so you must take care to check for this.
This mode makes sense for things that will be explicitly started and stopped to run for arbitrary periods of time, such
as a service performing background music playback.
Constant Value: 1 (0x00000001)
public static final int START_STICKY_COMPATIBILITY
Since: API Level 5
onStartCommand(Intent, int, int): compatibility version of
Constant to return from
START_STICKY that does not guarantee that onStartCommand(Intent, int, int) will be called
again after being killed.
Constant Value: 0 (0x00000000)
Public Constructors
public Service ()
Since: API Level 1
Public Methods
public final Application getApplication ()
Since: API Level 1
Return the application that owns this service.
public abstract IBinder onBind (Intent intent)
Since: API Level 1
Return the communication channel to the service. May return null if clients can not bind to the service. The returned
IBinder is usually for a complex interface that has been described using aidl.
Note that unlike other application components, calls on to the IBinder interface returned here may not happen on the
main thread of the process. More information about this can be found in Application Fundamentals: Processes and
Threads.
Parameters
intent The Intent that was used to bind to this service, as given to Context.bindService. Note that
any extras that were included with the Intent at that point will not be seen here.
Returns
Return an IBinder through which clients can call on to the service.
public void onConfigurationChanged (Configuration newConfig)
Since: API Level 1
Called by the system when the device configuration changes while your component is running. Note that, unlike
activities, other components are never restarted when a configuration changes: they must always deal with the
results of the change, such as by re-retrieving resources.
At the time that this function has been called, your Resources object will have been updated to return resource
values matching the new configuration.
Parameters
newConfig The new device configuration.
public void onCreate ()
Since: API Level 1
Called by the system when the service is first created. Do not call this method directly.
public void onDestroy ()
Since: API Level 1
Called by the system to notify a Service that it is no longer used and is being removed. The service should clean up
an resources it holds (threads, registered receivers, etc) at this point. Upon return, there will be no more calls in to
this Service object and it is effectively dead. Do not call this method directly.
public void onLowMemory ()
Since: API Level 1
This is called when the overall system is running low on memory, and would like actively running process to try to
tighten their belt. While the exact point at which this will be called is not defined, generally it will happen around the
time all background process have been killed, that is before reaching the point of killing processes hosting service
and foreground UI that we would like to avoid killing.
Applications that want to be nice can implement this method to release any caches or other unnecessary resources
they may be holding on to. The system will perform a gc for you after returning from this method.
public void onRebind (Intent intent)
Since: API Level 1
Called when new clients have connected to the service, after it had previously been notified that all had
disconnected in its onUnbind(Intent). This will only be called if the implementation of
onUnbind(Intent) was overridden to return true.
Parameters
intent The Intent that was used to bind to this service, as given to Context.bindService. Note that
any extras that were included with the Intent at that point will not be seen here.
public void onStart (Intent intent, int startId)
Since: API Level 1
This method is deprecated.
Implement onStartCommand(Intent, int, int) instead.
public int onStartCommand (Intent intent, int flags, int startId)
Since: API Level 5
Called by the system every time a client explicitly starts the service by calling startService(Intent),
providing the arguments it supplied and a unique integer token representing the start request. Do not call this
method directly.
For backwards compatibility, the default implementation calls onStart(Intent, int) and returns either
START_STICKY or START_STICKY_COMPATIBILITY.
If you need your application to run on platform versions prior to API level 5, you can use the following model to
handle the older onStart(Intent, int) callback in that case. The handleCommand method is
implemented by you as appropriate:
// This is the old onStart method that will be called on the pre-2.0
// platform. On 2.0 or later we override onStartCommand() so this
// method will not be called.
@Override
public void onStart(Intent intent, int startId) {
handleCommand(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleCommand(intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
Parameters
intent The Intent supplied to startService(Intent), as given. This may be null if the service is
being restarted after its process has gone away, and it had previously returned anything except
START_STICKY_COMPATIBILITY.
flags Additional data about this start request. Currently either 0, START_FLAG_REDELIVERY, or
START_FLAG_RETRY.
startId A unique integer representing this specific request to start. Use with stopSelfResult(int).
Returns
The return value indicates what semantics the system should use for the service's current started state. It
may be one of the constants associated with the START_CONTINUATION_MASK bits.
See Also
stopSelfResult(int)
public boolean onUnbind (Intent intent)
Since: API Level 1
Called when all clients have disconnected from a particular interface published by the service. The default
implementation does nothing and returns false.
Parameters
intent The Intent that was used to bind to this service, as given to Context.bindService. Note that
any extras that were included with the Intent at that point will not be seen here.
Returns
Return true if you would like to have the service's onRebind(Intent) method later called when new
clients bind to it.
public final void setForeground (boolean isForeground)
Since: API Level 1
This method is deprecated.
This is a now a no-op, use startForeground(int, Notification) instead. This method has
been turned into a no-op rather than simply being deprecated because analysis of numerous poorly behaving
devices has shown that increasingly often the trouble is being caused in part by applications that are abusing it.
Thus, given a choice between introducing problems in existing applications using this API (by allowing them to
be killed when they would like to avoid it), vs allowing the performance of the entire system to be decreased,
this method was deemed less important.
public final void startForeground (int id, Notification notification)
Since: API Level 5
Make this service run in the foreground, supplying the ongoing notification to be shown to the user while in this state.
By default services are background, meaning that if the system needs to kill them to reclaim more memory (such as
to display a large page in a web browser), they can be killed without too much harm. You can set this flag if killing
your service would be disruptive to the user, such as if your service is performing background music playback, so
the user would notice if their music stopped playing.
If you need your application to run on platform versions prior to API level 5, you can use the following model to call
the the older setForeground(boolean) or this modern method as appropriate:
private static final Class[] mStartForegroundSignature = new Class[] {
int.class, Notification.class};
private static final Class[] mStopForegroundSignature = new Class[] {
boolean.class};
private NotificationManager mNM;
private Method mStartForeground;
private Method mStopForeground;
private Object[] mStartForegroundArgs = new Object[2];
private Object[] mStopForegroundArgs = new Object[1];
/**
* This is a wrapper around the new startForeground method, using the older
* APIs if it is not available.
*/
void startForegroundCompat(int id, Notification notification) {
// If we have the new startForeground API, then use it.
if (mStartForeground != null) {
mStartForegroundArgs[0] = Integer.valueOf(id);
mStartForegroundArgs[1] = notification;
try {
mStartForeground.invoke(this, mStartForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke startForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke startForeground", e);
}
return;
}
// Fall back on the old API.
setForeground(true);
mNM.notify(id, notification);
}
/**
* This is a wrapper around the new stopForeground method, using the older
* APIs if it is not available.
*/
void stopForegroundCompat(int id) {
// If we have the new stopForeground API, then use it.
if (mStopForeground != null) {
mStopForegroundArgs[0] = Boolean.TRUE;
try {
mStopForeground.invoke(this, mStopForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke stopForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke stopForeground", e);
}
return;
}
// Fall back on the old API. Note to cancel BEFORE changing the
// foreground state, since we could be killed at that point.
mNM.cancel(id);
setForeground(false);
}
@Override
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
try {
mStartForeground = getClass().getMethod("startForeground",
mStartForegroundSignature);
mStopForeground = getClass().getMethod("stopForeground",
mStopForegroundSignature);
} catch (NoSuchMethodException e) {
// Running on an older platform.
mStartForeground = mStopForeground = null;
}
}
@Override
public void onDestroy() {
// Make sure our notification is gone.
stopForegroundCompat(R.string.foreground_service_started);
}
Parameters
id The identifier for this notification as per NotificationManager.notify(int,
Notification).
notification The Notification to be displayed.
See Also
stopForeground(boolean)
public final void stopForeground (boolean removeNotification)
Since: API Level 5
Remove this service from foreground state, allowing it to be killed if more memory is needed.
Parameters
removeNotification If true, the notification previously provided to startForeground(int,
Notification) will be removed. Otherwise it will remain until a later call removes it
(or the service is destroyed).
See Also
startForeground(int, Notification)
public final void stopSelf ()
Since: API Level 1
Stop the service, if it was previously started. This is the same as calling stopService(Intent) for this
particular service.
See Also
stopSelfResult(int)
public final void stopSelf (int startId)
Since: API Level 1
Old version of stopSelfResult(int) that doesn't return a result.
See Also
stopSelfResult(int)
public final boolean stopSelfResult (int startId)
Since: API Level 1
Stop the service if the most recent time it was started was startId. This is the same as calling
stopService(Intent) for this particular service but allows you to safely avoid stopping if there is a start
request from a client that you haven't yet seen in onStart(Intent, int).
Be careful about ordering of your calls to this function.. If you call this function with the most-recently received ID
before you have called it for previously received IDs, the service will be immediately stopped anyway. If you may
end up processing IDs out of order (such as by dispatching them on separate threads), then you are responsible for
stopping them in the same order you received them.
Parameters
startId The most recent start identifier received in onStart(Intent, int).
Returns
Returns true if the startId matches the last start request and the service will be stopped, else false.
See Also
stopSelf()
Protected Methods
protected void dump (FileDescriptor fd, PrintWriter writer, String[] args)
Since: API Level 1
Print the Service's state into the given stream. This gets invoked if you run "adb shell dumpsys activity service ". This
is distinct from "dumpsys ", which only works for named system services and which invokes the
dump(FileDescriptor, String[]) method on the IBinder interface registered with
ServiceManager.
Parameters
fd The raw file descriptor that the dump is being sent to.
writer The PrintWriter to which you should dump your state. This will be closed for you after you return.
args additional arguments to the dump request.
protected void finalize ()
Since: API Level 1
Is called before the object's memory is being reclaimed by the VM. This can only happen once the VM has detected,
during a run of the garbage collector, that the object is no longer reachable by any thread of the running application.
The method can be used to free system resources or perform other cleanup before the object is garbage collected.
The default implementation of the method is empty, which is also expected by the VM, but subclasses can override
finalize() as required. Uncaught exceptions which are thrown during the execution of this method cause it to
terminate immediately but are otherwise ignored.
Note that the VM does guarantee that finalize() is called at most once for any object, but it doesn't guarantee
when (if at all) finalize() will be called. For example, object B's finalize() can delay the execution of
object A's finalize() method and therefore it can delay the reclamation of A's memory. To be safe, use a
ReferenceQueue, because it provides more control over the way the VM deals with references during garbage
collection.
Throws
Throwable
Except as noted, this content is licensed under Apache 2.0. For details and restrictions, see the Content License.
Android 2.2 r1 - 14 May 2010 15:20
Site Terms of Service - Privacy Policy - Brand Guidelines