2011-10-21 2 views
0

우선 저는 Android의 초보자입니다. 그래서 이것은 어리석은 문제 일 수 있습니다. 그럼에도 불구하고 이미 해결책을 찾으려고 며칠을 보냈습니다.활동 재개 후에 BroadcastReceiver가 호출되지 않음

나는 현지화 자들 용 와이파이 모듈을 만들기 위해 WiFi 스캐닝과 로컬 리 제이션을 처리하기 위해 BroadcastReceiver를 작성했습니다. 응용 프로그램이 작동하고 화면의 방향을 바꿀 때와 Desire HD의 뒤로 단추를 누른 다음 응용 프로그램을 다시 열 때 문제가 발생합니다 (이 단계에서는 매우 간단합니다). 그러나 홈 키를 누르고 기본 화면으로 이동 한 다음 내 앱을 다시 입력하면 브로드 캐스트 수신기가 더 이상 작동하지 않는 것처럼 보입니다. 응용 프로그램을 닫으면 오류 메시지가 나타납니다.

코드는 부분적으로 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(); 
    } 
} 

} 

그리고 이것은 브로드 캐스트 리시버입니다

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/중지시
  • onResume/onPause.

문제를 해결하려면 onCreate 대신 onStart에 수신기를 등록 해보십시오.

+0

일시 중지 된 활동으로 브로드 캐스팅하지 않으려면 onResume()에 등록하고 onPause()에서 등록 취소하는 것이 좋습니다 (일시 중지 된 상태에서 브로드 캐스트를 처리 할 수 ​​없음). – tad

+0

이제 작동합니다. 정말 고마워요. – lucretiusT

0

귀하의 onResume() 메소드는

은 당신이 올바른로 IntentFilter 확실 해요 ... 주석?

관련 문제