在onClick上启动服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在onClick上启动服务相关的知识,希望对你有一定的参考价值。

我想在用户点击按钮时启动服务。

基本上,当用户点击开始按钮时,服务应该开始记录GPS坐标,当他点击停止时,服务应该终止。

我应该怎么做呢?

答案

我不太清楚为什么要启动服务以启动/停止录制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以调用您想要的服务。

另一答案

我决定将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中显示位置。这是更充分版本的link

以上是关于在onClick上启动服务的主要内容,如果未能解决你的问题,请参考以下文章

在onClick上启动服务

从片段返回到上一个活动 onclick back button

listview onclick toast在片段中不起作用[重复]

OnClick 在片段的回收器适配器中无法正常工作

图像上的OnClick()会添加具有不同信息的相同片段

Android Fragment onClick 按钮打开具有相同活动的新 Fragment