Android - Добавление намерения к уведомлению - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в разработке для Android и до сих пор не очень хорошо понимаю Intent.Здесь я использую Firebase для создания уведомлений, я добавляю Intent к своему уведомлению, но когда мое приложение находится на переднем плане и я нажимаю на уведомление, ничего не происходит (когда приложение убито или в фоновом режиме оно работает хорошо).

Странная вещь в тот момент, когда она работала, когда я нажал на уведомление, была вызвана функция «onNewIntent» моего класса «MainActivity», но теперь ничего больше не происходит, и я думаю, что ничего не изменил в коде.

Вот как я создаю свое намерение:

Notifications notifs = new Notifications(this);
String title = remoteMessage.getData().get("title");
String body = remoteMessage.getData().get("body");
String url = remoteMessage.getData().get("url");

Intent intentNotif = new Intent(this, MainActivity.class);
intentNotif.setAction(Intent.ACTION_MAIN);
intentNotif.addCategory(Intent.CATEGORY_LAUNCHER);
intentNotif.putExtra("url", url);
intentNotif.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
//intentNotif.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

notifs.showNotif(title, body, true, intentNotif);

Вот как я добавляю намерение к уведомлению:

this.builderGeneric.setContentIntent(PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));

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

РЕДАКТИРОВАТЬ: Вот как я могу создать уведомление, если оно полезно:

Notifications(Context context) {
  this.context = context;

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    this.notifManager = context.getSystemService(NotificationManager.class);
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
    channel.setDescription(CHANNEL_DESCRIPTION);
    channel.enableLights(false);
    channel.enableVibration(false);
    channel.setSound(null, null);
    if (this.notifManager != null) {
      this.notifManager.createNotificationChannel(channel);
    }
  } else {
    this.notifManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
  }

  this.builderGeneric = new Notification.Builder(context)
      .setVisibility(Notification.VISIBILITY_PUBLIC)
      .setWhen(System.currentTimeMillis())
      .setSmallIcon(R.mipmap.ic_launcher_round);

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    this.builderGeneric.setChannelId(this.CHANNEL_ID);
  }
  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
    this.builderGeneric.setSmallIcon(R.mipmap.ic_launcher_foreground);
  }
}

public void showNotif(String title, String text, boolean cancelable, Intent intent) {
  this.builderGeneric.setContentTitle(title)
      .setContentText(text)
      .setOngoing(!cancelable)
      .setContentIntent(PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));

  Notification notifGeneric = this.builderGeneric.build();

  this.notifManager.notify(1, notifGeneric);
}

РЕДАКТИРОВАТЬ 2: Вот мой манифест:

<application
  android:allowBackup="true"
  android:fullBackupContent="@xml/backup_descriptor"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:launchMode="standard"
  android:roundIcon="@mipmap/ic_launcher_round"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">

  <activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
  </activity>

  <receiver
    android:name=".NetworkChangeReceiver"
    android:label="NetworkChangeReceiver">
    <intent-filter
      android:name=".NetworkIntentFilter"
      android:label="NetworkIntentFilter">
      <action
        android:name="android.net.conn.CONNECTIVITY_CHANGE"
        tools:ignore="BatteryLife" />
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
  </receiver>

  <service android:name=".MyFirebaseService"
    android:exported="false">
    <intent-filter>
      <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
  </service>

</application>

1 Ответ

0 голосов
/ 27 февраля 2019

ОК, сначала попробуйте удалить

intentNotif.setAction(Intent.ACTION_MAIN);
intentNotif.addCategory(Intent.CATEGORY_LAUNCHER);

Далее, добавив android:launchMode="singleTask" (также удаляя android:launchMode="standard") внутри тега активности в AndroidManifest.xml.

Затем попробуйте снова,имейте в виду, что для launchMode задано singleTask, и если вы нажмете на уведомление, когда ваша MainActivity открыта, -> onNewIntent будет запущено (поскольку Android не создаст еще один экземпляр этой операции), в противном случае будет вызываться onCreate.

И если это сработает, я бы порекомендовал вам прочитать больше о LaundMode здесь

...