我正在将推播通知实施到一个SDK代码库中,该代码库实现了我们公司基础结构与集成了SDK的应用程序之间的消息传递功能。所有功能都封装在一系列片段中,这些片段可以交换进出客户端实现的父活动。
使用集成了SDK的testbench应用程序,可以在需要时向ui生成实际的推送通知,但在调用通知时无法点击OnNewIntent方法。
使用Android Studio提供的模板通知类创建通知,我对创建通知基础的Intent和PendingIntent进行了一些修改。
我没有简单的方法直接传递通知将返回的活动类。因此,从应用程序代码中,我需要调用一个初始化方法,该方法接受活动类类型和上下文并创建意图。有许多事件会触发通知,我只想实现它,以便每次生成新通知时,都会丢弃前一个通知。
public static<T> void initNotifications(Class<T> activityClass,Context context){
clientIntent = new Intent(context,activityClass);
clientIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
clientIntent.putExtra("someData","This is some extras");
clientContext = context;
}
clientIntent
和clientContext
是通知类中的静态成员。每次调用notify方法时,我都会创建一个新的PendingIntent:
private static PendingIntent createPendingIntent(Context c, int requestCode){
PendingIntent pendingIntent =
PendingIntent.getBroadcast(c,requestCode,clientIntent,PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
每次创建通知时都会调用的类(不包括用于创建通道的一堆样板代码,等等):
public class NotificationHelper {
private static final String NOTIFICATION_TAG = "NewMessage";
private static NotificationChannel notifChannel = null;
private static int requestCode = 100;
private static Intent clientIntent = null;
private static Context clientContext = null;
public static void notify(final Context context, final String notificationTitle, final String notificationMessage) {
if (clientIntent == null){
throw new RuntimeException("Notifications haven't been enabled. Call NotificationHelper.initNotifications to initialize them");
}
if (context == null){
RuntimeException t = new RuntimeException("Null context when trying to post notification");
t.printStackTrace();
t.getCause();
throw t;
}
requestCode+=1;
PendingIntent newPendingIntent = createPendingIntent(clientContext,requestCode);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context,channelId)
// Set appropriate defaults for the notification light, sound,
// and vibration.
.setDefaults(Notification.DEFAULT_ALL)
// Set required fields, including the small icon, the
// notification title, and text.
.setSmallIcon(R.drawable.ic_stat_new_message)
// .setContentTitle(context.getResources().getString(R.string.action_reply))
.setContentTitle(title)
.setContentText(text)
// All fields below this line are optional.
// Use a default priority (recognized on devices running Android
// 4.1 or later)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
// Provide a large icon, shown with the notification in the
// notification drawer on devices running Android 3.0 or later.
.setLargeIcon(picture)
// Set ticker text (preview) information for this notification.
.setTicker(ticker)
// Show a number. This is useful when stacking notifications of
// a single type.
// .setNumber(number)
.setContentIntent(newPendingIntent)
// Show expanded text content on devices running Android 4.1 or
// Automatically dismiss the notification when it is touched.
.setAutoCancel(true);
notify(clientContext, builder.build());
}
}
测试代码后,我发现我可以在UI中生成通知,但是当我单击它时,我没有点击我应该在要恢复的活动中创建的OnNewIntent方法。我的问题:
我在Intent和PendingIntent初始化中设置的标志相对于我想要在通知到来时进行替换的目的是否正确?
我可以让一个静态的Intent实例用于每个通知吗?
使用两个不同的上下文实例是否合适?我保存了从initNotifications
传入的那个,因为我认为所有通知实体在创建时都应使用相同的上下文实例。
编辑:我的问题与假设的duplicate不同,因为在所描述的情况下,他们能够直接传递PendingIntent将在选择通知时返回的类。就我而言,我无法做到这一点,并且我试图找到解决方案以通过其他方式传递引用(即,创建在推送通知之前创建的静态声明的Intent)。但是我确实注意到我的清单缺少适当的launchMode声明,因此在这方面很有用。