Android意图服务中的位置侦听器
我的应用程序有一个Intent服务,它每隔10万毫秒在web服务器上检查html页面上是否有“开始”或“停止”字 如果收到“开始”,则启动Android意图服务中的位置侦听器,android,location,locationmanager,locationlistener,Android,Location,Locationmanager,Locationlistener,我的应用程序有一个Intent服务,它每隔10万毫秒在web服务器上检查html页面上是否有“开始”或“停止”字 如果收到“开始”,则启动locationmanager.requestUpdateLocation(..),如果收到“停止”,则使用locationmanager.removeUpdates(..)停止 但我有一个问题: 当我调用locationmanager.requestUpdateLocation(..)时,我从未输入我的侦听器的onLocationChanged(这在相同的服
locationmanager.requestUpdateLocation(..)
,如果收到“停止”,则使用locationmanager.removeUpdates(..)
停止
但我有一个问题:
当我调用locationmanager.requestUpdateLocation(..)
时,我从未输入我的侦听器的onLocationChanged
(这在相同的服务范围内实现)
然后,我观察到我的意图服务并不是永远存在的:(我放置了一个接收器,捕捉Android启动的时刻(以及这项工作)和一个策略,当我的意图服务被用户关闭时,它自己重新启动:p
但它永远不会永远存在,几小时后(或许只有30分钟)它就会死去:(
为什么?
代码如下:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.i("Service", "Started");
LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
//IT NEVER ENTER HERE
Log.i("LOC", "LAT: " + location.getLatitude() +" LONG: "+location.getLongitude());
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
//NEVER ENTER ALSO HERE
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
};
int localizzazioneAttiva=0;
int delay = 0;
while (true) {
Log.i("SERVICE_CheckSito", "Check Sito STARTED");
String inputLine = "";
StringBuffer stringBuffer = new StringBuffer();
//Check Permission and SKD_INT
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED)
{
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
URL url;
try
{
url = new URL("http://www.sito.com/file.html");
HttpURLConnection httpURLConnection;
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.connect();
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
try {
while ((inputLine = bufferedReader.readLine()) != null) {
stringBuffer.append(inputLine).append("\n");
}
} finally {
bufferedReader.close();
}
}
} catch (IOException e) {
// e.printStackTrace();
}
} else return;
}
if (stringBuffer.toString().equals("start\n") && 0==localizzazioneAttiva )
{
localizzazioneAttiva=1;
delay = 1000;
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000, 0, locationListener);
}
if(stringBuffer.toString().equals("stop\n")) {
delay = 2000;
locationManager.removeUpdates(locationListener);
localizzazioneAttiva=0;
}
Log.i("SERVICE_CheckSito", "Message from server: " + stringBuffer.toString());
Log.i("SERVICE_CheckSito", "Check Sito FINISHED");
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@覆盖
受保护的无效onHandleIntent(@Nullable Intent){
Log.i(“服务”、“启动”);
LocationManager LocationManager=(LocationManager)this.getSystemService(LOCATION\u服务);
LocationListener LocationListener=新LocationListener(){
已更改位置上的公共无效(位置){
//它永远不会进入这里
Log.i(“LOC”,“LAT:”+location.getLatitude()+“LONG:”+location.getLatitude());
}
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
}
公共无效onProviderEnabled(字符串提供程序){
}
公共无效onProviderDisabled(字符串提供程序){
//也不要进入这里
意向意向=新意向(设置、动作、位置、来源、设置);
星触觉(意向);
}
};
int-localizationeattiva=0;
int延迟=0;
while(true){
Log.i(“服务检查现场”,“检查现场已启动”);
字符串inputLine=“”;
StringBuffer StringBuffer=新的StringBuffer();
//检查权限和SKD_INT
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.INTERNET)==PackageManager.permission\u已授予)
{
如果(Build.VERSION.SDK_INT我不应该在3杯啤酒后回答。我的错,没有看到你添加/n
考虑使用普通服务和FusedLocationProvider。Mmm我使用Intent服务是因为我需要在某个时候使用“Thread.sleep(100000)”。你认为如果我使用普通服务,我会解决问题吗?我已经尝试使用真正的设备了;)如果您在使用android studio时遇到AVD问题,请转到工具、android、android设备监视器。选择您的虚拟设备(仅当没有处于调试模式的应用程序时),然后您可以设置lat和long!;)在设备管理器中设置lat/long从未为我触发onlocationchanged。我现在在酒吧,稍后检查您的代码。无论如何,我祝您好运,我自己在使用LocationManager模拟器打开扩展控件并更改您的位置时遇到了一些非常恼人的问题。这是因为onlocationchanged方法被称为Added。是吗不呼叫onlocchange。也许这是我的一个bug。如何使用警报?