我正在开发一个可以创建多个警报的应用程序,这些警报会向用户发送通知,以便他们可以点击通知,这会导致一个包含我想要根据附加值显示的警报详细信息的活动,但我的额外内容总是为空,我不明白出了什么问题。我已经搜索了很多问题,但似乎没有什么可以解决我的问题。
这是创建每个警报具有唯一 ID 的位置。 “item.getID()”
NewAlarm.java
firstTime = System.currentTimeMillis();
intervalTime = (1000 * 60 * 4); // 4 minutes
// crear el pending intent y la alarma
Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
intent.putExtra("ID", item.getID());
intent.putExtra("MEDICINA", item.getMedicina());
PendingIntent pendingIntent = PendingIntent.getActivity(this, item.getID(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firstTime, intervalTime, pendingIntent);
AlarmBroadcastReceiver.java
public void onReceive(Context context, Intent intent) {
try {
int notifID = intent.getExtras().getInt("ID");
String medicina = intent.getExtras().getString("MEDICINA");
Intent alarmDetailsIntent = new Intent(context, AlarmDetails.class);
alarmDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("ID", notifID);
intent.putExtra("MEDICINA", medicina);
PendingIntent piDetails = PendingIntent.getActivity(context, notifID, alarmDetailsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mbBuilder = new NotificationCompat.Builder(context);
mbBuilder.setSmallIcon(R.drawable.ic_menu_my_calendar);
mbBuilder.setContentTitle("Medic Reminder");
mbBuilder.setContentText(medicina);
mbBuilder.setVibrate(new long[]{100, 250, 100, 500});
mbBuilder.setContentIntent(piDetails);
notificationManager.notify(notifID, mbBuilder.build());
}catch (Exception ex){
ex.printStackTrace();
}
}
当用户单击通知时,必须打开一个活动并显示带有 ID extra 的警报详细信息,但 getIntent.getExtras() 始终为 NULL。
AlarmDetails.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recordatorio_alarma);
Bundle extras = getIntent().getExtras();
if (extras != null){
try {
int notifID = extras.getInt("ID");
String medicina = extras.getString("MEDICINA");
TextView txtMedicina = (TextView) findViewById(R.id.txtMedicinaAlarma);
txtMedicina.setText("Medicina de prueba");
Button btnCerrar = (Button) findViewById(R.id.btnStopAlarm);
btnCerrar.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(notifID);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我发现我的错误了!
Intent alarmDetailsIntent = new Intent(context, AlarmDetails.class);
alarmDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("ID", notifID);
intent.putExtra("MEDICINA", medicina);
必须是:
alarmDetailsIntent.putExtra("ID", notifID);
alarmDetailsIntent.putExtra("MEDICINA", medicina);
您需要 getStringExtra(),而不是 getExtras().getString()。这可以解决您还没有任何额外内容的情况。
当应用处于后台或终止状态时,Firebase Cloud Messaging (FCM) 会将消息有效负载直接传递到系统托盘,并且不会调用 FirebaseMessagingService 的 onMessageReceived() 方法。相反,如果用户点击通知,系统将启动应用程序的启动器 Activity(或通知的 PendingIntent 中指定的 Activity),并通过 Intent extras 传递消息数据。
要处理这种情况并在单击通知时导航到特定片段,您需要从启动器 Activity(或 PendingIntent 中指定的 Activity)中的 Intent Extras 中检索通知数据,然后根据该数据。
以下是如何修改启动器 Activity 以处理通知数据并导航到适当的片段:
class LauncherActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Check if the launcher Activity was launched from a notification
if (intent?.extras != null) {
val notificationCode = intent.getStringExtra("notificationCode")
if (notificationCode == "ParcelExpired") {
// Navigate to the desired fragment based on the notification data
val intent = Intent(this, ParcelsActivity::class.java)
intent.putExtra("notificationCode", notificationCode)
startActivity(intent)
}
}
// Finish the launcher Activity to prevent it from showing in the back stack
finish()
}
}