2017-05-24 5 views
0

Androidでサービスをデバッグしようとしています。 私はすでにこの方法で行Debug.waitForDebugger();を入れている:私は私のデバイス上で自分のアプリケーションをデバッグしてい 私はライン2(Utilities.displayAlertDialog("on handle intent", this);にブレークポイントを置いてきましたが、このブレークポイントに到達しませんサービスのデバッグAndroid

@Override 
protected void onHandleIntent(Intent intent) 
{ 
    Debug.waitForDebugger(); 
    Utilities.displayAlertDialog("on handle intent", this); 

    SharedPreferences sp = getSharedPreferences(getString(clyky.cartracker.R.string.sharedPreferencesName), Context.MODE_PRIVATE); 
    int userID = sp.getInt("id_user", SplashActivity.DEFAULT_USER_ID); 

    if (userID != SplashActivity.DEFAULT_USER_ID) 
    { 
     sendRequest(userID); 
    } 
    else 
    { 
     stopSelf(); 
    } 
} 

をして。私は、Android Studioを使用しています。これは、私の全体のサービスクラスは、それがデータベースからいくつかの情報を取得し、ArrayListに全て入れている

EDIT:。。

public class RetrieveVehicleListService extends IntentService 
{ 
    private static final int NOTIFICATION_ID = 1; 
    private NotificationManager mNotificationManager; 
    private NotificationCompat.Builder builder; 
    private ArrayList<Vehicle> vehicles; 

    private void parseVehiclesFromMap(ArrayList vehicles) 
    { 
     for (int i = 0; i < vehicles.size(); i++) 
     { 
      final Vehicle v = new Vehicle(); 
      HashMap vehicleMap = (HashMap) vehicles.get(i); 

      v.setPlate(vehicleMap.get("plate").toString()); 
      v.setKm(vehicleMap.get("km") == null ? null : Integer.parseInt(vehicleMap.get("km").toString())); 
      v.setFuelQuantity(Double.parseDouble(vehicleMap.get("fuel_quantity").toString())); 
      v.setEffectiveFuelEconomy(Double.parseDouble(vehicleMap.get("fuel_economy").toString())); 
      v.setInsuranceDate(vehicleMap.get("insurance_date") == null ? null : new LocalDate(vehicleMap.get("insurance_date").toString())); 
      v.setMatriculationDate(new LocalDate(vehicleMap.get("matriculation_date").toString())); 
      v.setLatitude(vehicleMap.get("latitude") == null ? null : Double.parseDouble(vehicleMap.get("latitude").toString())); 
      v.setLongitude(vehicleMap.get("longitude") == null ? null : Double.parseDouble(vehicleMap.get("longitude").toString())); 
      v.setFuelType(FuelType.fromInt(Integer.parseInt(vehicleMap.get("id_fuel").toString()))); 

      this.vehicles.add(v); 
     } 
    } 

    private void sendRequest(int userID) 
    { 
     Response.Listener<String> listener = new Response.Listener<String>() 
     { 
      @Override 
      public void onResponse(String response) 
      { 
       try 
       { 
        HashMap json = new ObjectMapper().readValue(response, HashMap.class); 
        String errorCode = json.get("error_code").toString(); 

        switch (errorCode) 
        { 
         case "0": 
          parseVehiclesFromMap((ArrayList) json.get("vehicles")); 
          break; 
         default: 
          // TODO gestire 
          break; 
        } 
       } 
       catch (IOException e) 
       { 
        // TODO gestire 
        e.printStackTrace(); 
       } 
      } 
     }; 

     VehicleListRequest request = new VehicleListRequest(String.valueOf(userID), listener, null); 
     RequestQueue queue = Volley.newRequestQueue(this); 
     queue.add(request); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     Debug.waitForDebugger(); 
     Utilities.displayAlertDialog("on handle intent", this); 

     SharedPreferences sp = getSharedPreferences(getString(clyky.cartracker.R.string.sharedPreferencesName), Context.MODE_PRIVATE); 
     int userID = sp.getInt("id_user", SplashActivity.DEFAULT_USER_ID); 

     if (userID != SplashActivity.DEFAULT_USER_ID) 
     { 
      sendRequest(userID); 
     } 
     else 
     { 
      stopSelf(); 
     } 
    } 

    public RetrieveVehicleListService() 
    { 
     super("RetrieveVehicleList"); 
     vehicles = new ArrayList<>(); 
    } 
} 

これは、インターネット接続が利用可能になったとき、私のRetrieveVehiclesListServiceを実行し、私のBroadcastReceiver、次のとおりです。

public class NetworkWatcher extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo info = cm.getActiveNetworkInfo(); 
     Intent retrieveVehicleList = new Intent(context, RetrieveVehicleListService.class); 

     if (info != null) 
     { 
      if (info.isConnected()) 
      { 
       if (!Utilities.vehicleFileExists(context)) 
       { 
        context.startService(retrieveVehicleList); 
       } 
      } 
      else 
      { 
       context.stopService(retrieveVehicleList); 
      } 
     } 
    } 
} 

