2

У меня есть приложение, в котором я отправляю SMS, нажав кнопку действия в уведомлении. Я хочу показать Toast после отправки SMS, но это не сработает. Я боюсь, что это имеет какое-то отношение к AsyncTask и/или BroadcastReceiver.Как отправить тост из уведомления после выполнения действия при нажатии на Android?

Рабочий процесс отправки СМС выглядит следующим образом:

  • Я просматриваю мои устройства контакты с AsyncTask и создать Notification из AsyncTask «s onPostExecute()
  • Я использую NotificationCompat.Builder для создания Notification
  • Я добавлю PendingIntent в Notification, который выглядит так:

    PendingIntent.getBroadcast(mContext, (int) _person.getId(), i, PendingIntent.FLAG_ONE_SHOT);

  • отправляю SMS из BroadcastReceiver «ы onReceive()

  • Я пытаюсь отправить Тост оттуда, как это:

    Toast.makeText(_context, "SMS sent!", Toast.LENGTH_SHORT).show();

Я пытался отлаживаем это, но, к сожалению, Eclipse не показывает мне содержимое переменных в onReceive().

Я также прочитал кое-что о «совместимости совместимости» для сайтов разработчиков Google here, но я не смог найти учебник, где это объясняется более подробно.

EDIT:

Я предполагаю, что это может быть полезно, чтобы объяснить, что контекст передается через все классы:

  • В моей MainActivity я отображающих PreferenceFragment в качестве основного содержания
  • В этом PreferenceFragment я называю новый MyAsyncTask(getActivity()).execute();, так что мой MainActivity должен быть моим Context
  • В конструкторе MyAsyncTask я передать это класс, где я создать Notification и сохранить его там в качестве члена (mContext)
  • остальное я уже упоминал ...

EDIT 2:

Вот соответствующий фрагмент кода моего BroadcastReceiver, что прислушивается к действию Notification «s:

@Override 
public void onReceive(Context _context, Intent _intent) 
{ 
    String type = _intent.getStringExtra("type"); 
    if (type.equals("SMS")) 
    { 
     String phoneNumber = _intent.getStringExtra("phoneNumber"); 
     String message = _context.getResources().getString(
      R.string.smstext); 
     SmsManager smsManager = SmsManager.getDefault(); 
     smsManager.sendTextMessage(phoneNumber, null, message, null, null); 

     Toast.makeText(_context, "SMS sent!", Toast.LENGTH_SHORT).show();   
    } 
} 
+0

Есть ошибки? Пожалуйста, опубликуйте его, если да. что такое _context и где он установлен? – Lenny

+0

Просьба уточнить, что «это не работает» – Tyler

+0

Хорошо, SMS отправляется, но Toast не отображается. _context - это просто Контекст, переданный из onReceive (Контекст _context, Intent _intent). (Я использую символы подчеркивания для переданных переменных) Я не получаю сообщение об ошибке. – kaolick

ответ

0

Используйте runnable.Всякий раз, когда я выполнять команды в потоке, я создал обработчик и исполняемую, которые позволяют мне вести дела в основном потоке, когда все было закончено:

// Declare a global handler for the class 
final Handler mHandler = new Handler(); 
// Declare a runnable that will do things app-side when your thread is finished 
final Runnable mMessageSent= new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     Toast.makeText(_context, "SMS sent!", Toast.LENGTH_SHORT).show(); 
    } 
}; 

// Set up your thread to post the runnable when it's finished sending an SMS 
private void sendMessage() 
{ 
    Thread t = new Thread() 
    { 
     public void run() 
     { 
      // Send your SMS here 
      // When finished, notify the handler so it knows to show a toast notification 
      mHandler.post(mMessageSent); 
     } 
    }; 
    t.start(); 
} 
+0

К сожалению, это не работает. Я пробовал в основном то же самое раньше, тоже не работал. Но все равно спасибо! – kaolick

0

MasterKale был близок, проблема в том, что вам нужно отправить тост из Пользовательский интерфейс или он не будет работать. Я не уверен, что он думает, что он делает с этой нитью.

final Handler mHandler = new Handler(Looper.getMainLooper()); 

mHandler.post(new Runnable(){ 
     @Override 
     public void run() { 
      Toast.makeText(mContext, "Message", Toast.LENGTH_SHORT).show(); 
     } 

}); 
+0

К сожалению, это также не работает. Я отредактировал свой пост и добавил 'onReceive()' моего 'BroadcastReceiver'. Я заменил строку «Toast» вашим кодом (мне пришлось изменить «mContext» на '_context' и пришлось сделать это« final »). Но это все еще не сработало. Это сводит меня с ума. Так или иначе, «Контекст» не может быть неправильным, потому что я могу получить доступ к «Ресурсам» приложения. – kaolick

+0

Попробуйте перевести свою логику на Службу, попросите вашего реселлера начать службу отправки sms и показать тост. – schwiz

+0

Вы имеете в виду вместо того, чтобы использовать «AsyncTask» для сканирования контактов? Или просто для части происходит в приемнике 'onReceive()'? – kaolick