3.5 KiB
3.5 KiB
Services
Uses of services
- MP3 Playback
- Playing songs in the background
- Network Access
- Long downloads, sending emails, polling an email server for new mail, etc.
Services
An application component that
- Has no UI
- Represents a desire to perform a longer-running operation
Activities are loaded and unloaded as users move around the app
- Services remain for as long as they are needed
- One service may be used by many other applications to avoid duplication of resources.
What are Services not?
Not a separate process - runs in the same process as the application in which it is declared
Not a thread - there's one thread per application
Services are simple
- It's a way of telling the system about a part of your app that is expected to run for a long time
- i.e. longer than a few seconds
Tasks, Services and Activities
- Checks for new mail occasionally -> Service
- Collects new mail and stores it -> Service
- Notifies user that there is new mail -> Service / Activity
- New component - notifications
- User switches to inbox and retrieves/views new mail -> Activity
MP3 Playback task
- Play music while user does something else -> Service
- Create a playlist -> Activity
- Change the song playing & display current song progress -> Service / Activity
Creating a Service
- Services are designed to support communication with
- Local activities (in the same process)
- within VM
- Remote activities
- IPC (Inter-process communication)
- Multiple components
- providing a service for multiple clients
- Local activities (in the same process)
Services are components, similar to an activity
- Register the service in the manifest
- Create a subclass of
android.app.Service - Handle the relevant life cycle methods
Service Life Cycle
- By nature, services are singleton objects
- A service might be used by many clients
- A service is started by something
- via an
intent - The service subclass object is instantiated if necessary
onCreate()is called- either
onStartCommandoronBindwill be called depending on how the service has been invoked
- via an
onCreate()/onStart()/onBind()are called in the context of the main UI thread- A single thread for all components in an application
- Must spawn a worker thread
- Something calls
stopService()- Could be the service, one of the clients (the activity) or the OS
onDestroy()
Code Examples
MainActivity class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle ...) {
...
}
//if clicked twice - onStartCommand is called, onCreate is called ONCE
public void onClickStartService(View v){
this.startService(new Intent(MainActivity.this, SimpleService.class));
}
public void onClickStopService(View v){
this.stopService(new Intent(MainActivity.this, SimpleService.class));
}
public void onClickClobberService(View v) {
android.os.Process.killProcess(android.os.Process.myPid());
}
}
SimpleService class
public class SimpleService extends Service {
//called first
public void onCreate() {
super.onCreate();
}
//called second
public int onStartCommand(Intent i, int flags, int startId) {
return Service.START_REDELIVER_INTENT;
}
}
Android Manifest
<service
android:name=".SimpleService"
android:exported="false">
</service>