これが私のマニフェストです:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="clyky.cartracker"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

    <!-- 
     TODO crediti per le icone: 
     <div>Icons made by <a href="http://www.flaticon.com/authors/dave-gandy" title="Dave Gandy">Dave Gandy</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> 
     per la freccia in giù che espande il layout nella LoginActivity 
     <div>Icons made by <a href="http://www.flaticon.com/authors/dave-gandy" title="Dave Gandy">Dave Gandy</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> 
     per la freccia in su 
     <div>Icons made by <a href="http://www.flaticon.com/authors/madebyoliver" title="Madebyoliver">Madebyoliver</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> 
     per il lucchetto 
     <a href="https://icons8.com/icon/17577/Car-Rental">Car rental icon credits</a> 
     per l'icona della macchina 
    --> 
    <application 
     android:name=".AppGlobal" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_app_icon" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".activities.RegistrationActivity"> 
     </activity> 
     <activity android:name=".activities.LoginActivity"> 
     </activity> 
     <activity android:name=".activities.VehicleListActivity"> 
     </activity> 
     <activity android:name=".activities.VehicleDetailsActivity"> 
     </activity> 
     <activity android:name=".activities.AddVehicleActivity"> 
     </activity> 
     <!-- 
      The API key for Google Maps-based APIs is defined as a string resource 
      Note that the API key is linked to the encryption key used to sign the APK. 
      You need a different API key for each encryption key, including the release key that is used to 
      sign the APK for publishing. 
      You can define the keys for the debug and release targets in src/debug/ and src/release/. 
     --> 
     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="@string/google_maps_key"/> 

     <activity 
      android:name=".activities.SplashActivity" 
      android:theme="@style/SplashTheme"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity android:name=".activities.MainActivity"> 
     </activity> 
     <activity android:name=".activities.DrivingLicenseActivity"> 
     </activity> 
     <receiver 
      android:name=".services.NetworkWatcher" 
      android:enabled="true" 
      android:exported="false"> 
     </receiver> 
     <service 
      android:name=".services.RetrieveVehicleListService" 
      android:exported="false"> 
     </service> 
    </application> 
</manifest> 
+0

これは、決してメソッドが呼び出されないことを意味します。おそらくあなたはすべてのサービスクラスコードをあなたの答えに加え、それをどのように使用しているのでしょうか – MatPag

+0

マニフェストでこの 'Service'を宣言するのを忘れないでください –

+0

あなたのイベントに関連付けられた意図は決して解雇されないかもしれません。また、いくつかのログメッセージを入れて何が起こるかを見ることができます –

答えて

1

接続変更アクション:

  1. あなたが変更ネットワーク接続の使用を検出したい場合:あなたはWiFiの状態変更の使用を検出したい場合は

    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. :あなたは以下の通り受け取る

    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

変更:

<receiver android:name=".services.NetworkWatcher"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
</receiver> 
+1

ありがとう、それは動作しますが、私はAndroid Nでも動作するように私のコードを変更すると思います:) – Clyky

1
ヌガー(アンドロイド7 API 24)で始まるのであなたは完全に new limitations to background services

のあなたのことができるように可能性があるため、あなたが述べたhereとして受信機に接続変更イベントを受け取ることができませんあなたのAndroidManifest.xmlから<receiver>タグを削除する必要がありますアプリが実行されている最中にメインのUIスレッドでCONNECTIVITY_ACTIONだけを聞いて、プログラムで登録されたBroadCastReceiverでフォアグラウンドでこれを聞くと、これはあなたのユースケースに基づいて良いか悪い解決策になる可能性があります。https://stackoverflow.com/a/39880860/2910520および1または提供ソリューションの組み合わせのいずれかを選択:

  1. JobScheduler(以降API 21)
  2. GcmNetworkManager(これは、ユーザーを動作させるために、私はあなたが、それはこの答えを読むためだお勧めは何

    Evernoteのは、すでにデために利用可能な最善の実装に切り替えるライブラリをリリースしました

)Googleがインストールされているサービスを再生する必要があります私が最初からすべてを行うことなくこれを使用することをお勧めします: https://github.com/evernote/android-job

+0

ありがとう、私はこのライブラリを試してみます – Clyky

関連する問題