Я пишу действительно большое приложение с большим количеством мероприятий. У меня есть один класс, работающий в фоновом режиме, который проверяет, есть ли какие-либо изменения на сервере и выполняет соответствующие действия. Одним из действий является отправка пользователю уведомления о входе, выходе и т. Д. Сотрудника. На уведомления такого типа можно нажать, и они должны открыть контактную страницу сотрудника PeopleSingleScene_Activity
, и это работает, как и ожидалось. Однако, когда я нажимаю кнопку «Назад», приложение закрывается (никаких родительских действий).
Код для создания уведомления с ожидающим намерением выглядит следующим образом:
public void sendEmployeeWorkNotification(String ticker, String title, String text, String loc, int employee_id) {
PendingIntent pendingIntent;
Intent intent;
Context currentContext = G.context;
if (loc.equals("LOC")) {
intent = new Intent(currentContext, PeopleSingleScene_Activity.class);
intent.putExtra("people_id", employee_id);
pendingIntent = PendingIntent.getActivity(currentContext, 0, intent, 0);
} else {
//some other actions
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(currentContext, CHANNEL_ID)
.setSmallIcon(R.drawable.vector_notif)
.setTicker(ticker)
.setContentTitle(title)
.setContentText(text)
.setColor(ContextCompat.getColor(currentContext, R.color.rcOutcome))
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(text))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(currentContext);
notificationManager.notify(G.simpleMessageCounter, builder.build());
simpleSong(R.raw.notificationsimple);
G.simpleMessageCounter++;
}
G.context
- последний открытый контекст действия ... Это статическая переменная в глобальном классе G. Я создаю ее таким образом:
public class SomeActivityClass extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_layout);
G.context = this;
....
}
....
}
Я также пытался с контекстом из моего класса App для получения строковых значений или чего-то еще с контекстом в классах без действий ...
public class App extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
public static String getStr(int resid) {
return mContext.getResources().getString(resid);
}
}
Когда я использую этот контекст из App.getContext();
, результат такой же, после нажатия кнопки «Назад» приложение закрывается.
Вопрос: есть ли проблема с контекстом для создания ожидающего намерения и уведомления, или есть проблема с флагами создания намерения? Я перепробовал множество комбинаций с контекстами и флагами, но ни одна из них не работает. И я не могу написать (или, может быть, я не знаю) несколько слушателей по каждому виду деятельности, чтобы прослушать событие такого рода и открыть для себя новое намерение. Там будет более 50 мероприятий ...
2 ответа
Наконец-то нашел решение, благодаря моему приятелю Мильяну.
При создании pendingIntent просто необходим правильный флаг. Так что вместо
pendingIntent = PendingIntent.getActivity(currentContext, 0, intent, 0);
Просто поставь флаг
pendingIntent = PendingIntent.getActivity(currentContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
И это работает регулярно. Я могу вернуться к предыдущему действию после отображения действия, инициированного нажатием уведомления.
Вы должны сделать режим запуска для этого действия одним верхом <activity android:launchMode="singleTop" />
Подробнее о режиме запуска активности Android
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.