2011-10-21 20 views
0

まず、私はアンドロイドの初心者です。だから、これはおそらく愚かな問題かもしれません。しかし、私はすでに解決に挑戦するのに数日を費やしました。アクティビティの再開後にBroadcastReceiverが呼び出されない

私はローカリゼーションのためにWi-Fiモジュールを構築しようとしていますので、Wi-Fiスキャンとローカリゼーションを処理するためにBroadcastReceiverを作成しました。アプリケーションは動作し、画面の向きを変更したときと、Desire HDで戻るボタンを押してからアプリケーションを再び開いたときの両方で、(この段階では非常に簡単な)ジョブを実行します。しかし、HOMEキーを押してメイン画面に行き、私のアプリをもう一度入力すると、放送受信機はもう動作しないように見えます。アプリケーションを閉じると、エラーメッセージが表示されます。

部分的にhereから適合したコードです。

public class WiFiDemo extends Activity implements OnClickListener { 

private static final String TAG = "WiFiDemo"; 
WifiManager wifi; 
BroadcastReceiver receiver; 
WifiManager.WifiLock lock; 
boolean wifiPrevState; 
boolean scanON = false; 
String header; 


TextView textStatus; 
Button buttonScan; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    // Setup UI 
    textStatus = (TextView) findViewById(R.id.textStatus); 
    buttonScan = (Button) findViewById(R.id.buttonScan); 
    buttonScan.setOnClickListener(this); 

    // Setup WiFi 
    if (wifi == null){ 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    } 


    //checking WiFi status, enabling it if needed and locking it. 
    wifiPrevState = wifi.isWifiEnabled(); 
    wifi.setWifiEnabled(true); 
    if (lock == null){ 
     lock = wifi.createWifiLock("lock"); 
    } 

    lock.acquire(); 

    // Get WiFi status 
    WifiInfo info = wifi.getConnectionInfo(); 
    header="\n\nWiFi Status: \n" + info.toString() + "\n\nAvailable nets:"; 
    textStatus.append(header); 

    // Register Broadcast Receiver 
    if (receiver == null) 
     receiver = new WiFiScanReceiver(this); 

    registerReceiver(receiver, new IntentFilter(
      WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    Log.d(TAG, "onCreate()"); 

} 

/* 
@Override 
protected void onPause(){ 
    super.onPause(); 
    wifi.setWifiEnabled(wifiPrevState); 
    lock.release(); 
    unregisterReceiver(receiver); 
    Log.d(TAG, "onPause()"); 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    wifi.setWifiEnabled(true); 
    lock.acquire(); 
    registerReceiver(receiver, new IntentFilter(
      WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    Log.d(TAG, "onResume()"); 

} 
*/ 

@Override 
public void onStop() { 
    super.onStop(); 
    wifi.setWifiEnabled(wifiPrevState); 
    lock.release(); 
    unregisterReceiver(receiver); 

} 

public void onClick(View view) { 
    Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
      Toast.LENGTH_LONG).show(); 

    if (view.getId() == R.id.buttonScan) { 
     Log.d(TAG, "onClick() wifi.startScan()"); 
     scanON = !scanON; 
     wifi.startScan(); 
    } 
} 

} 

そして、これはあなたのonResume()メソッドがコメントアウトされてBroadcastReceiver

public class WiFiScanReceiver extends BroadcastReceiver { 
    private static final String TAG = "WiFiScanReceiver"; 
    WiFiDemo wifiDemo; 
    ScanResult storedBest; 

    public WiFiScanReceiver(WiFiDemo wifiDemo) { 
    super(); 
    this.wifiDemo = wifiDemo; 
    storedBest = null; 
    } 

@Override 
public void onReceive(Context c, Intent intent) { 
    List<ScanResult> results = wifiDemo.wifi.getScanResults(); 
    ScanResult bestSignal = null; 
    wifiDemo.textStatus.setText(wifiDemo.header); 

    for (ScanResult result : results) { 
     if (bestSignal == null 
     || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
     bestSignal = result; 
     wifiDemo.textStatus.append("\n\n" + result.toString()); 
    } 

     if (storedBest == null || ((bestSignal.SSID.compareTo(storedBest.SSID)!=0) && bestSignal.level>-50)){ 
     storedBest = bestSignal; 
     String locationMessage = String.format("You are near %s's Access Point", 
       bestSignal.SSID); 
     Toast.makeText(wifiDemo, locationMessage, Toast.LENGTH_LONG).show(); 
     } 
     String message = String.format("%s networks found. %s is the strongest. Its level is %s", 
     results.size(), bestSignal.SSID, bestSignal.level); 
     if (wifiDemo.scanON) wifiDemo.wifi.startScan(); 
     Log.d(TAG, "onReceive() message: " + message); 
    } 

} 
+0

マニフェストも投稿できますか? –

答えて

1

投稿する際には、あなたが抱いている問題を知るために、あなたが得ているエラーメッセージを投稿することをお勧めします。

これはおそらく動作していない理由は、onStopで受信者の登録を解除し、受信者をonCreateに登録するだけだからです。通常、これらのタイプのコールは、一致するライフサイクルステージで実行する必要があります。

  • のonCreate/onDestroy
  • ONSTART/onStop
  • onResume/onPause。

問題を解決するには、受信者をonCreateではなくonStartに登録してみてください。

+0

一時停止したアクティビティへのブロードキャストを避けるためには、onResume()で登録し、onPause()で登録を解除する方が良いでしょう(とにかく一時停止中に放送を処理できません)。 – tad

+0

これで動作します。ありがとうございます。 – lucretiusT

0

です...

あなたはそれが正しいIntentFilterのですか?

関連する問題