web-dev-qa-db-ja.com

androidアプリが閉じた場合のバックグラウンドでの通知?

アプリケーションが閉じている場合でも、Android通知バーに通知を表示しようとしています。

私は検索を試みましたが、助けを見つけることができませんでした。

この例は、ニュースアプリケーションです。電話画面がオフになっている場合や、ニュースアプリケーションが閉じている場合でも、最近のニュースの通知を送信して、通知バーに表示させることができます。

自分のアプリケーションでこれを行うにはどうすればよいですか?

16
Jack K Fouani

あなたのニュースを処理し、それが新しいニュースであることを知ったときに通知を表示するServiceを構築する必要があります( Service Doc )。アプリケーションが閉じていても、サービスはバックグラウンドで実行されます。ブートフェーズの完了後にサービスをバックグラウンドで実行するには、BroadcastRecieverが必要です。 ( 起動後にサービスを開始 )。

サービスは通知を作成し、それらを NotificationManager を介して送信します。

編集: この記事 はあなたのニーズに合うかもしれません

16
Idipaolo

選択した答えはまだ正しいですが、Android 7バージョン以下を実行しているデバイスのみが対象です。Android 8+以降、サービスを実行できなくなりますアプリがアイドル/閉じている間、バックグラウンドで。
つまり、GCM/FCMサーバーからの通知の設定方法によって異なります。必ず最高の優先度に設定してください。アプリがバックグラウンドにあるか、アクティブでないだけで、通知データのみを送信する場合、システムは通知を処理して通知トレイに送信します。

3
Bamerza

私は this answer を使用してサービスを記述しました。例として、アクティビティの1つの中で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);
    }
}
0
VSB