Usługi powiązane i uprawnienia
781
jesteś tutaj
Kompletny kod aktywności MainActivity
Oto kompletny kod aktywności
MainActivity
:
package com.hfad.drogomierz;
import android.app.Activity;
import android.os.Bundle;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.widget.TextView;
import java.util.Locale;
public class MainActivity extends Activity {
private OdometerService odometer;
private boolean bound = false;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder binder) {
OdometerService.OdometerBinder odometerBinder =
(OdometerService.OdometerBinder) binder;
odometer = odometerBinder.getOdometer();
bound = true;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
bound = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayDistance();
}
Podczas tworzenia aktywności wywołujemy metodę displayDistance().
Po powiązaniu usługi
OdometerService pobieramy
referencję do niej.
Ta zmienna służy do przechowywania
referencji do usługi OdometerService.
Ta zmienna przechowuje informację, czy
aktywność została powiązana z usługą, czy nie.
Musimy zdefiniować
obiekt ServiceConnection.
app/src/main
Main
Activity.java
Drogomierz
java
com.hfad.drogomierz
Dalsza część kodu
znajduje się na
następnej stronie.
Używamy tych dodatkowych
klas, więc musimy je
zaimportować.
¨
OdometerService
¨
MainActivity
¨
Usługi lokalizacyjne
782
Rozdział 19.
Ciąg dalszy kodu
Kod aktywności MainActivity (ciąg dalszy)
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, OdometerService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (bound) {
unbindService(connection);
bound = false;
}
}
private void watchMileage() {
final TextView distanceView = (TextView)findViewById(R.id.distance);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
double distance = 0.0;
if (bound && odometer != null) {
distance = odometer.getDistance();
}
String distanceStr = String.format(Locale.getDefault()”%1$,.2f kilometra”, distance);
distanceView.setText(distanceStr);
handler.postDelayed(this, 1000);
}
});
}
}
Jeśli dysponujemy referencją do usługi
OdometerService, to wywołujemy jej
metodę getDistance().
Kiedy aktywność zostaje uruchomiona,
próbujemy ją powiązać z usługą.
Powiązanie przerywamy w momencie
zatrzymywania aktywności.
Ta metoda aktualizuje wyświetlany dystans,
jaki pokonało urządzenie.
Informacje o pokonanym dystansie
aktualizujemy co sekundę.
app/src/main
Main
Activity.java
Drogomierz
java
com.hfad.drogomierz
To już cały kod niezbędny do wykorzystania usługi
OdometerService
w aktywności
MainActivity
. A teraz przekonajmy się, co się stanie
po uruchomieniu aplikacji.
¨
OdometerService
¨
MainActivity
¨
Usługi lokalizacyjne
Usługi powiązane i uprawnienia
783
jesteś tutaj
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, OdometerService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (bound) {
unbindService(connection);
bound = false;
}
}
private void watchMileage() {
final TextView distanceView = (TextView)findViewById(R.id.distance);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
double distance = 0.0;
if (bound && odometer != null) {
distance = odometer.getDistance();
}
String distanceStr = String.format(Locale.getDefault()”%1$,.2f kilometra”, distance);
distanceView.setText(distanceStr);
handler.postDelayed(this, 1000);
}
});
}
}
Co się dzieje po uruchomieniu kodu?
Zanim przygotujemy i uruchomimy aplikację, przeanalizujmy jej działanie:
W momencie tworzenia aktywności MainActivity tworzony jest obiekt
ServiceConnection i wywoływana jest metoda displayDistance().
MainActivity
ServiceConnection
W metodzie onStart() aktywności MainActivity zostaje wywołana metoda
bindService().
Metoda
bindService()
zawiera intencję skierowaną do usługi
OdometerService
oraz referencję do obiektu
ServiceConnection
.
displayDistance()
MainActivity
Intencja
Odometer
Service
bindService()
Android tworzy instancję usługi OdometerService i przekazuje do niej intencję,
wywołując w tym celu metodę onBind() usługi.
Android
Intencja
Odometer
Service
OdometerService
onBind()
ServiceConnection
¨
OdometerService
¨
MainActivity
¨
Usługi lokalizacyjne
1
2
3
784
Rozdział 19.
Co się dzieje, ciąg dalszy
Obiekt ServiceConnection używa obiektu Binder do przekazania aktywności
MainActivity referencji do usługi OdometerService.
OdometerService
Metoda displayDistance() aktywności MainActivity zaczyna wywoływać
co sekundę metodę getDistance() usługi OdometerService.
Usługa
OdometerService
przekazuje do aktywności
MainActivity
liczbę losową;
w tym przypadku jest to liczba 0.56.
MainActivity
getDistance()
0.56
OdometerService
Wywołanie metody onBind() usługi OdometerService zwraca obiekt Binder.
Obiekt
Binder
zostaje przekazany do obiektu
ServiceConnection
aktywności
MainActivity
.
MainActivity
ServiceConnection
OdometerService
onBind()
Binder
MainActivity
ServiceConnection
Opowieści ciąg dalszy
4
5
6
¨
OdometerService
¨
MainActivity
¨
Usługi lokalizacyjne
Usługi powiązane i uprawnienia
785
jesteś tutaj
Kiedy aktywność MainActivity zostaje zatrzymana, odłącza także usługę
OdometerService, wywołując w tym celu metodę unbindService().
MainActivity
OdometerService
Teraz, kiedy już rozumiesz, co się dzieje podczas działania
kodu aplikacji, nadszedł czas, by wziąć ją na jazdę próbną.
OdometerService
Gdy aktywność nie będzie już powiązana z usługą, usługa ta zostanie
usunięta.
unbindService()
MainActivity
Nie jestem
już widoczna, więc
nie muszę już korzystać
z twoich usług.
Jasne. Wywołaj mnie,
jeśli zmienisz zdanie.
7
8
Opowieści ciąg dalszy
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.