我已经实现了一个在启动时启动的android服务:
MyService.java
package com.example.testservicelogging;
import com.example.testservicelogging.MyBroadcastReceiver;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service implements LocationListener {
LocationManager lm;
PendingIntent pendingIntent;
LocationListener locationListener;
public MyService() {
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
//Toast.makeText(getBaseContext(), "Got in!!!", Toast.LENGTH_SHORT).show();
System.out.println("Got in");
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Intent i = new Intent(this, MyBroadcastReceiver.class);
pendingIntent = PendingIntent.getBroadcast(
this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
//---request for location updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
6000,
5,
pendingIntent);
return START_STICKY;
}
@Override
public void onDestroy() {
//---remove the pending intent---
lm.removeUpdates(pendingIntent);
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onLocationChanged", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderDisabled", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderEnabled", Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
Toast.makeText(this, "onStatusChanged", Toast.LENGTH_LONG).show();
}
}
也是BroadcastReceiver
类:
package com.example.testservicelogging;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent t=new Intent(context, MyService.class);
t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(t);
String locationKey = LocationManager.KEY_LOCATION_CHANGED;
String providerEnabledKey = LocationManager.KEY_PROVIDER_ENABLED;
//Toast.makeText(context, "INSIDE!!!", Toast.LENGTH_SHORT).show();
System.out.println("INSIDE");
if (intent.hasExtra(providerEnabledKey)) {
if (!intent.getBooleanExtra(providerEnabledKey, true)) {
Toast.makeText(context,
"Provider disabled",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"Provider enabled",
Toast.LENGTH_SHORT).show();
}
}
if (intent.hasExtra(locationKey)) {
Location loc = (Location)intent.getExtras().get(locationKey);
Toast.makeText(context,
"Location changed : Lat: " + loc.getLatitude() +
" Lng: " + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
//do something with the coordinates returned
}
}
}
我遇到了一些问题:
非常感谢您的帮助!!!
答案 0 :(得分:1)
您正在请求位置更新,并提供应在发生位置更新时广播的PendingIntent
。但是,您的服务也implements LocationListener
,所以看起来您可能有点困惑。我不确定你到底想要做什么,但是开始我只是让你的服务直接得到回调。在这种情况下,您不需要BroadcastReceiver
,您应该更改此内容:
//---request for location updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 6000, 5, pendingIntent);
到此:
//---request for location updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 6000, 5, this);
这会导致位置服务定期回复您已在服务类(onLocationChanged()
,onProviderEnabled()
等中实施的方法。)
此外,您为minTime和minDistance提供的参数非常小。 minTime为6000秒为6秒,minDistance为5米。这将导致GPS不断耗尽电池,因此您可能需要重新考虑这些参数。
我建议您尝试并添加一些日志记录以查看会发生什么。我建议使用日志框架(即:Log.v()
和Log.e()
等)并查看logcat而不是尝试使用toast。 Toast对于调试来说非常不可靠。
此外,所有设备上的位置服务实施都不同。每个制造商都提供自己的实施方案,它们在可靠性,稳健性和操作特性方面差异很大。无法在特定时间间隔或特定时间可靠地坚持GPS更新。您所能做的就是为操作系统提供合适的提示,了解您希望拥有的内容。无论您指定的参数如何,位置框架都会随时回复您。您只需要相应地了解它并编写代码。
如果您希望每15分钟获得一次更新,您可以指定15分钟的最小时间(这将是15 * 60 * 1000的值)或者您可以每隔15分钟和警报管理器安排一次唤醒警报警报响起,您可以立即请求位置更新(虽然您可能需要一些时间才能获得它们)。
希望我已经为您提供了足够的材料,以便您可以在这里取得一些进展。如果您需要更多帮助,请随时添加评论。
答案 1 :(得分:1)
确保根据您的需要将其中一个添加到清单中:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>