Уведомление о андроиде в фоновом режиме, если приложение закрыто?
Я пытаюсь отобразить уведомление в панели уведомлений Android, даже если мое приложение закрыто.
Я пробовал поиск, но мне не повезло найти помощь.
Примером этого является новостное приложение. Даже если экран телефона выключен или приложение новостей закрыто, оно все равно может отправлять уведомление о последних новостях и появляться в панели уведомлений.
Как я могу это сделать в своем приложении?
Ответы
Ответ 1
Вам нужно создать Сервис, который обрабатывает ваши новости и показывает уведомления, когда он знает, что это новые новости (Service Doc).
Служба будет работать в фоновом режиме, даже если ваше приложение будет закрыто.
Для запуска службы в фоновом режиме после завершения фазы загрузки вам понадобится BroadcastReciever. (Запустить сервис после загрузки).
Служба будет создавать ваши уведомления и отправлять их через NotificationManager.
EDIT: Эта статья может удовлетворить ваши потребности
Ответ 2
Выбранный ответ по-прежнему правильный, но только для устройств под управлением Android 7 версий и ниже. Начиная с Android 8+, у вас больше не может быть запущена служба в фоновом режиме, пока ваше приложение находится в режиме ожидания/закрыто.
Итак, теперь все зависит от того, как вы настроили свои уведомления с вашего сервера GCM/FCM. Убедитесь, что вы установили наивысший приоритет. Если ваше приложение работает в фоновом режиме или просто не активно и вы отправляете только данные уведомлений, система обработает ваше уведомление и отправит его в панель уведомлений.
Ответ 3
Я использовал этот ответ для написания сервиса, а в качестве примера вам нужно вызвать ShowNotificationIntentService.startActionShow(getApplicationContext())
внутри одного из ваших действий:
import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
public class ShowNotificationIntentService extends IntentService {
private static final String ACTION_SHOW_NOTIFICATION = "my.app.service.action.show";
private static final String ACTION_HIDE_NOTIFICATION = "my.app.service.action.hide";
public ShowNotificationIntentService() {
super("ShowNotificationIntentService");
}
public static void startActionShow(Context context) {
Intent intent = new Intent(context, ShowNotificationIntentService.class);
intent.setAction(ACTION_SHOW_NOTIFICATION);
context.startService(intent);
}
public static void startActionHide(Context context) {
Intent intent = new Intent(context, ShowNotificationIntentService.class);
intent.setAction(ACTION_HIDE_NOTIFICATION);
context.startService(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_SHOW_NOTIFICATION.equals(action)) {
handleActionShow();
} else if (ACTION_HIDE_NOTIFICATION.equals(action)) {
handleActionHide();
}
}
}
private void handleActionShow() {
showStatusBarIcon(ShowNotificationIntentService.this);
}
private void handleActionHide() {
hideStatusBarIcon(ShowNotificationIntentService.this);
}
public static void showStatusBarIcon(Context ctx) {
Context context = ctx;
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx)
.setContentTitle(ctx.getString(R.string.notification_message))
.setSmallIcon(R.drawable.ic_notification_icon)
.setOngoing(true);
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(context, STATUS_ICON_REQUEST_CODE, intent, 0);
builder.setContentIntent(pIntent);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notif = builder.build();
notif.flags |= Notification.FLAG_ONGOING_EVENT;
mNotificationManager.notify(STATUS_ICON_REQUEST_CODE, notif);
}
}