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

フォアグラウンド サービスは、バインドされたサービスまたは開始されたサービスの特殊な種類です。 サービスは、ユーザーがアクティブに認識する必要があるタスクを実行する場合があり、これらのサービスは フォアグラウンド サービスと呼ばれます。 フォアグラウンド サービスの例として、運転中や歩行中にユーザーに道案内を提供するアプリがあります。 アプリがバックグラウンドにある場合でも、サービスが適切に動作するのに十分なリソースを備え、ユーザーがアプリにすばやく簡単にアクセスできる方法を持っている必要があります。 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);
    }
}

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

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

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

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

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);
}

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

ステータス バーの通知を示す画像 ステータス バー

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

展開された通知を示す画像 展開された通知

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

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

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

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

StopForeground(true);

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