フォアグラウンド サービス

フォアグラウンド サービスは、バインドされたサービスまたは開始されたサービスの特殊な種類です。 サービスは、ユーザーがアクティブに認識する必要があるタスクを実行することがあります。これらのサービスは "フォアグラウンド サービス" と呼ばれます。 フォアグラウンド サービスの例として、運転中または歩行中のユーザーに道案内を提供するアプリがあります。 アプリがバックグラウンドにある場合でも、サービスが適切に動作するのに十分なリソースを備え、ユーザーがアプリにすばやく簡単にアクセスできる方法が用意されている必要があります。 Android アプリの場合、これは、フォアグラウンド サービスが "通常の" サービスよりも高い優先順位を得る必要があることを意味し、フォアグラウンド サービスは、サービスが実行されている限り Android に表示される Notification を提供する必要があります。

フォアグラウンド サービスを開始するには、Android にサービスの開始を指示する意図をアプリがディスパッチする必要があります。 その後、サービスはそれ自体を Android のフォアグラウンド サービスとして登録する必要があります。 Android 8.0 (またはそれ以降) で実行されるアプリは、Context.StartForegroundService メソッドを使用してサービスを開始する必要があります。一方、以前のバージョンの Android を使用しているデバイスで実行されるアプリは、Context.StartService を使用する必要があります

この C# 拡張メソッドは、フォアグラウンド サービスを開始する方法の例です。 Android 8.0 以降では、StartForegroundService メソッドが使用され、それ以外の場合は以前の StartService メソッドが使用されます。

public static void StartForegroundServiceCompat<T>(this Context context, Bundle args = null) where T : Service
{
    var intent = new Intent(context, typeof(T));
    if (args != null) 
    {
        intent.PutExtras(args);
    }

    if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
    {
        context.StartForegroundService(intent);
    }
    else
    {
        context.StartService(intent);
    }
}

フォアグラウンド サービスとしての登録

フォアグラウンド サービスは、開始後に StartForeground を呼び出して、それ自体を Android に登録する必要があります。 サービスが Service.StartForegroundService メソッドで開始されても、それ自体が登録されない場合、Android はサービスを停止し、無応答フラグをアプリに設定します。

StartForeground は 2 つのパラメーターを受け取ります。どちらも必須です。

  • サービスを識別するための、アプリケーション内で一意の整数値。
  • サービスが実行されている限り Android のステータス バーに表示される Notification オブジェクト。

Android では、サービスが実行されている限り、ステータス バーに通知が表示されます。 この通知は、少なくとも、サービスが実行されていることをユーザーに視覚的に示します。 理想的には、通知は、アプリケーションへのショートカットをユーザーに提供するか、場合によってはアプリケーションを制御するためのアクション ボタンを提供する必要があります。 その例として、音楽プレーヤーがあります。表示される通知には、音楽を一時停止/再生するボタン、前の曲に戻るボタン、または次の曲にスキップするボタンなどがあります。

このコード スニペットは、サービスをフォアグラウンド サービスとして登録する例です。

// This is any integer value unique to the application.
public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    // Code not directly related to publishing the notification has been omitted for clarity.
    // Normally, this method would hold the code to be run when the service is started.

    var notification = new Notification.Builder(this)
        .SetContentTitle(Resources.GetString(Resource.String.app_name))
        .SetContentText(Resources.GetString(Resource.String.notification_text))
        .SetSmallIcon(Resource.Drawable.ic_stat_name)
        .SetContentIntent(BuildIntentToShowMainActivity())
        .SetOngoing(true)
        .AddAction(BuildRestartTimerAction())
        .AddAction(BuildStopServiceAction())
        .Build();

    // Enlist this instance of the service as a foreground service
    StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
}

前の通知には、次のようなステータス バーの通知が表示されます。

Image showing the notification in the status bar

このスクリーンショットは、通知トレイに展開された通知と、ユーザーがサービスを制御できる 2 つのアクションを示しています。

Image showing the expanded notification

通知の詳細については、「Android 通知」ガイドの「ローカル通知」セクションを参照してください。

フォアグラウンド サービスとしての登録の解除

サービスは、StopForeground メソッドを呼び出すことで、それ自体をフォアグラウンド サービスとしてのリストから削除できます。 StopForeground はサービスを停止しませんが、通知アイコンを削除し、必要に応じてこのサービスをシャットダウンできることを Android に通知します。

表示されるステータス バーの通知は、メソッドに true を渡して削除することもできます。

StopForeground(true);

サービスが StopSelf または StopService の呼び出しで停止した場合、ステータス バーの通知は削除されます。