Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android意图服务中的位置侦听器_Android_Location_Locationmanager_Locationlistener - Fatal编程技术网

Android意图服务中的位置侦听器

Android意图服务中的位置侦听器,android,location,locationmanager,locationlistener,Android,Location,Locationmanager,Locationlistener,我的应用程序有一个Intent服务,它每隔10万毫秒在web服务器上检查html页面上是否有“开始”或“停止”字 如果收到“开始”,则启动locationmanager.requestUpdateLocation(..),如果收到“停止”,则使用locationmanager.removeUpdates(..)停止 但我有一个问题: 当我调用locationmanager.requestUpdateLocation(..)时,我从未输入我的侦听器的onLocationChanged(这在相同的服

我的应用程序有一个Intent服务,它每隔10万毫秒在web服务器上检查html页面上是否有“开始”或“停止”字

如果收到“开始”,则启动
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。如何使用警报?