codestory

Die Anleitung zu Android Services

  1. Die Services im Android
  2. Die unzwanghaften Dienstleistungen  (Un bounded Service)
  3. Die verbindeten Dienstleistungen (Bouned Service)
  4. Die Dienstleistung IntentService

1. Die Services im Android

Was ist die Dienstleistung?
Eine Dienstleistung (Service) ist eine auf dem Betriebsystem implizite laufende Teil um die langfristigen Aktionen ohne die Interaktion mi dem Benutzer durchzuführen und sie funktioniert auch wenn die Applikation zerstört wird. Eine grundlegende Dienstleistung können 2 Typen haben
Status
Die Bezeichnung
Started

(gestartet)
Eine Dienstleistung wird started (gestartet) genannt wenn ein Teil von der Applikation, zum Beispiel Activity startet sie durch die Aufruf auf startService(). Bei der Aufruf kann die Dienstleistung in dem Modus von Hintergrund unbefristet laufen, sogar auch wenn der Teil, der sie gestartet hat, zerstört wird

Die Dienstleistung wird die unbegrenzte Dienstleistung (Un Bounded Service).
Bound

(begrenzt)
Ein Diensleitung ist begrenzt (bound) wenn ein Teil der Applikation sie durch die Aufruf von bindService() begrenzt (bound)
Eine begrenzte Dienstleistung bietet eine Interface client-server zur Interaktion mit der Dienstleistung, die Sendung der Anforderungen oder die Aufnahme des Ergebnisse und sogar Laufen durch vielen Prozessen mit Interprocess communication (IPC)
In der Computerwissenschaft ist inter-process communication (IPC) eine Aktion zum spezifischen Daten-Austausch durch vielen Prozessen, die normaleweise die Kommunikation benutz. Gegenständlich verwendet die Applikation getrennte IPC wie clients and servers. Wenn die Clients die Daten fordert, befriedigt der Server die Anforderung vom Client.
life cycle callback methods implementieren Sie um die Änderungen der Status von Dienstleistung zu verfolgen und Sie können die Aufgabe in der angemessenen Phrase durchführen. das linke folgende Schema zeigt dass, der Lebenkreis (life-circle) wird durch startService() erstellt und das rechte bezeichnet, der Lebenkreis der Dienstleistung wird durch bindService() erstellt
Um eine Dienstleitung zu erstellen sollen Sie eine Java Klasse erstellen ,die die Klasse Service oder einer der Sub-Klasse erweitern. Die Klasse Service definiert die unterschiedlichen und meist wichtigen Methode von Callback wie folgend. Sie sollen alle Callbacks-Methode nicht implementieren. Aber es ist wichtig wenn Sie die Aufgabe jeder Methode verstehen. Und stellen Sie sicher, Ihre Applikation befriedigt den Benutzer
Außer 2 obengemeinten Dienstleistungen gibt es eine andere, die sogenannte IntentService. Intent Service wird benutzt, eine Aufgabe nur einzige Mal durchzuführen, d.h bei der Erledigung der Aufgabe ist die Dienstleitung beendet
Der Vergleich von den Dienstleistungen:
Unbound Service
(unbegrenzt)
Bound Service
(begrenzt)
Intent
Service
Unbounded Service wird benutzt um die Aufgabe langfristig und wiederholt durchzuführen
Bounded Service wird benutzt um die Aufgabe im Hintergrund (background) und bindend mit der Element von Interface durchzuführen
Intent Service wird benutzt um die Aufgabe nur einmal durchzuführen. d.h bei der Aufgabeerledigung wird die Dienstleistung selbst zerstört.
Unbound Service wird durch die Aufruf auf startService().gestartet.
Bounded Service wird durch die Aufruf auf bindService().gestartet
Intent Service wird durch die Aufruf auf startService().gestartet
Unbound Service wird durch die explizite Aufruf auf die Methode stopService().gestoppt oder zerstört
Bounded Service wird durch die Aufruf auf unbindService() losgebindet
IntentService wird durch die implizite Aufruf auf die Methode stopself() beendet
Unbound Service ist unabhängig von der Elemente, die sie gestartet hat
Bound Service ist abhängig von der Elemente, die sie gestartet hat
Intent Service ist unabhängig von der Elemente, die sie gestartet hat
Die Methode Callback und die Bezeichnung
Callback
Description
onStartCommand()
The system calls this method when another component, such as an activity, requests that the service be started, by calling startService(). If you implement this method, it is your responsibility to stop the service when its work is done, by calling stopSelf() or stopService() methods.
onBind()
The system calls this method when another component wants to bind with the service by calling bindService(). If you implement this method, you must provide an interface that clients use to communicate with the service, by returning an IBinder object. You must always implement this method, but if you don't want to allow binding, then you should return null.
onUnbind()
The system calls this method when all clients have disconnected from a particular interface published by the service.
onRebind()
The system calls this method when new clients have connected to the service, after it had previously been notified that all had disconnected in its onUnbind(Intent).
onCreate()
The system calls this method when the service is first created using onStartCommand() or onBind(). This call is required to perform one-time set-up.
onDestroy()
The system calls this method when the service is no longer used and is being destroyed. Your service should implement this to clean up any resources such as threads, registered listeners, receivers, etc.

