Статьи

Всплывающее окно SMS с Android — часть четвертая


В 
первой части мы перехватывали SMS-сообщения с помощью BroadcastReceiver. Во 
второй части , среди набора параметров, мы решили передать необходимую информацию SMS (отправитель, сообщение и метка времени) в качестве объекта Serializable ‘PopMessage’ из фона в диалоговое окно предупреждения на переднем плане, которое мы создали в
третьей части :
в этом последнем В этом разделе мы завершим это базовое приложение, обрабатывая действия пользователя с помощью нажатий кнопок. Пользователь может выполнить два действия:

  1. Закройте всплывающее окно SMS после прочтения сообщения
  2. Выберите, чтобы ответить на него, используя свою любимую программу SMS.

Мы использовали
Intents  в предыдущих частях этой серии как 
асинхронные сообщения для передачи данных между компонентами:

    // In our BroadcastReceiver class, we're passing the
    // SMS message pop_msg to the PopSMSActivity, i.e. our UI.
     intent.setClass(context, PopSMSActivity.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.putExtra("msg", pop_msg);
     context.startService(intent);

Приведенный выше код использует
явное намерение , то есть намерение, которое указывает конкретный класс (
PopSMSActivity ) для передачи данных. Это в основном прямой вызов другого компонента (Service, Activity …). Но Intents также можно использовать для отправки сообщений в систему Android, чтобы последняя могла определить, какие действия предпринять.

Неявные намерения  не обозначают 
определенный класс,  который должен вызываться системой, а 
действие который мы хотели бы выполнить системой. Как Android узнает, какие компоненты нужно вызвать для выполнения этого действия? Потому что те приложения / компоненты, которые могут обрабатывать действие, ранее зарегистрировались в системе. Но как они это сделали? То же самое мы сделали с нашим собственным получателем SMS в манифесте нашего приложения в первой части этой серии:

<!-- Incoming SMS messages can be intercepted by the SMSReceiver class -->
<receiver android:name="com.ts.pop.sms.SMSReceiver">
  <intent-filter android:priority="999" android:exported="true">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>

Используя
фильтр намерений , мы указали системе Android, что наше приложение является кандидатом для обработки события SMS_RECEIVED.
Фильтры намерений — это то, как компоненты декларируют свои возможности, чтобы другие компоненты могли их использовать. Android будет рассматривать действие, данные и категорию намерения как часть процесса
разрешения намерения .

Данный компонент может объявить любое количество фильтров Intent, соответствующее количеству действий, которые он потенциально может выполнить. Если у компонента нет фильтров намерений, он может реагировать только на
явные намерения. Когда есть несколько компонентов, которые имеют одинаковые фильтры Intent, Android предоставит пользователю список на выбор.

Что за 
Используемый  ниже метод smsReply () просит Android вызвать любую программу MMS-SMS, которую можно найти на телефоне:

     /***/
    private void smsReply(String sender, String body){
    	Intent sendIntent = new Intent(Intent.ACTION_VIEW);
    	sendIntent.putExtra("address", sender);
    	sendIntent.putExtra("sms_body", body);
    	sendIntent.setType("vnd.android-dir/mms-sms");
    	startActivity(sendIntent);
    	this.finish(); // close this Activity now
    }

Вот как это выглядит на телефоне, после нажатия кнопки «Ответить» и автоматического запуска программы SMS (второй экран) для отправки ответа:

GoHome (), приятный домашний метод, вызываемый при закрытии диалога, просто возвращает пользователя на домашний экран телефона:

     /***/
    private void goHome(){
    	Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
	intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	startActivity(intent);
	this.finish();
    }

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

Вот
один пример того, что можно сделать, добавив список телефонных контактов, звуков и экран настроек.

Источник: 
Блог Тони .