2014-02-07 1 views
0

이 질문은 애매 모호해 보일 수도 있습니다. Intent 꽤 많이 배경에 삽니다. 동의하지만 Intent 필터를 사용하고 있습니다. 두 개의 버튼을 등록하고 등록을 취소합니다. . 누름 등록시 Intent 필터가 등록되면 등록 해제시에도 동일하게 동작합니다. 이제 등록 버튼을 누르고 앱을 백그라운드에 놓으면 토스트 메시지가 표시되지 않습니다. 그러나 사용자가 명시 적으로 등록 취소 버튼을 누를 때만 Intent 필터가 메시지 수신을 중지하도록합니다.인 텐트를 백그라운드에서 살리는 방법

나는이 코드를 사용하고 있습니다 : 활동이 실행되지 않을 때

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    // Get the object of SmsManager 
     final SmsManager sms = SmsManager.getDefault(); 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 


      // Retrieves a map of extended data from the intent. 
      final Bundle bundle = intent.getExtras(); 

      try { 

       if (bundle != null) { 

        final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

        for (int i = 0; i < pdusObj.length; i++) { 

         SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
         String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 

         String senderNum = phoneNumber; 
         String message = currentMessage.getDisplayMessageBody(); 

         Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message); 


         // Show alert 
         int duration = Toast.LENGTH_LONG; 
         Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration); 
         toast.show(); 







        } // end for loop 
        } // bundle is null 

      } catch (Exception e) { 
       Log.e("SmsReceiver", "Exception smsReceiver" +e); 

      } 




     } 

    }; 



public void register(View view){ 

    this.registerReceiver(broadcastReceiver, new IntentFilter(
      "android.provider.Telephony.SMS_RECEIVED")); 

} 
public void unRegister(View view){ 

    this.unregisterReceiver(broadcastReceiver); 


} 



} 
+0

공정하게 보입니다. 나는 그것을 확인해야합니다. 정크스 @MikeM. –

+0

@ MikeM : 당신의 방식으로 구현 .. 아무 문제 없어 .. thanks –

답변

0

으로는 BroadcastReceiver documentation 설명을 프로그래밍 방식 Activity.registerReceiver()를 통해 등록 된 방송 수신기는 방송을 수신하지 않습니다 :

Activity.onResume() 구현에 수신기를 등록하려면 Activity.onPause()에서 등록자를 등록 해제해야합니다.

당신은 배경 Service 사용을 고려하고 (register receiver in a service를 참조)에 방송 수신기를 등록 할 수 있습니다 (일시 정지 할 때 의도를받을 수 없습니다, 이것은 불필요한 시스템 오버 헤드를 줄일 것입니다).

또는 @ doctoror-drive가 지적한 것처럼 리디렉션을 매니페스트 파일에 정적으로 등록하고 PackageManager을 사용하여 프로그래밍 방식으로 수신자/수신자를 프로그래밍 할 수 있습니다.

+0

틀렸어. 서비스가 필요하지 않습니다. 대신, Manifest에 정적 수신기를 등록해야합니다. –

+0

@DoctororDrive : 나는 정적을 피하고 있습니다. –

+0

@ VamsiPavanMahesh 정적을 피하고 있습니까? –