Android API レベル 26 以降では、フォアグラウンド サービスに継続的な通知が必要です。この要件は、特にバッテリーなど、システム リソースを過度に消費する可能性があるサービスを非表示にすることを防ぐことを目的としています。この要件により、潜在的な問題が発生する可能性があります。複数のフォアグラウンド サービスを持つアプリで、通知がすべてのサービスで共有されるように慎重に管理されていない場合、閉じることができない通知が複数残り、通知のアクティブ リストが不要に混雑する可能性があります。
Navigation API などの SDK を使用する場合、この問題はより困難になります。
フォアグラウンド サービスを実行する SDK があります。
永続的な通知を個別に管理できるため、統合が難しくなります。
こうした問題に対処するため、Navigation SDK v1.11 では、SDK 内を含むアプリ全体で永続的な通知を管理するためのシンプルな API が導入されました。
コンポーネント
フォアグラウンド サービス マネージャーは Android フォアグラウンドのラッパーを提供する 永続通知クラスが含まれています。このラッパーの主な機能は、通知 ID の再利用を強制し、マネージャーを使用してすべてのフォアグラウンド サービスで通知を共有することです。
Navigation SDK には、パイプラインを初期化および取得するための静的メソッドが
ForegroundServiceManager
シングルトン。このシングルトンは、Navigation SDK の存続期間中に 1 回だけ初期化できます。したがって、初期化呼び出し(initForegroundServiceManagerMessageAndIntent()
または initForegroundServiceManagerProvider()
)のいずれかを使用する場合は、そのパスが再入力された場合に備えて、try-catch ブロックで囲む必要があります。どちらのメソッドも複数回呼び出すと、Navigation SDK はランタイム例外をスローします。ただし、最初に ForegroundServiceManager
へのすべての参照を消去し、その後の呼び出しの前に clearForegroundServiceManager()
を呼び出すと、例外はスローされません。
initForegroundServiceManagerMessageAndIntent()
の 4 つのパラメータは、application
、notificationId
、defaultMessage
、resumeIntent
です。もし
最後の 3 つのパラメータが null の場合、通知は標準の
Navigation SDK の通知。他の前景は非表示にできます
この通知の背後にあるアプリのサービスによって異なります。notificationId
パラメータには、通知に使用する通知 ID を指定します。もし
null の場合は任意の値が使用されます。別の SDK からの通知など、他の通知との競合を回避するために、明示的に設定できます。defaultMessage
は、システムがナビゲートしていないときに表示される文字列です。resumeIntent
は、通知がクリックされたときにトリガーされるインテントです。resumeIntent
が null の場合、通知のクリックは無視されます。
initForegroundServiceManagerProvider()
の 3 つのパラメータは、application
、notificationId
、notificationProvider
です。ファイナル
2 つのパラメータが null の場合、通知は標準の Navigation SDK である
通知を受け取ります。notificationId
パラメータは、通知 ID を指定します。
を使用します。null の場合は、任意の値が
分析できます他の SDK からの通知などの他の通知との競合を回避するために、明示的に設定できます。notificationProvider
が設定されている場合、レンダリングされる通知の生成は常にプロバイダが行います。
Navigation SDK の getForegroundServiceManager()
メソッドが、
フォアグラウンド サービス マネージャーのシングルトン。まだ生成していない場合は
これは、initForegroundServiceManagerMessageAndIntent()
を呼び出す場合と同等です。
に null パラメータを含む notificationId
、defaultMessage
、
resumeIntent
。
ForegroundServiceManager
には、3 つのシンプルなメソッドがあります。最初の 2 つは
サービスをフォアグラウンドに移す、またはフォアグラウンドから外す
作成されたサービス内に配置されます。これらの方法を使用すると、サービスが共有された永続通知に関連付けられます。ファイナル
メソッド、updateNotification()
は、通知を受け取ったマネージャーにフラグを立てます。
再レンダリングする必要があります。
永続的な共有通知を完全に制御する必要がある場合は、
API には、サービス アカウントを定義するために NotificationContentProvider
インターフェースが
通知プロバイダ: 通知を受信するための単一のメソッドが
現在のコンテンツで置き換えられますまた、プロバイダの定義に役立つ基本クラスも用意されています。ベースクラスの主な目的の 1 つは、ForegroundServiceManager
にアクセスしなくても updateNotification()
を呼び出す方法を提供することです。Pod 内の
新しい通知メッセージを受信するには、これを
内部メソッドを直接呼び出して、通知内のメッセージをレンダリングできます。
利用シナリオ
このセクションでは、共有永続ディスクの使用シナリオについて詳しく説明します。 通知を受け取れます。
- 他のアプリ フォアグラウンド サービスの永続的な通知を非表示にする
- 最も簡単なシナリオは、現在の動作を維持し、Navigation SDK 情報をレンダリングするためにのみ永続的な通知を使用することです。他のサービスは、フォアグラウンド サービス マネージャーの
startForeground()
メソッドとstopForeground()
メソッドを使用して、この通知の背後に隠すことができます。 - 他のアプリ フォアグラウンド サービスの永続的な通知は非表示にするが、 操作していないときに表示されるデフォルトのテキスト
- 2 番目に簡単なシナリオは、現在の動作を維持し、
Navigation SDK 情報をレンダリングするための永続通知
システムがナビゲート中でないときにシステムがナビゲーションを行っていない場合、
initForegroundServiceManagerMessageAndIntent()
に指定された文字列が表示されます。デフォルトの Navigation SDK 文字列には「Google マップ」と記載されています。この呼び出しを使用して、通知がクリックされたときにトリガーされる再開インテントを設定することもできます。 - 永続通知のレンダリングを完全に制御する
- 最後のシナリオでは、通知プロバイダを定義して作成する必要があります。
を使用して
ForegroundServiceManager
に渡します。initForegroundServiceManagerProvider()
。このオプションでは 通知の表示内容を完全に制御できますが、 Navigation SDK の通知情報を ターンバイターン方式のプロンプトが表示されなくなります。 通知を受け取ります。Google では、この情報を取得して通知に挿入する簡単な方法を提供していません。
通知プロバイダの例
次のコードサンプルは、単純な通知コンテンツ プロバイダを使用して通知を作成して返す方法を示しています。
public class NotificationContentProviderImpl
extends NotificationContentProviderBase
implements NotificationContentProvider {
private String channelId;
private Context context;
private String message;
/** Constructor */
public NotificationContentProviderImpl(Application application) {
super(application);
message = "-- uninitialized --";
channelId = null;
this.context = application;
}
/**
* Sets message to display in the notification. Calls updateNotification
* to display the message immediately.
*
* @param msg The message to display in the notification.
*/
public void setMessage(String msg) {
message = msg;
updateNotification();
}
/**
* Returns the notification as it should be rendered.
*/
@Override
public Notification getNotification() {
Notification notification;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
String channelId = getChannelId(context);
notification =
new Notification.Builder(context, channelId)
.setContentTitle("Notifications Demo")
.setStyle(new Notification.BigTextStyle()
.bigText(styledText))
.setSmallIcon(R.drawable.ic_navigation_white_24dp)
.setTicker("ticker text")
.build();
} else {
notification = new Notification.Builder(context)
.setContentTitle("Notification Demo")
.setContentText("testing non-O text")
.build();
}
return notification;
}
// Helper to set up a channel ID.
private String getChannelId(Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
if (channelId == null) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(
"default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("For navigation persistent notification.");
notificationManager.createNotificationChannel(channel);
channelId = channel.getId();
}
return channelId;
} else {
return "";
}
}
}
NotificationContentProviderImpl
を作成したら、
次のコードを使用して、Navigation SDK に接続します。
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
注意点と今後の計画
- 早めに
initForegroundServiceManagerMessageAndIntent()
またはinitForegroundServiceManagerProvider()
を呼び出して、 想定される使用シナリオが明確に定義されている。このメソッドは、 新しいナビゲータを作成します - コードパスが複数回入力された場合に備えて、
initForegroundServiceManagerMessageAndIntent()
またはinitForegroundServiceManagerProvider()
の呼び出しからの例外をキャッチしてください。Navigation SDK v2.0 では、このメソッドを複数回呼び出すと、ランタイム例外ではなくチェック例外がスローされます。 - スタイリング全体にわたって一貫したスタイルを実現するために、 ヘッダーのスタイル設定に一致する通知のライフタイム
- 通知プロバイダを定義する際に、ヘッドアップの動作を制御できる 優先度を設定します。
- Google にはターンバイターン方式の簡単な取得手段は用意されていない 通知プロバイダが通知に挿入する可能性がある情報です。