Friday 3 April 2015

IntentService in Android example.

Executing Asynchronous tasks on Separate threads using intentService 


In earlier posts, you saw how to start a service using the startService() method and stop a service using the stopService() method.
You have also seen how you should execute long-running task on a separate thread — not the same thread as the calling activities.
It is important to note that once your service has finished executing a task, it should be stopped as soon as possible so that it does not unnecessarily hold up valuable resources.
That’s why you use the stopSelf() method to stop the service when a task has been completed. Unfortunately, a lot of developers often forgot to terminate the service when it is done performing its task.
To easily create a service that runs a task asynchronously and terminates itself when it is done, you can use the IntentService class.

The IntentService class is a base class for Service that handles asynchronous requests on demand.
It is started just like a normal service and it executes its task within a worker thread and terminates itself when the task is completed.

The following example demonstrates how to use the IntentService class.

Using the intentService Class to Auto-Stop a Service


1. Add a new class file named MyIntentService.java.

2 . Populate the MyIntentService.java file as follows:

package com.emergingandroidtech.Services;

import java.net.MalformedURLException;
import java.net.URL;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class MyIntentService extends IntentService {
       
    public MyIntentService() {
        super("MyIntentServiceName");
    }   
   
    @Override
    protected void onHandleIntent(Intent intent) {       
        try {
            int result =
                DownloadFile(new URL("http://www.amazon.com/somefile.pdf"));
            Log.d("IntentService", "Downloaded " + result + " bytes");
           
            //---send a broadcast to inform the activity
            // that the file has been downloaded---
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("FILE_DOWNLOADED_ACTION");           
            getBaseContext().sendBroadcast(broadcastIntent);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
   
    private int DownloadFile(URL url) {       
        try {
            //---simulate taking some time to download a file---
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        return 100;
    }   
}

 3 . Add the following statement in bold to the AndroidManifest.xml file: 



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.emergingandroidtech.Services"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService">
            <intent-filter>
                <action android:name="com.emergingandroidtech.MyService" />               
            </intent-filter>
        </service>
       
       
       
        <service android:name=".MyIntentService" />
    </application>
    <uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

 4. Add the following in main.xml file.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button android:id="@+id/btnStartService"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Start Service" />
       
<Button android:id="@+id/btnStopService"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Stop Service" />
       
</LinearLayout>



5 . Add the following statement in bold to the MainActivity.java file:  

public​ class ​MainActivity ​extends​ Activity​
​​​​
/**​Called​ when ​the​ activity ​is first ​created.​*/ ​​
@Override 
​​​​public ​void ​onCreate(Bundle ​savedInstanceState)​
​​​​​​​​super.onCreate(savedInstanceState); ​
​​​​​​​setContentView(R.layout.main);
​​​​​​​​
Button ​btnStart​=​(Button)​findViewById(R.id.btnStartService); 
​​​​​​​​btnStart.setOnClickListener(new​View.OnClickListener()
​{ 
​​​​​​​​​​​​public ​void​ onClick(View​ v)
​{ 
​​​​​​​​​​​​​​​​//startService(new Intent(getBaseContext(), MyService.class)); 
​​​​​​​​​​​​​​​​startService(new Intent(getBaseContext(), MyIntentService.class)); ​
​​​​​​​​​​​} ​​​​​​​​
});
​​​​​​​​
Button ​btnStop​=​(Button)​findViewById(R.id.btnStopService); 
​​​​​​​​btnStop.setOnClickListener(new​View.OnClickListener()​
​​​​​​​​​​​​public ​void​ onClick(View​ v)​
{ ​
​​​​​​​​​​​​​​​stopService(new​Intent(getBaseContext(),​MyService.class)); ​​​​
​​​​​​​​} 
​​​​​​​​}); 
​​​​} 
}
 
5 . Click the Start Service button. After about five seconds, you should observe the following statement in the LogCat window:
 
01-17​03:05:21.244:​DEBUG/IntentService(692):​ Downloaded ​100​bytes

No comments:

Post a Comment