2013-10-02 2 views
0

사람은 생각이 라인은 안드로이드 문서에 의미하는 것 (enter link description here)를 알고 있습니까 "BroadcastReceiver의 오해의 소지가있는 문서입니까?

가 참고 : Activity.onResume() 구현에 수신기를 등록 할 경우, 당신은 Activity.onPause에 등록을 취소해야합니다 () (일시 중지되면 의도를 알 수 없으므로 불필요한 시스템 오버 헤드가 줄어 듭니다.)

첫 번째 문장은 분명하지만 자원이 필요하지 않으면 해제해야합니다. 브래킷 된 텍스트? 분명히 백그라운드의 앱이 브로드 캐스트 인 텐트를 받으면 중지됩니다 (적어도 Android 4.2에서는). 브로드 캐스트 인 텐트가있을 때 브로드 캐스트를받지 않습니다. 파괴되었다. 시도 할 코드 :

public class MyActivity extends Activity { 

    private BroadcastReceiver mBroadcastReceiver; 

    String a = "1234"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mBroadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.d("|BR", "onReceive() - 1" + " intent: " + intent); 
       a = intent.getStringExtra("ASDF"); 
      } 
     }; 
     this.registerReceiver(mBroadcastReceiver, new IntentFilter(MyService.RECEIVE)); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d("|BR", "onResume()" + " a: " + a); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("|BR", "onPause()"); 
    } 

    /** Event handler for a button in the main.xml */ 
    public void createService(View view) { 
     Log.d("|BR", "createService()"); 
     Intent intent = new Intent(MyService.DO); 
     this.startService(intent); 
    } 
} 


public class MyService extends Service { 

    public static final String DO = MyService.class.getName() + ".DO"; 
    public static final String RECEIVE = MyService.class.getName() + ".RECEIVE"; 

    public Executor executor; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     executor = Executors.newSingleThreadExecutor(); 
    } 

    @Override 
    public int onStartCommand(final Intent intent, final int flags, final int startId) { 
     String action = intent.getAction(); 

     Log.d("|BR", "onStartCommand() - 1"); 
     if(DO.equals(action)) { 
      executor.execute(new MyRunnable()); 
      Log.d("|BR", "onStartCommand() - 2"); 

     } 
     return START_NOT_STICKY; 
    } 


    @Override 
    public android.os.IBinder onBind(final Intent intent) { 
     return null; 
    } 

    private class MyRunnable implements Runnable { 

     @Override 
     public void run() { 
      Log.d("|BR", "run() - 1"); 

      try { 
       Thread.sleep(1000 * 8); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 


      Log.d("|BR", "run() - 2"); 

      Intent intent = new Intent(RECEIVE); 
      intent.putExtra("ASDF", "QWER"); 
      MyService.this.sendBroadcast(intent); 

      Log.d("|BR", "run() - 3"); 

     } 
    } 
} 

버튼을 누르고 8 초 동안 기다리십시오. 결과 :

09:05:48.622 D/|BR: onResume() a: 1234 
09:05:53.297 D/|BR: createService() 
09:05:53.297 D/|BR: onStartCommand() - 1 
09:05:53.307 D/|BR: onStartCommand() - 2 
09:05:53.307 D/|BR: run() - 1 
09:05:54.558 D/|BR: onPause() 
09:06:01.306 D/|BR: run() - 2 
09:06:01.316 D/|BR: onReceive() - 1 intent: Intent { act=com.example.broadcastReceive.MyService.RECEIVE flg=0x10 (has extras) } 
09:06:01.316 D/|BR: run() - 3 
09:06:14.139 D/|BR: onResume() a: QWER 
+0

오해의 소지가 있는지 이해할 수 없습니다. 앱이 일시 중지되었으며 수신기가 등록 취소되지 않았기 때문에 브로드 캐스트를 수신합니다. – njzk2

답변

2

그것은 단순히 당신이 당신의 onPause()BroadcastReceiver을 등록했습니다 경우 방송을 수신되지 않습니다.

+0

아우. 따라서 괄호 안에있는 텍스트는 onPause()의 결과이며 배경에있는 결과가 아닙니다. 그건 의미가 있습니다. 내 세계가 지금 다시 자리 잡고 있습니다. 감사. (아직도 나는 그것이 약간 오도하는 것이라고 생각한다). –

0

수신기에서 수행하는 작업에 따라 CPU/배터리를 많이 소모 할 수 있습니다. 그렇다면 가능한 한 거의 실행하지 않기를 바란다. 그리고이 문장이 무엇을 말하고 싶어하는지.

GPS 정보를 수신하는 코드를 실행 한 적이 있습니까? 최대 2 시간 동안 배터리를 사용할 수 있습니다. 따라서이 스위치가 켜지면 1 초마다 카운트됩니다. onResume 및 은이 기능을 켜고 끄는 가장 좋은 장소입니다. onStart, onStop 또는 심지어 onCreate, onDestroy을 사용하면 기능이 켜져 있고 필요 이상으로 배터리가 소모됨을 의미합니다.

관련 문제