モバイル通知を統合する

Android API レベル 26 以降、Android API 呼び出しでは フォアグラウンド サービスの場合。この要件は、Google Chat のメッセージで システム リソースに過剰な負荷をかける可能性のあるサービス 特にそうですこの要件により、潜在的な問題が発生します。つまり、アプリが 通知が慎重に管理されないため、 すべてのサービスで共有する場合、複数の永続ストレージ 非表示にできない通知が原因で、アクティブ リストが 通知を受け取れます。

Navigation API などの SDK を使用する場合、この問題はより困難になります。 フォアグラウンド サービスを実行する SDK があります。 永続的な通知を個別に管理できるため、統合が難しくなります。 これらの問題に対処するため、Navigation SDK v1.11 では、 SDK 内を含め、アプリ内全体で永続的な通知を管理できます。

永続的な通知を統合する

コンポーネント

フォアグラウンド サービス マネージャーは Android フォアグラウンドのラッパーを提供する 永続通知クラスが含まれています。このラッパーのメイン 通知 ID の再利用を必須にして、通知が確実に すべてのフォアグラウンド サービス間で共有されます。


Navigation SDK には、パイプラインを初期化および取得するための静的メソッドが ForegroundServiceManager シングルトン。このシングルトンは初期化のみ行うことができます 一度使用する必要がありますそのため、 初期化呼び出し(initForegroundServiceManagerMessageAndIntent() または initForegroundServiceManagerProvider() など)が含まれている場合は、 try-catch ブロックを使用してそのパスを再入力した場合に備え、Navigation SDK いずれかのメソッドを複数回呼び出すと、ランタイム例外がスローされます。 まず、ForegroundServiceManager への参照をすべてクリアして、次のコマンドで呼び出します。 後続の各呼び出しの前に clearForegroundServiceManager() を返します。

initForegroundServiceManagerMessageAndIntent() の 4 つのパラメータは次のとおりです。 applicationnotificationIddefaultMessageresumeIntent。もし 最後の 3 つのパラメータが null の場合、通知は標準の Navigation SDK の通知。他の前景は非表示にできます この通知の背後にあるアプリのサービスによって異なります。notificationId パラメータ 通知に使用する通知 ID を指定します。もし null の場合は任意の値が使用されます。これを明示的に設定することで、特定のリソースに 他の通知(別の SDK の通知など)と競合する場合。「 defaultMessage は、システムが正常に稼働していないときに表示される文字列です。 説明します。resumeIntent は、通知を受け取ったときに呼び出されるインテントです。 表示されます。resumeIntent が null の場合は、通知をクリックする は無視されます。

initForegroundServiceManagerProvider() の 3 つのパラメータは次のとおりです。 applicationnotificationIdnotificationProvider。ファイナル 2 つのパラメータが null の場合、通知は標準の Navigation SDK である 通知を受け取ります。notificationId パラメータは、通知 ID を指定します。 を使用します。null の場合は、任意の値が 分析できます明示的に設定することで、他のリソースとの競合を回避する 通知を受信できます。notificationProvider が 設定されている場合、プロバイダは常に レンダリングする通知を生成します。

Navigation SDK の getForegroundServiceManager() メソッドが、 フォアグラウンド サービス マネージャー シングルトン。まだ生成していない場合は これは、initForegroundServiceManagerMessageAndIntent() を呼び出す場合と同等です。 に null パラメータを含む notificationIddefaultMessageresumeIntent

ForegroundServiceManager には、3 つのシンプルなメソッドがあります。最初の 2 つは サービスをフォアグラウンドに移す、またはフォアグラウンドから外す 作成されたサービス内に配置されます。これらの方法を使用すると、 共有の永続通知に関連付けられます。ファイナル メソッド、updateNotification() は、通知を受け取ったマネージャーにフラグを立てます。 再レンダリングする必要があります。

永続的な共有通知を完全に制御する必要がある場合は、 API には、サービス アカウントを定義するために NotificationContentProvider インターフェースが 通知プロバイダ: 通知を受信するための単一のメソッドが 現在のコンテンツで置き換えられます基本クラスも用意されています。 プロバイダを定義する際に使用できます。基本クラスのメインの 名前を指定せずに updateNotification() を呼び出す方法が ForegroundServiceManager にアクセスする必要があります。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 にはターンバイターン方式の簡単な取得手段は用意されていない 通知プロバイダが通知に挿入する可能性がある情報です。