Showing posts with label local service. Show all posts
Showing posts with label local service. Show all posts

Monday, September 21, 2009

Service and Notification | Android Tutorial for Beginners – (Part 8)


Now that we have worked with services and notifications separately, we are all ready to use the two together to make a real service that is notified to the user through a status bar update that the service is running. The status bar removes the notification as soon as the service is stopped.


In this program, I also increment a counter once the service starts to show that the service is continuously running in the background while we do other work. When we stop the service we are able to see the updated count.


Let us look at the code:


I have created a class NotifyService which extends the service class. This is the service class that will be started through the activity – ServiceLauncher


Now let us see what the service does?


It does 3 things – Toast a message that the service has started. Update the status bar with a notification. Finally start incrementing the counter. All this is done in the onCreate() method of the NotifyService Class


Toast.makeText(this,"Service created at " + time.getTime(), Toast.LENGTH_LONG).show();
showNotification();          
            incrementCounter();


Here is theshowNotification() Method:


    private void showNotification() {
 CharSequence text = getText(R.string.service_started);
 Notification notification = new Notification(R.drawable.android, text, System.currentTimeMillis());
 PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, ServiceLauncher.class), 0);
notification.setLatestEventInfo(this, getText(R.string.service_label),
      text, contentIntent);
nm.notify(R.string.service_started, notification);
    }


Finally, here is the method for incrementing the counter incrementCounter():


    private void incrementCounter() {
timer.scheduleAtFixedRate(new TimerTask(){ public void run() {counter++;}}, 0, 1000L);
    }


On stopping the service, it obviously has to do the reverse actions: stop the counter, remove the status bar notification and then toast a message to the end user saying the service has stopped! So here it is:


      shutdownCounter();
      nm.cancel(R.string.service_started);
      Toast.makeText(this, "Service destroyed at " + time.getTime() + "; counter is at: " + counter, Toast.LENGTH_LONG).show();
      counter=null;


This is the code in the onDestroy()method in the NotifyServiceclass.


With this the service is ready. But we need to be able to start this service and stop it. This I have done through a ServiceLauncher class just as I had done in the previous part of this series. You can get the complete code here.

Thursday, September 3, 2009

Local Service | Android Tutorial for Beginners – (Part 7)


Service is a fundamental component in android. Many a time, applications will need to run processes for a long time without any intervention from the user, or very rare interventions. These background processes need to keep running even when the phone is being used for other activities / tasks.


To accommodate for such a requirement, android has introduced the “Service” component. It is a long lived component and does not implement any user interface of its own.


Typically a user interacts with a service through an activity that has a UI. The service by itself “notifies” the user in case of any need for user intervention.


In this article, I would like to introduce you to a very simple service which runs in the background but does not have any notification features.


In order to start and stop the service, I have created an activity called the service controller.


In my example, when the service starts, it toasts a message that the service has started. When the service ends, it toasts a message that the service has ended. This is not of much use in the real sense of services. However, it simplifies the introduction of service creation and destruction.


Ideally, one of the ways could be: a service that is running should notify itself as running by putting up a status bar notification as discussed in the previous article. And when the service has completed running the notification can be removed. Through the notification, the service can give a user interface for binding to the service or viewing the status of the service or any other similar interaction with the service. The combination of service with notification will be an example I will give in the next part.


Before we jump into the example, a little more about services.


Binding to a service:
Once a service has begun and is running in the background, any number of activities can “bind” to the service. In fact, if we want to bind to a service that has not started, calling to bind could initiate the service. Such a service would shut down as soon as the last user detaches from the service.


Remote service
The services defined above are those that run in the same process as the application that started it. However, we can have services that run in its own process. This is particularly useful when the service has to run for a long time, typical example being a background music player. For two processes to communicate, the object being passed needs to be marshaled.


For this, Android provides a AIDL tool (Android Interface Definition Language) to handle all marshalling and communication. The remote service example will be taken up in a subsequent article.


Service Example (code downloadable here)


Step 1:
Let us start with creating a service class that extends android.app.Service.
This service just displays a message when started and again displays a message when stopped. Hence the onStart()and onDestroy() methods are implemented. Here is the code.


public class SimpleService extends Service {
      @Override
      public IBinder onBind(Intent arg0) {
            return null;
      }
      @Override
      public void onCreate() {
            super.onCreate();
            Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
      }
     
      @Override
      public void onDestroy() {
            super.onDestroy();
            Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();
      }
}


Step 2:
An entry for this service needs to be made in the AndroidManifest.xml file. Here it is:


            <service android:name=".SimpleService">
            </service>


Step 3:
Now, we need to be able to invoke this service. i.e. start the service and stop the service. I choose to write an activity that can start and stop the service. This activity is called SimpleServiceController.
Here is what it does:
To start the service –


              Button start = (Button)findViewById(R.id.serviceButton);
…
              start.setOnClickListener(startListener);
…
       private OnClickListener startListener = new OnClickListener() {
            public void onClick(View v){
startService(new Intent(SimpleServiceController.this,SimpleService.class));
            }                
       };


Similarly to stop the service –
              Button stop = (Button)findViewById(R.id.cancelButton);
…
              stop.setOnClickListener(stopListener);
…
       private OnClickListener stopListener = newOnClickListener() {
            public void onClick(View v){
stopService(new Intent(SimpleServiceController.this,SimpleService.class));
            }                
          };


Step 4:
The entry for this class in the AndroidManifest.xml file is as usual:
        <activity android:name=".SimpleServiceController"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>


Now we can launch this application and we can start and stop a service.