2. Die unzwanghaften Dienstleistungen  (Un bounded Service)

Unbound Service (Oder Started Service sogenannt): In diesem Situation startet ein Teil der Applikation die Dienstleistung durch die Aufruf auf startService(), und die Dienstleistung wird weiter in dem Hintergrund (background) laufen, auch wenn die Erstellungselemente zerstört werden. z. B bei dem Starten wird eine Dienstleistung die Musik im Hintergrund unbefristet weiter spielen
Die Methode onStartCommand() gibt das Typ integer rück und sie sind einer der folgenden Werte
  • START_STICKY
  • START_NOT_STICKY
  • TART_REDELIVER_INTENT
START_STICKY & START_NOT_STICKY
Die beiden Werte sind angemessen nur wenn der Speicher des Handy voll ist
START_STICKY informiert dem Betriebssystem um die Dienstleistung nach dem genugen Speicher zu erstellen und auf onStartCommand() noch einmal mit einem Intent null aufzurufen.
START_NOT_STICKY informiert dem Betriebssystem um sich um die Erstellung der Dienstleistung noch einmal zu kümmern
Außerdem gibt es ein START_REDELIVER_INTENT. Das ist ein dritte Wert, die dem Betriebssystem zur Erstellung der Dienstleistung und Sendung eines ähnlichen Intent für onStartCommand().informiert
Das Beispiel über die Dienstleistung für das Musik Spielen
Erstellen Sie ein "Empty Activity" Projekt mit dem Name von PlaySongService
  • Name: PlaySongService
  • Package name: org.o7planning.playsongservice
Das Projekt wird erstellt
Bereiten Sie die Musik File mp3 vor:
Drücken Sie die Rechtmaustaste auf dem Ordner res und wählen Sie:
  • New > Folder > Raw Resources Folder
Eine Musik-File Mp3 in den Verzeichnis 'raw', den Sie erstellt haben, kopieren und aufkleben
Die Interfacedesign der Anwendung:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:text="Play"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="37dp"
        android:text="Stop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_play" />
</androidx.constraintlayout.widget.ConstraintLayout>
Die Klasse Service erstellen
Drücken Sie die Rechtmaustaste auf einer Java package, und wählen Sie:
  • New > Service > Service
den Name der Klasse eingeben
  • PlaySongService
Sie können sehen, dass PlaySongService mit AndroidManifest.xml deklariert wurde:
** AndroidManifest.xml **
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.o7planning.playsongservice">

    <application ...>

        <service
            android:name=".PlaySongService"
            android:enabled="true"
            android:exported="true"></service>

            ....

    </application>

</manifest>
PlaySongService.java
package org.o7planning.playsongservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.media.MediaPlayer;

