AlertDialog из BroadcastReceiver?? Это можно сделать?
AlertDialog из BroadcastReceiver? Это можно сделать? Я работаю над приложением, которое откроет диалоговое окно, если я получу SMS-сообщение. Я пытаюсь закодировать это в BroadcaseReceiver. Но я не могу использовать эту строку кодаAlertDialog.Builder builder = new AlertDialog.Builder(this);
. Кто-нибудь, пожалуйста, может помочь мне подсказкой!
public class SMSPopUpReceiver extends BroadcastReceiver {
private static final String LOG_TAG = "SMSReceiver";
public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
public void onReceive(Context context, Intent intent) {
Log.i(LOG_TAG, "onReceive");
if (intent.getAction().equals(SMSPopUpReceiver.ACTION)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
for (Object pdu : pdus){
SmsMessage messages =
SmsMessage.createFromPdu((byte[]) pdu);
sb.append("Received SMS\nFrom: ");
sb.append(messages.getDisplayOriginatingAddress());
sb.append("\n----Message----\n");
sb.append( messages.getDisplayMessageBody());
}
}
Log.i(SMSPopUpReceiver.LOG_TAG,
"[SMSApp] onReceiveIntent: " + sb);
Toast.makeText
(context, sb.toString(), Toast.LENGTH_LONG).show();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
}
}
Переведено автоматически
Ответ 1
Основная проблема: старайтесь избегать размещения трудоемких функций в BroadcastReceiver. Он должен просто получать и инициировать дальнейшую обработку в привязанном действии / Службе.
Обновить:
Пожалуйста, проверьте следующие источники, которые могут быть полезны:
Похожие вопросы по StackOverflow:
Как отправить данные из BroadcastReceiver в Activity в Android?
Android SMS receiver не работает
Демонстрационный пример Android SDK:
android-sdk-windows\samples\android-8\ApiDemos\src\com\example\android\apis\os\SmsMessagingDemo.java
И, конечно, стандартная документация Android API: http://developer.android.com/reference/android/content/BroadcastReceiver.html
UPDATE2:
Добавлен скелет приложения, как он должен выглядеть. Пожалуйста, обратите внимание, что просмотр содержимого не определен. Это потому, что у вашего приложения будет прозрачный экран. Для достижения этого
@ android: стиль / тема.Полупрозрачный
вводится под тегом темы для этого действия в AndroidManifest.xml.
public class NotifySMSReceived extends Activity
{
private static final String LOG_TAG = "SMSReceiver";
public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter(ACTION);
this.registerReceiver(mReceivedSMSReceiver, filter);
}
private void displayAlert()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?").setCancelable(
false).setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
}).setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION.equals(action))
{
//your SMS processing code
displayAlert();
}
}
};
}
Ответ 2
Я изучал это, и документация BroadcastReceiver на самом деле говорит:
общедоступный абстрактный void onReceive (контекст context, намерение intent)
Поскольку: уровень API 1, этот метод вызывается, когда BroadcastReceiver получает широковещательную передачу намерения. В течение этого времени вы можете использовать другие методы BroadcastReceiver для просмотра / изменения текущих значений результата. Функция обычно вызывается в основном потоке своего процесса, поэтому вам никогда не следует выполнять в ней длительные операции (существует тайм-аут в 10 секунд, который система допускает, прежде чем считать получателя заблокированным, а кандидата уничтоженным). Вы не можете запустить всплывающее диалоговое окно в вашей реализации onReceive().
Вы не можете запустить всплывающее диалоговое окно в вашей реализации onReceive()
Похоже, это невозможно
Ответ 3
Уже поздно, но это может кому-то помочь.
Вы не можете использовать диалоговое окно оповещения внутри broadcast receiver, мы можем использовать это только в activity или службе. Попробуйте вот так
В вашем методе onReceive broadcastreceiver добавьте
Intent i = new Intent(context, yourclass.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
и в yourclass установите диалоговое сообщение, чтобы оно появлялось при запуске события receiver. Я попробовал это, и у меня сработало. Надеюсь, это может кому-то помочь :-)
Ответ 4
вы можете создать новое прозрачное действие, а затем создать диалоговое окно оповещения в этом действии, всякий раз, когда должно отображаться ваше оповещение, вызывайте это действие из вашего широковещательного приемника, это может сработать, не тестировалось