2015-12-04 2 views
0

Я бегу следующий в моем LaunchActivityonCreate()Показать оповещение на UI

new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      OneSignal.init(LaunchActivity.this, AppGlobal.GCMProjectNumber, AppGlobal.OneSignalAppID, new OneSignalNotificationOpened(LaunchActivity.this)); 
      Log.d("OneSignal", "Initialized"); 
      oneSignalInitialized = true; 
     } 
    }); 

Вот мой OneSignalNotificationOpened класс:

class OneSignalNotificationOpened implements NotificationOpenedHandler { 
    Context context; 

    public OneSignalNotificationOpened(Context context) { 
     this.context = context; 
    } 
    public void notificationOpened(String message, JSONObject additionalData, boolean isActive) { 
     String messageTitle = "OneSignal Example", messageBody = message; 
     String tag = "launch"; 

     try { 
       if (additionalData.has("title")){ 
        messageTitle = additionalData.getString("title"); 
       } 
       if (additionalData.has("actionSelected")){ 
        messageBody += "\nPressed ButtonID: " + additionalData.getString("actionSelected"); 
       } 


       messageBody = message; 
      if(additionalData.has("bookId")){ 
       bookIndex = Integer.parseInt(additionalData.getString("bookId")); 
       if(bookIndex >= 0){ 
        restrictBookListActivity = true; 

        if(AppPreferences.ShopBookList != null) { 
         Book theBook = AppPreferences.ShopBookList.get(bookIndex); 
         Log.i(tag, "stored: " + theBook.getName()); 
         Bundle data = new Bundle(); 
         data.putSerializable("param1", theBook); 

         //notificationReceived(messageTitle, messageBody, bookIndex); 
         final Intent detailActivity = new Intent(LaunchActivity.this, DetailActivity.class); 
         detailActivity.putExtras(data); 
//      startActivity(detailActivity); 

         AlertDialog.Builder dialog = new AlertDialog.Builder(context); 
         dialog.setTitle("Notification received!"); 
         dialog.setMessage("This is body"); 
         dialog.setCancelable(true); 
         dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           startActivity(detailActivity); 
          } 
         }); 
         dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

          } 
         }); 
         dialog.show(); 


         //startActivity(detailActivity); 
        }else Log.i(tag, "book list is null"); 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.d("Error", "Error: " + e.toString()); 
     } 

    } 
} 

открыть другую деятельность, используя Handler().postDelayed() в onCreate(), чтобы перейти к другой деятельности , Когда я получаю уведомление, я занимаюсь этим. dialog.show() в OneSignalNotificationOpened throws WindowManager$BadTokenException: Unable to add window. Как я могу это решить?

Обновление: Я проверил, что моя деятельность завершилась, прежде чем показывать диалог isFinishing() и обнаружил, что он завершен. Итак, как я могу показать предупреждение?

+0

Попробуйте проверить, не активирована ли ваша деятельность isFinishing() перед отображением диалога, если вы не можете его показать. –

+0

Хорошо. Все мои действия расширяют 'BaseActivity'. Я попытался вызвать метод из BaseActivity, чтобы показать это предупреждение. Но то же самое происходит и там. Моя BaseActivity никогда не заканчивается, я прав? Должно ли такое же происходить и для BaseActivity? –

+0

@CoolBrain Нет, вы не правы - если вы расширяете что-то, это означает, что вы просто используете базовый объект в своем классе (подумайте об этом так). Это не имеет никакого отношения к жизненному циклу Android. – Divers

ответ

0

Если вам просто нужно показать диалог с содержимым сообщения, когда уведомление получено, когда пользователь использует ваше приложение, вы можете просто позвонить OneSignal.enableInAppAlertNotification(true); после OneSignal.init(...);. Или, если вы всегда хотите, чтобы уведомление отправилось в область уведомлений, вы можете позвонить OneSignal.enableNotificationsWhenActive(true);.

Дополнительную информацию о вышеуказанных методах см. На странице OneSignal Android API Reference.

Если вам требуется более настраиваемое диалоговое окно оповещений, вы можете добавить статическую переменную Activity в класс BaseActivity, чтобы каждый из ваших классов активности. Задайте эту статическую переменную в методе в своем BaseActivity и используйте его как контекст для new AlertDialog.Builder(context);

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