Как показать уведомление о статусе или всплывающее диалоговое окно из фонового сервиса? - PullRequest
2 голосов
/ 04 августа 2011

Я создал загрузчик Service, который прослушивает входящие сообщения в моем приложении. Сервис постоянно работает в фоновом режиме, поскольку приложение закрыто, то есть пользователь отключен. Пока пользователь не в сети и появляется новое сообщение, я должен показать уведомление в строке состояния или всплывающем диалоговом окне (здесь, в этой ситуации, служба не связана ни с одним из действий ) Я сталкиваюсь со следующими проблемами:

  1. При создании уведомления я не получаю Контекст и активность.
  2. Когда я показываю диалог из класса обслуживания, я получаю исключение как "Can't create handler inside thread that has not called Looper.prepare()".

Я новичок в сфере услуг для Android и не знаю, как решить эту проблему. Кто-нибудь может подсказать мне, как это сделать? Есть ли какая-нибудь ссылка, которая поможет мне в этом? Я застрял из-за этой проблемы. Помощь высоко ценится. Спасибо.

Ответы [ 4 ]

4 голосов
/ 04 августа 2011

Вы можете отправить уведомление и указать, какое действие следует запустить, когда пользователь инициирует его:

 private void sendNotification(Bundle bundle){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;
    CharSequence tickerText = "bla bla";
    long when = System.currentTimeMillis();
    Notification notification = new Notification(icon, tickerText, when);
    Context context = getApplicationContext();
    CharSequence contentTitle = "My notification";
    CharSequence contentText = "Hello World!";
    Intent notificationIntent = new Intent(this, ACTIVITY_YOU_WANT_TO_START.class);
    if(bundle!=null)
        notificationIntent.putExtras(bundle); //you may put bundle or not
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    int any_ID_you_want = 1; 
    //if you send another notification with same ID, this will be replaced by the other one
    mNotificationManager.notify(HELLO_ID, notification);
}

//To play a sound add this:
notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); //for example

Вы можете запустить другое действие:

private boolean startActivity(Bundle bundle){
    Intent myIntent = new Intent(mContext, ACTIVITY_YOU_WANT_TO_START.class);
    if(bundle!=null)
         myIntent.putExtras(bundle);//optional
    myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    getApplication().startActivity(myIntent);
    return true;
}
2 голосов
/ 04 августа 2011

В дополнение к ответу Шерифа, вы должны использовать следующую тему

android:theme="@android:style/Theme.Dialog"

для этого действия в AndroidManifest.xml. Тогда вы получите диалог. :)

1 голос
/ 10 января 2018

Чтобы добавить диалог оповещения из службы, это работало нормально

final AlertDialog dialog = dialogBuilder.create();
            final Window dialogWindow = dialog.getWindow();
            final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();

            // Set fixed width (280dp) and WRAP_CONTENT height
            final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
            lp.copyFrom(dialogWindowAttributes);
            lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics());
            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
            dialogWindow.setAttributes(lp);

            // Set to TYPE_SYSTEM_ALERT so that the Service can display it
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                dialogWindow.setType(WindowManager.LayoutParams.TYPE_TOAST);
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                dialogWindow.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
            }
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            {
                dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
            dialog.show();

Но использование TYPE_SYSTEM_ALERT может вызвать политику удаления приложений Google с опасными разрешениями.Убедитесь, что у вас есть действительное обоснование на тот случай, если это потребуется Google.

1 голос
/ 10 октября 2013

Мы можем показать диалог из сервиса, только если это диалог с системным предупреждением.Итак, установите TYPE_SYSTEM_ALERT параметр макета окна в диалоговое окно следующим образом:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

Но для этого нужно SYSTEM_ALERT_WINDOW permission.Поэтому не забудьте добавить это разрешение в файл манифеста.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Счастливое кодирование ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...