5

私はprobを1回、皆さんは本当に役に立ちました。だから私は再び私が落ちた別の問題を抱えています:/getBoolean(EXTRA_NO_CONNECTIVITY)は常にfalseを返します

私はBroadcastReceiverを拡張するカスタムNetworkReceiverを実行しています。電話がインターネットに接続されていることを検出して、いつでもサービスを開始できるようにしたい。私は、トピックをたくさん読んで、すべてのトピック多かれ少なかれ私のために動作しません、次のコードにプロンプ​​トしている:

public class NetworkReceiver extends BroadcastReceiver { 

private static final String tag = NetworkReceiver.class.getSimpleName(); 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(tag,"****** NetworkReceiver // onReceive()"); 

    boolean noConnection = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
     Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)); 
    } 

    // TODO Bug: Never stops the service. Stays always connected! 
    if(noConnection) { 
     Log.i(tag,"****** NetworkReceiver // Stopping Service..."); 
     context.stopService(new Intent(context, FetchService.class)); 
    } else { 
     Log.i(tag,"****** NetworkReceiver // Starting Service!"); 
     context.startService(new Intent(context, FetchService.class)); 
    } 
} 

私が持っている問題はlogcatは常にNetworkDown?: falseを返し、サービスが停止したことがないということである(それは常に再開します)。私はF8を押してエミュレータで試してみました。また、私のdev-phone(SIMはありません、インターネットアクセスは私のWiFiルーターである)で試しました。 intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) へ:

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

<receiver android:name=".NetworkReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 
... 

私も、私はラインを変更したときに、私はまた、変更なしとし、というのが私のマニフェストファイルに <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />をしようとしたことに注意してください:

私のマニフェストには、以下の行を含んでいますその結果は常に真実でした。そして、それはいつも私のサービスを止めようと試み、決してそれを開始しませんでした。

私はインテントのエクストラが全く読まれないと思うので、デフォルト値のgetBooleanExtra()は常に返されます。

PS。私はAndroid 2.1にいる

ありがとう!

答えて

3

私はBroadcastReceiverの中で読むことができないエクストラについてはわかりませんが、あなたのような目的でBroadcastReceiverを使用しています。

受信者は接続の変更だけをキャッチしますが、接続の状態は評価しません。両方の場合(接続されているかどうかにかかわらず)に、このサービスには何かがあるように、代わりにServiceが通知されます。それが起動または「通知」のどちらかになりますので、このサービスは(you can safely call startService() several timesは、これらの呼び出しは入れ子にしていないことを覚えておいてください)、その時点で実行しているかをすることができます。

public class ConnectivityReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Intent intentService = new Intent(context, MyService.class); 
     intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, ""); 

     context.startService(intentService); 
    } 
} 

その後、私のサービスでは、私は評価しませんそれに応じて行動する。あなたがそうであるように、私は接続状態を同じように評価しないことに注意してください、そして作品次のコードではなく、あなたは(以下のみ関連するコードです)なぜこれは次のようになります。

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final Bundle bundle = intent.getExtras(); 

     // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any 
     if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {   
      handleConnectivity(); 
     } 
    } 

    return START_STICKY; 
} 

private void handleConnectivity() { 
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if(netInfo != null && netInfo.isConnected()) { 
     // WE ARE CONNECTED: DO SOMETHING 
    } 
    else { 
     // WE ARE NOT: DO SOMETHING ELSE  
    } 
} 

これは下、正常に動作しますが、 Android-7(2.1)も同様です。

+0

私はあなたが使用した方法に気付いています。しかし、私は少し多くの人々が私が使用したコードを推奨して驚いた(私はまた、最近Androidで購入したO'reillyの本でそれを読んだ!)私がCONNECTIVITY_ACTIONブロードキャストで解決策を見つけることができない場合は、私はあなたの例に従い、ConnectivityManagerのメソッドで私のサービスのチェックを行うと思います。返信ありがとう:) – snoopaki

+0

あなたは@ snoopakiを歓迎しています - 私はあなたの方法を使って解決策を取ってくることを望んでいましたが、何が起きているのか、なぜ起こっているのか分かりません。 – Shlublu

+1

私は実際に私のサービスをIntentServiceに変更し、接続変更のインサービス処理はより意味がありました。だから私は適切に正しい答えを選ぶべきです! thx :) – snoopaki

2

は奇妙なNO_CONNECTIVITYフラグを知ってはいけない、しかし、あなたは意図からアクティブなネットワークを検索することができます:あなたはおそらくちょうどこのオブジェクト上をisConnected()を呼び出すことができます

(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

+1

返事のための高尚な、私はそれを念頭に置くでしょう。現在のタスクでは、私は上記の答えを使用し、それは非常にうまく動作します:) – snoopaki

+1

この定数は現在廃止されています。 –

関連する問題