public class PlaySongService extends Service {

    private MediaPlayer mediaPlayer;

    public PlaySongService() {
    }

    // Return the communication channel to the service.
    @Override
    public IBinder onBind(Intent intent){
        // This service is unbounded
        // So this method is never called.
        return null;
    }


    @Override
    public void onCreate(){
        super.onCreate();
        // Create MediaPlayer object, to play your song.
        mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.mysong);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        // Play song.
        mediaPlayer.start();

        return START_STICKY;
    }

    // Destroy
    @Override
    public void onDestroy() {
        // Release the resources
        mediaPlayer.release();
        super.onDestroy();
    }
}
MainActivity.java
package org.o7planning.playsongservice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button buttonPlay;
    private Button buttonStop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.buttonPlay = (Button) this.findViewById(R.id.button_play);
        this.buttonStop = (Button) this.findViewById(R.id.button_stop);

        this.buttonPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playSong();
            }
        });

        this.buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopSong();
            }
        });
    }

    // This method is called when users click on the Play button.
    public void playSong()  {
        // Create Intent object for PlaySongService.
        Intent myIntent = new Intent(MainActivity.this, PlaySongService.class);

        // Call startService with Intent parameter.
        this.startService(myIntent);
    }

    // This method is called when users click on the Stop button.
    public void stopSong( )  {
        
        // Create Intent object
        Intent myIntent = new Intent(MainActivity.this, PlaySongService.class);
        this.stopService(myIntent);
    }

}
OK jetzt können Sie Ihre Applikation starten und das Lied hören

3. Die verbindeten Dienstleistungen (Bouned Service)

Hier emuliere ich eine Dienstleistung für die Versorgung der Wetterinformation für den momentanen Tag, der Input is die geographischen Position (Hanoi, Chicago, ...),und der Output ist der Regen, Sonnen....
Erstellen Sie ein Projekt mit dem Name von WeatherService.
  • Name: WeatherService
  • Package name: org.o7planning.weatherservice
Die Interfacedesign für die Anwendung:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="38dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="17dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Location:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText_location"
        android:layout_width="0dp"
        android:layout_height="47dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="23dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView_weather"
        android:layout_width="0dp"
        android:layout_height="45dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="59dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText_location" />

    <Button
        android:id="@+id/button_weather"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp"
        android:text="Show Weather"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView_weather" />
</androidx.constraintlayout.widget.ConstraintLayout>
Erstellen Sie eine Service:
Drücken Sie die Rechtmaustaste auf einer java package und wählen SIe:
  • New > Service > Service
Geben Sie ein:
  • Class name: WeatherService
Die Klasse WeatherService wurde erstellt. Und die wird aus der Klasse android.app.Service.erweitert
Sie können sehen, dass WeatherService mit AndroidManifest.xml deklariert wurde:
** AndroidManifest.xml **
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.o7planning.weatherservice">

    <application ...>
        <service
            android:name=".WeatherService"
            android:enabled="true"
            android:exported="true"></service>

        ...

    </application>

</manifest>
WeatherService.java
package org.o7planning.weatherservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Binder;
import android.util.Log;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;


public class WeatherService extends Service {

    private static String LOG_TAG = "WeatherService";

    // Store the weather data.
    private static final Map<String, String> weatherData = new HashMap<String,String>();

    private final IBinder binder = new LocalWeatherBinder();

    public class LocalWeatherBinder extends Binder {

        public WeatherService getService()  {
            return WeatherService.this;
        }
    }

