2017-03-31 10 views
0

私のアプリケーションには、100000msごとにhtmlページに「開始」または「停止」という単語がある場合、ウェブサーバーをチェックし続けるインテントサービスがあります。Androidインテントサービスのロケーションリスナー

「開始」を受信した場合は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(); 
    } 
    } 
} 
+0

アラームを使用するのはどうですか? https://developer.android.com/training/scheduling/alarms.html –

答えて

0

私は3ビールの後に答えるべきではありません。私の悪い、あなたが/ nを追加しているのを見ていない。

プレーンなサービスとFusedLocationProviderの使用を検討してください。

+0

「Thread.sleep(100000)」を使用する必要があるため、インテントサービスを使用しています。 通常のサービスを使用すると問題が解決すると思いますか? 私はすでに実際のデバイスを使用しようとしています;)AVDに何らかの問題があり、アンドロイドスタジオを使用している場合は、ツール、Android、Androidデバイスモニタに行きます。あなたの仮想デバイスを選択してください(デバッグモードではアプリケーションがない場合のみ)、あなたは緯度と経度を設定できます! ;) – Andrea

+0

デバイスマネージャの緯度/経度を設定すると、私のために場所が変更されたことはありません。私はすぐにあなたのコードをチェックしています。とにかく私はあなたに金運が欲しい、私自身がlocationmanagerを使っていくつかの本当に迷惑な問題を抱えていた –

+0

Emulatorで拡張コントロールを開き、あなたの場所を変更します。これは、onLocationChangedメソッドが –

関連する問題