Запустить сервис на onClick - PullRequest
2 голосов
/ 23 марта 2011

Я хочу запустить службу, когда пользователь нажимает кнопку.

Обычно, когда пользователь нажимает кнопку запуска, служба должна начинать записывать координаты GPS, а когда он нажимает кнопку остановки, служба должна прерываться.*

Как мне это реализовать?

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Я не совсем уверен, почему вы хотите запустить службу, чтобы начать / остановить запись GPS-координат.Поэтому я дам вам два ответа.Один из них покажет вам, как запускать и останавливать службу с помощью кнопок, а другой - как запускать / останавливать запись координат GPS, которую не нужно делать со службой (хотя ее можно изменить для этого).

Запуск / остановка службы с помощью кнопок

Главное, что вам нужно сделать, это добавить android:onClick="functionToCall" к тегу кнопки xml.Замените functionToCall реальным именем функции.Затем вы должны заставить эту функцию вызвать функцию startService() или stopService(), чтобы запустить / остановить службу.Вот мой пример программы, которая запускает / останавливает службу с именем SayHello.

Вы можете игнорировать большую часть следующего xml, просто заметив android:onClick=""

main.xml:

<?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:text="Start" 
        android:id="@+id/Button01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:onClick="startClicked">
</Button>
<Button android:text="Stop" 
        android:id="@+id/Button02" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:onClick="stopClicked">
</Button>
</LinearLayout> 

ServiceClick.java (действие, которое я выполнял с кнопками):

package com.ServiceClick;

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

public class ServiceClick extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void startClicked(View view) {
        startService(new Intent("SayHello"));
    }

    public void stopClicked(View view) {
        stopService(new Intent("SayHello"));
    }

}

Я уверен, что вы не хотите запускать / останавливать службу SayHello, поэтому обязательно измените Intentпозвонить на услугу вы хотите.

1 голос
/ 24 марта 2011

Я решил поместить ответ о регистрации GPS в новое сообщение, чтобы сделать вещи чище.

Запись координат GPS

Первое, что нам нужно сделать, этодобавьте строку в наш AndroidManifest.xml, в которой говорится, что нам нужно разрешить записывать GPS-координаты:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" .... >
    ....       
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest> 

(я вставил эти ...., чтобы показать, что пропускал некоторый контент)

Затем вы должны добавить android:onClick="functionToCall" к каждому из тегов кнопки (см. Мой другой ответ для более подробной информации).Теги кнопок должны выглядеть примерно так:

<Button android:text="Start" 
        android:id="@+id/Button01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:onClick="startButton"></Button>
<Button android:text="Stop" 
        android:id="@+id/Button02" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:onClick="stopButton"></Button>

Теперь вам нужно запросить у системы LocationManager, которую мы можем дать LocationListener для использования при получении местоположения.Мы дадим LocationManager LocationListener, когда нажата кнопка запуска, и удалим этого слушателя, когда нажата кнопка остановки.Это LocationListener вызовет функцию для сохранения местоположения.

Вот код для этого:

package com.TrackLocation;

import java.util.ArrayList;
//Ommitted rest of the imports

public class TrackLocation extends Activity {
    ArrayList<Location> recordedLocations = new ArrayList<Location>();

    LocationManager locationManager;
    LocationListener locationListener; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        // Get the manager from the system
        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        // Create the locationListener that we will be adding and removing
        locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                recordLocation(location);
            }

            public void onStatusChanged(String provider, int status, Bundle extras) {}

            public void onProviderEnabled(String provider) {}

            public void onProviderDisabled(String provider) {}
          };

    }

    public void recordLocation(Location loc) {
        recordedLocations.add(loc);
    }

    public void startButton(View view) {
        //Add the listener asking for GPS
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }

    public void stopButton(View view) {
        locationManager.removeUpdates(locationListener);
    }
}

Приведенный выше код не имеет большого значения со значениями (на самом делеВы даже не можете видеть местоположения без использования отладчика), но я хотел, чтобы это было как можно меньше.У меня есть более полная версия кода, который будет отображать местоположения в ListView.Вот ссылка на эту более полную версию.

...