    public WeatherService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(LOG_TAG,"onBind");
        return this.binder;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.i(LOG_TAG, "onRebind");
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(LOG_TAG, "onUnbind");
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "onDestroy");
    }

    // Returns the weather information corresponding to the location of the current date.
    public String getWeatherToday(String location) {
        Date now= new Date();
        DateFormat df= new SimpleDateFormat("dd-MM-yyyy");

        String dayString = df.format(now);
        String keyLocAndDay = location + "$"+ dayString;

        String weather=  weatherData.get(keyLocAndDay);
        //
        if(weather != null)  {
            return weather;
        }

        //
        String[] weathers = new String[]{"Rainy", "Hot", "Cool", "Warm" ,"Snowy"};

        // Random value from 0 to 4
        int i= new Random().nextInt(5);

        weather =weathers[i];
        weatherData.put(keyLocAndDay, weather);
        //
        return weather;
    }

}
MainActivity.java
package org.o7planning.weatherservice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private boolean binded = false;
    private WeatherService weatherService;

    private TextView textViewWeather;
    private EditText editTextLocation;
    private Button buttonWeather;

    ServiceConnection weatherServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            WeatherService.LocalWeatherBinder binder = (WeatherService.LocalWeatherBinder) service;
            weatherService = binder.getService();
            binded = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binded = false;
        }
    };

    // When the Activity creating its interface.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        this.textViewWeather = (TextView) this.findViewById(R.id.textView_weather);
        this.editTextLocation = (EditText) this.findViewById(R.id.editText_location);
        this.buttonWeather = (Button) this.findViewById(R.id.button_weather);

        this.buttonWeather.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 showWeather();
            }
        });
    }

    // When Activity starting.
    @Override
    protected void onStart() {
        super.onStart();

        // Create Intent object for WeatherService.
        Intent intent = new Intent(this, WeatherService.class);

        // Call bindService(..) method to bind service with UI.
        this.bindService(intent, weatherServiceConnection, Context.BIND_AUTO_CREATE);
    }

    // Activity stop
    @Override
    protected void onStop() {
        super.onStop();
        if (binded) {
            // Unbind Service
            this.unbindService(weatherServiceConnection);
            binded = false;
        }
    }

    // When user click on 'Show weather' button.
    public void showWeather()  {
        String location = this.editTextLocation.getText().toString();

        String weather= this.weatherService.getWeatherToday(location);

        this.textViewWeather.setText(weather);
    }

}
OK, jetzt können Sie die Applikation starten.

4. Die Dienstleistung IntentService

Das Beipiel über IntentService:
Das folgende Bild bezeichnet die Kommunikation zwischen Client (Activity) und IntentService. Client startet die Dienstleistung. Sie sendet ihre Anforderung nach einem Objekt Intent. Die Dienstleistung läuft und tut ihre Aufgaben, gleichzeitig kann sie die Information der Aufgabestatus senden, zum Beispiel wie viele Prozent hat sie erledigt. Bei dem Client kann ProgressBar zur Anzeige der % der Erledigung der Aufgabe benutzt werden
Der IntentService wurde entwickelt, um automatisch auf natürliche Weise zu stoppen, wenn die Arbeit erledigt ist, und nur einmal zu verwenden, daher sollten Sie es in solchen Situationen verwenden. Die <context>.stopService(intentService) Methode funktioniert nicht mit dem IntentService. Darüber hinaus ist es für Sie schwierig, die UI- Anwendung (Benutzerinterface) zu verwenden, um mit dem IntentService zu interagieren.
Erstellen Sie ein Projekt SimpleIntentService.
  • Name: SimpleIntentService
  • Package name: org.o7planning.simpleintentservice
Die Interface entwerfen:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="0dp"
        android:layout_height="25dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView_percent"
        android:layout_width="0dp"
        android:layout_height="22dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:gravity="center"
        android:text="(Percent)"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBar" />

    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="27dp"
        android:text="Start"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView_percent" />

    <Button
        android:id="@+id/button_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="26dp"
        android:text="Stop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_start" />
</androidx.constraintlayout.widget.ConstraintLayout>
Erstellen Sie ein IntentService durch das Klicken der Rechtmaustaste auf einer Package und dann wählen
  • New > Service > Service (IntentService)
Sie können sehen, dass SimpleIntentService mit AndroidManifest.xml deklariert wird:
** AndroidManifest.xml **
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.o7planning.simpleintentservice">

    <application ...>
        <service
            android:name=".SimpleIntentService"
            android:exported="false"></service>

        ...
    </application>

