2017-12-18 11 views
1

私は解決策を見つけるのに多くの時間を捜したが、うまくいかなかった。 これを何度も苦労しています。この問題に直面して解決したら、私を助けてください。wifiまたはgpsのオン/オフ時に私のBroadcastReceiverが2回呼び出されますか?

私はWi-FiまたはGPSをオンまたはオフにするとReceiverが2回トリガーします 時々ですが、2回トリガするとアプリの計画が破損することがあります。予め

THX ...のmanifest.xml内部

<receiver android:name=".MyBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 

      <category android:name="android.intent.category.DEFAULT" /> 

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

      <action android:name="android.location.PROVIDERS_CHANGED"/> 
     </intent-filter> 
    </receiver> 

このBroadcastReceiverクラス:

public class MyBroadcastReceiver extends BroadcastReceiver { 
String TAG_NETW = "NetworkConnctivityUtils"; 


@Override 
public void onReceive(Context context, Intent intentR) { 
    try { 
     // MyApplication.dbApp = new SqliteHelper(context, ConstHelper.DATABASE_PATH, ConstHelper.DATABASE_NAME); 
     SimpleDateFormat sdf = new SimpleDateFormat(ConstHelper.Simple_Date_Format); 
     if (intentR.getAction().matches("android.location.PROVIDERS_CHANGED")) { 
      LocationManager locationManager = (LocationManager) context.getSystemService(context.LOCATION_SERVICE); 

       if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
        Log.d(TAG_NETW, "locationGps" + " ------ event On " + intentR.getAction()); 

        StatusDriverQueryHelper.insertStatusDriverlog(EnumDeviceStatus.GPSOn, "0", AuthenticateHelper.getDeviceId(context, ""), UnicodeHelper.numberToEnglish(sdf.format(new Date()))); 
        StatusDriverQueryHelper.showItems(); 

       } else if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
        // todo : if at this time of other provider change the gps was of/or no what will be the status 
        Log.d(TAG_NETW, "locationGps" + " ------ event Off " + intentR.getAction()); 

        StatusDriverQueryHelper.insertStatusDriverlog(EnumDeviceStatus.GPSOff, "0", AuthenticateHelper.getDeviceId(context, ""), UnicodeHelper.numberToEnglish(sdf.format(new Date()))); 
        StatusDriverQueryHelper.showItems(); 

       } 
       LogService.sendAllStatus(); 
      } else { 

      } 
    } catch (Exception e) { 
     Log.d(TAG_NETW, "locationGps" + " error On GPS EVENT Reciver " + intentR.getAction()); 
    } 

    /***************************/ 

    try { 

     if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentR.getAction())) { 
      int status = NetworkConnctivityUtils.getConnectivityStatusString(context); 
      Log.e(TAG_NETW, " here : " + intentR.getAction() + " , STATUS : " + String.valueOf(status)); 
      // Wifi is connected 
      if (status == NetworkConnctivityUtils.NETWORK_STATUS_NOT_CONNECTED) { 
       Log.d(TAG_NETW, "CONNECTIVITY" + " Not-----Available"); 
      } else if (status == NetworkConnctivityUtils.NETWORK_STAUS_WIFI) { 
       Log.d(TAG_NETW, "CONNECTIVITY" + " OK wifi"); 
      } else if (status == NetworkConnctivityUtils.NETWORK_STATUS_MOBILE) { 
       Log.d(TAG_NETW, "CONNECTIVITY" + " OK mobile"); 
      } else { 
       Log.d(TAG_NETW, "CONNECTIVITY" + " nonononon ---"); 
      } 


     } 
    } catch (Exception e) { 

    } 
} 

}

*****見つかりAそれを実現する方法

しかし、これを処理するにはこれが最善の方法であるかどうかわかりません:

フラグを使用して、1秒か2秒後にフラグが戻ってきたかどうかを確認するフラグを使用します。

// ...

@Override 
    public void onReceive(Context context, Intent intentR) { 
     try { 
     SimpleDateFormat sdf = new SimpleDateFormat(ConstHelper.Simple_Date_Format); 
     if (intentR.getAction().matches("android.location.PROVIDERS_CHANGED")) { 
      LocationManager locationManager = (LocationManager) context.getSystemService(context.LOCATION_SERVICE); 

      if (ConstHelper.GpsActionisDoneOnce == false) { 
       ConstHelper.GpsActionisDoneOnce = true; 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         ConstHelper.GpsActionisDoneOnce = false; 
        } 
       }, 500); 
         // GPS ACTION/CHECKING .. 
       } else { 

       } 
      } 
     } catch (Exception e) { 

     } 

// ...

+0

あなたのレシーバーは常時アクティブにする必要がありますか、またはあなたのアプリの実行中にのみ必要ですか? –

+1

私はバックグラウンドでもアクティブにする必要があります。なぜあなたはそれを@SerjArdovicに尋ねましたか? – tahaDev

+2

2回トリガーすると、2つのインテントのアクションはどのように受け取られますか?そして、 'onReceive'への2回の呼び出しの間にどれくらいの時間がありますか? – clownba0t

答えて

0

放送受信機の使用は低いため、システム性能に寄与する非推奨されます。適切な方法は、JobSchedulerを使用することです。

+1

JobSchedulerがalarmManagerなどで使用できることを理解しているので、JobSchedulerがここの答えではないと私は思っていますが、BroadCastレシーバでは使用できません。 – tahaDev

関連する問題