Как отключить push-уведомление от отображения при запуске приложения?

Мне нужно обрабатывать push-уведомление двумя способами:

1) Получать и размещать уведомление о строке состояния моего клиента android, когда приложение находится в фоновом режиме;

2) Получать и обрабатывать уведомление без отображения его в строке состояния, когда мое приложение находится на переднем плане;

Для (1) было очень просто, я помещал и вызывал PushService.setDefaultPushCallback (context, classObject); И уведомление отображается в строке состояния правильно.

Моя проблема связана с (2):

  • Я попытался создать собственный BroadCastReceiver, но parse берет уведомление передо мной и показывает его в строке состояния;
  • Я попытался отключить PushService.setDefaultPushCallback (context, classObject) в методе onStart, установив значение null для classObject, но когда я это сделал, мой приемник никогда не вызывался и уведомление не появлялось;

Есть ли что-нибудь, что я мог бы сделать, чтобы перехватить уведомления перед синтаксическим анализом или есть еще одна вещь, которую я мог бы сделать, чтобы решить мою проблему?

Ps: Мне нужно отправить сообщение с сервера с "alert"

Tks,

Solutions Collecting From Web of "Как отключить push-уведомление от отображения при запуске приложения?"

Если вы используете «alert» или «title» в своих json-данных, com.parse.PushService перехватит и отобразит стандартное уведомление.

Скорее создайте свой собственный BroadCastReceiver и отправьте заголовок, например, «header» в json. Затем вы можете управлять в обработчике onReceive, когда и что показывать.

например

public class MyBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "MyBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { try { String action = intent.getAction(); String channel = intent.getExtras().getString("com.parse.Channel"); JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data")); String title = "New alert!"; if (json.has("header")) title = json.getString("header"); generateNotification(context, getImg(), title); } catch (Exception e) { Log.d(TAG, "JSONException: " + e.getMessage()); } } public static void generateNotification(Context context, int icon, String message) { // Show the notification long when = System.currentTimeMillis(); NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(icon, message, when); String title = context.getString(R.string.app_name); Intent notificationIntent = new Intent(context, SnapClientActivity.class); // set intent so it does not start a new activity notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, title, message, intent); notification.vibrate = new long[] { 500, 500 }; notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; notificationManager.notify(0, notification); } } 

У меня такая же проблема. И, попробовав неудачно другие решения, я попробовал более простое решение … и это сработало.

При использовании пользовательского ParsePushBroadcastReceiver переопределите метод onPushReceiver. И только вызовите метод супер класса, если ваше приложение неактивно.

 public class ParsePushReceiver extends com.parse.ParsePushBroadcastReceiver{ @Override protected void onPushReceive(Context context, Intent intent ) { // do your stuff here if( !MyApp.active ) super.onPushReceive(context, intent ); } } 

Не забудьте зарегистрировать свой собственный BroadcastReceiver в вашем AndroidManifest.xml , поскольку в документации Parse.com говорится:

Если ваш код находится в пакете com.example и вы хотите зарегистрировать приемник для действия com.example.UPDATE_STATUS, вы можете добавить следующий XML в ваш файл AndroidManifest.xml сразу после окончания созданного вами блока ParseBroadcastReceiver ранее:

 <receiver android:name="com.example.MyCustomReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.UPDATE_STATUS" /> </intent-filter> </receiver> 

Ваш пользовательский получатель будет вызываться всякий раз, когда будет получено push-уведомление с параметром действия com.example.UPDATE_STATUS. В целях безопасности SDK Parse гарантирует, что это намерение может обрабатываться только получателями в вашем приложении. Кроме того, вы должны установить атрибут android: exported на свой элемент, чтобы другие приложения не отправляли нажатие на ваш ресивер.

Ханнес прав, но это решение все равно будет генерировать уведомление независимо от того, работает ли приложение.

Чтобы ответить на ваш полный вопрос, используйте код Hannes в сочетании с этим здесь: Как узнать, работает ли Android-приложение на переднем плане?

Только когда приложение не будет запущено, вы вызываете функцию generateNotification ().