</manifest>
Die Klasse SimpleIntentService wird erstellt. Sie wird mit AndroidManifest.xml registriert. Die erstellte Code ist eine Vorschlage für Sie beim Schreiben eines IntentService, Sie können die erstellten Code löschen
SimpleIntentService.java
package org.o7planning.simpleintentservice;

import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;

public class SimpleIntentService extends IntentService {

    public static volatile boolean shouldStop = false;

    public static final String ACTION_1 ="MY_ACTION_1";

    public static final String PARAM_PERCENT = "percent";

    public SimpleIntentService() {
        super("SimpleIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        // Create Intent object (to broadcast).
        Intent broadcastIntent = new Intent();

        // Set Action name for this Intent.
        // A Intent can perform many different actions.
        broadcastIntent.setAction(SimpleIntentService.ACTION_1);

        // Loop 100 times broadcast of Intent.
        for (int i = 0; i <= 100; i++) {

            // Set data
            // (Percent of work)
            broadcastIntent.putExtra(PARAM_PERCENT, i);

            // Send broadcast
            sendBroadcast(broadcastIntent);

            // Sleep 100 Milliseconds.
            SystemClock.sleep(100);

            if(shouldStop) {
                stopSelf();
                return;
            }
        }

    }
}
MainActivity.java
package org.o7planning.simpleintentservice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Button buttonStart;
    private Button buttonStop;
    private TextView textViewPercent;

    private ProgressBar progressBar;

    private Intent serviceIntent;

    private ResponseReceiver receiver = new ResponseReceiver();


    // Broadcast component
    public class ResponseReceiver extends BroadcastReceiver {

        // On broadcast received
        @Override
        public void onReceive(Context context, Intent intent) {

            // Check action name.
            if(intent.getAction().equals(SimpleIntentService.ACTION_1)) {
                int value = intent.getIntExtra(SimpleIntentService.PARAM_PERCENT, 0);

                new ShowProgressBarTask().execute(value);
            }
        }
    }

    // Display value for the ProgressBar.
    class ShowProgressBarTask extends AsyncTask<Integer, Integer, Integer> {

        @Override
        protected Integer doInBackground(Integer... args) {

            return args[0];
        }

        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);

            progressBar.setProgress(result);

            textViewPercent.setText(result + " % Loaded");

            if (result == 100) {
                textViewPercent.setText("Completed");
                buttonStart.setEnabled(true);
            }

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.textViewPercent = (TextView) this.findViewById(R.id.textView_percent);
        this.progressBar = (ProgressBar) this.findViewById(R.id.progressBar);
        this.buttonStart = (Button) this.findViewById(R.id.button_start);
        this.buttonStop = (Button)this.findViewById(R.id.button_stop);

        this.buttonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonStartClicked();
            }
        });

        this.buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonStopClicked();
            }
        });
    }


    // On Resume of MainActivity
    @Override
    protected void onResume() {
        super.onResume();

        // Register receiver with Activity.
        registerReceiver(receiver, new IntentFilter(
                SimpleIntentService.ACTION_1));
    }

    // On Stop of MainActivity
    @Override
    protected void onStop() {
        super.onStop();

        // Unregister receiver with Activity.
        unregisterReceiver(receiver);
    }

    // Method is called when the user clicks on the Start button.
    public void buttonStartClicked( )  {
        this.buttonStart.setEnabled(false);

        this.serviceIntent = new Intent(this, SimpleIntentService.class);

        startService(this.serviceIntent);
    }


    public void buttonStopClicked( )  {
        if(this.serviceIntent!= null)  {
            // stopService(this.serviceIntent) does not work with IntentService(s).

            // Mandatory stopping of an IntentService is not recommended.
            SimpleIntentService.shouldStop = true;
        }
    }

}
Die Anwendung ausführen:
Und Sie können den Funktionierungsgrundsatz des oben Beispiel nach dem folgenden Foto sehen

Anleitungen Android

Show More