2016-02-10 3 views
0

У меня есть MainActivity и MyBroadcastReceiver. BroadcastReceiver ждет входящих SMS-сообщений и считывает sms и senderId, он должен отправить эти данные в MainActivity в режиме реального времени. Я попытался реализовать BroadcastReceiver в самой Деятельности, но он снова запускает действие.Отправка данных из `BraodcastReceiver` в` Activity`

Public class MainActivity extends AppCompatActivity{ 
public static String BROADCAST_ACTION = "SMSCOMING"; 
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final Bundle bundle = intent.getExtras(); 
      try { 
       //Getting the data d 
        triggerFunc(d); 
        } 
       } 
      } catch (Exception e) { 
       Log.e(TAG, "Exception: " + e.getMessage()); 
      } 
     } 
    }; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    IntentFilter filter = new IntentFilter(); 
     filter.addAction(BROADCAST_ACTION); 
     this.registerReceiver(this.broadcastReceiver, filter); 
} 

void triggerFunc(data d){ 
    //Do some stuff 
} 

    } 

ответ

1

Пожалуйста, обратите внимание, что у нас есть два вида радиовещательных приемников в Android:

  • Автономные приемники широковещательных (один из четырех основных Android строительных блоков). Этот тип приемников должен быть зарегистрирован в файле манифеста Android. Эти приемники будут запускаться всякий раз, когда их соответствующие намерения будут получены, независимо от того, работает ли пользовательский интерфейс приложения или нет.

  • Приемники широковещательной передачи. Этот тип приемников не нужно регистрировать в файле манифеста, вместо этого вы должны зарегистрировать их во время выполнения. Эти приемники запускаются только тогда, когда активна и работает их закрывающая активность.

Итак, если вы хотите, чтобы ваше приложение могло улавливать все SMS-сообщения, независимо от его статуса пользовательского интерфейса, вам понадобится прежний вариант. Однако, если вам понадобится ваше приложение, чтобы поймать SMS-сообщение, пока его активность будет показана, вам понадобится последний вариант.

+0

Не могли бы вы привести несколько примеров или просто предоставить соответствующую ссылку? –

0

Когда BroadcastReceiver получает уведомление SMS, он не может знать, если Activity работает или нет. Если вы хотите запустить Activity, вам необходимо создать соответствующий Intent и позвонить по номеру Context.startActivity().

Вы должны создать класс, который расширяет BroadcastReceiver, а не просто экземпляр анонимного внутреннего класса. Кроме того, вы должны зарегистрировать свой BroadcastReceiver, используя тег <receiver> в AndroidManifest.xml.

+0

Я использую «BroadcastReceiver» в самой Деятельности (как указано выше). Расскажите, как добавить этот ресивер в AndroidManifest, пока он показывает ошибку. –

+0

@shikharbansal Я добавил ссылку на мой ответ для деталей. Я предлагаю вам ознакомиться с официальной документацией на Android по адресу http://d.android.com. Это дает хорошую отправную точку для изучения чего-либо в Android API. –

0

любой код, который вы добавили в вопрос, согласно которому ваш Receiver вызывается только при запуске Activity. вместо этого создайте широковещательную передачу отдельно (удалите из действия & создайте новый класс в своем пакете) и зарегистрируйтесь в файле AndroidManifest и вызовите свою деятельность у Получателя.

как показано на рисунке ниже.

Создайте класс BroadcastReceiver в своем пакете.

public class BinarySMSReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final Bundle bundle = intent.getExtras(); 
      try { 
       //Getting the data d 
        Intent intent = new Intent(); 
        intent.setClassName(context, "activity.class"); 
        intent.putExtras(bundle); 
        context.startActivity(intent); 


      } catch (Exception e) { 
       Log.e(TAG, "Exception: " + e.getMessage()); 
      } 
     } 
    }; 

в AndroidManifest

<receiver android:name="com.company.application.SMSBroadcastReceiver" > 
     <intent-filter android:priority="500"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
+0

почему голос? любой комментарий? –

+0

Вы исправили его в редактировании, пока я вводил свой комментарий. –

+0

не будет 'context.startActivity' запускает новый экземпляр того же действия. –

Смежные вопросы