Уведомление о андроиде в фоновом режиме, если приложение закрыто?

Я пытаюсь отобразить уведомление в панели уведомлений 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);
    }
}