#android-intent #flutter
#android-намерение #flutter
Вопрос:
Я написал некоторый собственный код Android на Java, который мне нужен для сборки моего приложения в flutter. В этом коде я планирую использовать уведомления PendingIntent
. Когда я запускаю код при редактировании части Android (открываю папку Android в android studio и запускаю app
), мои уведомления отображаются и работают так, как ожидалось. Однако, когда я открываю часть моего приложения dart / flutter и запускаю main.dart
все свои функции, связанные с PendingIntent
s перерывами.
Странный артефакт в этом заключается в том, что, похоже, это происходит только при трансляциях, а не при действиях. Чтобы объяснить: основное действие крана — вывести MainActivity
на передний план, что всегда работает. Я также добавил кнопки действий в уведомление, которые выполняют трансляции, которые показывают ранее описанную проблему.
Я попытался просмотреть свой AndroidManifest.xml
и build.gradle
и проверить, обновлены ли все мои библиотеки из AndroidX (также дважды проверил зависимости).
Код для создания уведомления (показывающий, что он просто использует NotificationManager.notify()
)
private static NotificationCompat.Builder getBuilder(Context context, NotificationData data) {
Intent tapIntent = new Intent(context, getMainActivityClass(context));
// tapIntent.setAction(ACTION_OPEN);
PendingIntent tapPendingIntent = PendingIntent.getActivity(context, 0, tapIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Intent snoozeIntent = new Intent(context, SnoozeBroadcast.class);
// snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_ID, data.id);
snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_TITLE, data.title);
snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_MESSAGE, data.message);
snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_DELAY, data.snoozeDelay);
PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, 1, snoozeIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Intent cancelIntent = new Intent(context, CancelBroadcast.class);
// cancelIntent.setAction(ACTION_CANCEL);
cancelIntent.putExtra(CancelBroadcast.CANCEL_ID, data.id);
PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(context, 2, cancelIntent, PendingIntent.FLAG_CANCEL_CURRENT);
if(snoozePendingIntent == null) System.out.println("snooze null");
if(cancelPendingIntent == null) System.out.println("cancel null");
// TODO: get channel from arguments
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(data.title)
.setContentText(data.message)
.setContentIntent(tapPendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.addAction(R.drawable.notification_icon, "Snooze", snoozePendingIntent)
.addAction(R.drawable.notification_icon, "Cancel", cancelPendingIntent)
.setAutoCancel(true);
return builder;
}
Код для получения CancelBroadcast
public class CancelBroadcast extends BroadcastReceiver {
public static final String CANCEL_ID = "com.example.my_app.cancel_id";
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("received");
Bundle data = intent.getExtras();
int id = data.getInt(CANCEL_ID);
FlutterNotificationsPlugin.cancelById(context, id);
}
}
Как было сказано ранее, я ожидаю onReceive()
, что будет выполнен метод, в который записывается строка stdout
, когда я нажимаю кнопку «Повтор» в уведомлении (которое отображается нормально). Это происходит при запуске app
, но не при запуске main.dart
.
Комментарии:
1. Как вы заставили это работать?
2. Я этого не сделал. Проблема заключалась в компиляции. Я скомпилировал код для конкретной платформы отдельно, каким-то образом создав несоответствие между кодом flutter и java. Чистая перестройка решила все мои проблемы.