Android - 向通知添加意图

Posted

技术标签:

【中文标题】Android - 向通知添加意图【英文标题】:Android - Adding an Intent to a notification 【发布时间】:2019-07-20 22:34:23 【问题描述】:

我是 android 开发的新手,但我仍然不太了解 Intent。在这里,我使用 Firebase 创建通知,我在通知中添加了一个 Intent,但是当我的应用程序处于前台并单击通知时,什么也没有发生(当应用程序被杀死或在后台运行良好时)。

奇怪的是它正在工作,当我点击通知时,我的“MainActivity”类的函数“onNewIntent”被调用,但现在什么也没有发生,我想我没有改变代码。

这是我创建意图的方式:

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>

【问题讨论】:

当用户点击通知时你会期待什么? 现在它又可以工作了,我仍然没有改变代码......很奇怪。 当用户点击通知时,我只想调用我的类“MainActivity”的函数“onNewIntent”。 你的 MainActivity 启动模式是什么? 这是标准的,如果您需要,我添加了我的清单 【参考方案1】:

好的,先试试删除

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

接下来,在 AndroidManifest.xml 的活动标记中添加android:launchMode="singleTask"(同时删除android:launchMode="standard")。

然后再试一次,请注意,launchMode 是 singleTask 并且如果您在 MainActivity 打开时单击通知 -> onNewIntent 将被触发(因为 Android 不会再创建此 Activity 的一个实例)否则 onCreate 将是调用。

如果它有效,我建议您阅读更多关于 LaundMode here

【讨论】:

完美,它工作正常,我不知道为什么标准模式只工作了一半,但我希望这是问题所在。谢谢。

以上是关于Android - 向通知添加意图的主要内容,如果未能解决你的问题,请参考以下文章

由于 Activity 意图,Android 通知点击导致应用程序崩溃

在android中打开通知时页面不刷新

Android:在通知时不会自动显示使用啥意图标志这样未破坏的活动

从 android 推送通知单击启动时,意图数据未在活动中更新

从通知意图启动活动时重新创建 Android ViewModel

向 Android 设备发送数据 向 IOS 设备发送通知