2012-03-31 3 views
0

SMS 수신시 활성화되는 작은 프로그램을 작성 중입니다. 그래픽 사용자 인터페이스를 통해 서비스를 시작/중지해야합니다. 서비스를 시작하거나 중지하려면 확인란과 버튼을 사용하고 있습니다.브로드 캐스트 리시버에 등록하는 중 오류가 발생했습니다.

코드는 다음과 같습니다.

private smsBroadcast b; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

} 

public void onclick(View i) 
{ 
    CheckBox c=(CheckBox)findViewById(R.id.checkBox1); 
     b=new smsBroadcast(); 
    try{ 
    if(c.isChecked()) 
    registerReceiver(b, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 
    else 
    unregisterReceiver(b); 
    } 
    catch(Exception e) 
    { 

    } 
    finish(); 
} 

여기서 smsBroadcast는 broadcastReceiver 클래스입니다.
버튼을 클릭하면 logcat에 몇 가지 예외가 표시됩니다. 다음으로 예외는 onResume에 수신기를 등록하고

onPause

http://developer.android.com/reference/android/content/BroadcastReceiver.html에서 등록을 취소 할 필요가

  03-31 12:01:33.923: E/ActivityThread(806): Activity examples.sms.SmssmsActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
      03-31 12:01:33.923: E/ActivityThread(806): android.app.IntentReceiverLeaked: Activity examples.sms.SmssmsActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:756) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:551) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:795) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.ContextImpl.registerReceiver(ContextImpl.java:782) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.ContextImpl.registerReceiver(ContextImpl.java:776) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 
      03-31 12:01:33.923: E/ActivityThread(806): at examples.sms.SmssmsActivity.onclick(SmssmsActivity.java:25) 
      03-31 12:01:33.923: E/ActivityThread(806): at java.lang.reflect.Method.invokeNative(Native Method) 
      03-31 12:01:33.923: E/ActivityThread(806): at java.lang.reflect.Method.invoke(Method.java:507) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.view.View$1.onClick(View.java:2139) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.view.View.performClick(View.java:2485) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.view.View$PerformClick.run(View.java:9080) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.os.Handler.handleCallback(Handler.java:587) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.os.Handler.dispatchMessage(Handler.java:92) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.os.Looper.loop(Looper.java:123) 
      03-31 12:01:33.923: E/ActivityThread(806): at android.app.ActivityThread.main(ActivityThread.java:3683) 
      03-31 12:01:33.923: E/ActivityThread(806): at java.lang.reflect.Method.invokeNative(Native Method) 
      03-31 12:01:33.923: E/ActivityThread(806): at java.lang.reflect.Method.invoke(Method.java:507) 
      03-31 12:01:33.923: E/ActivityThread(806): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
      03-31 12:01:33.923: E/ActivityThread(806): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
      03-31 12:01:33.923: E/ActivityThread(806): at dalvik.system.NativeStart.main(Native Method) 
+0

어떻게 onclick을 사용하고 있습니까? 여러 개의 수신자를 등록하고 누수를 야기하지 않은 등록자를 등록하지 않을 수 있습니다. 당신이 사용하고있는 IMO는 완전히 잘못되었습니다. onResume에 한 번만 등록하고 rcver가 확인한 부울을 설정하려면 click을 사용해야합니다. 당신은 또한 onphause – ComputerEngineer88

답변

0

...있는 경우 Activity.onResume() 구현에 수신기를 등록, Activity.onPause()에서 등록을 취소해야합니다. 일시 중지되면 의도를 알 수 없으므로 불필요한 시스템 오버 헤드가 줄어 듭니다. Activity.onSaveInstanceState()에서 등록을 취소하지 마십시오. 사용자가 히스토리 스택에서 다시 이동하면 호출되지 않기 때문입니다.

+0

에서 unreg해야합니다, 거기 dynamiclly 등록 및 등록 취소 메커니즘이 무엇입니까? 여기에 onclick() 메서드에 등록 해요! – Navaneeth

+0

하지만 등록을 취소 하시겠습니까? –

+0

체크 박스를 선택 취소하면 등록 취소됩니다 – Navaneeth

0

Android가 처리 할 수있는 것보다 IntentReceivers을 더 많이 생성했다고 표시됩니다. 수신기가 더 필요하지 않은 경우 unregisterReceiver()을 사용해야합니다.

관련 문제