できるだけ小さな場所を必要とするForegroundService
の継続的な通知を希望します。 「Androidシステム-このデバイスをUSB充電する」スタイルが気に入っていますが、これを達成する方法の例を見つけることができません。
誰かが私を正しい方向に向けることができますか?
チャネルに重要度IMPORTANCE_MIN
が割り当てられている場合、スタイルは通知に与えられます。
IMPORTANCE_MIN
の通知にForegroundService
で使用するスタイルに組み込まれたAndroidを使用する方法はないようです。
IMPORTANCE_MIN
の説明は次のとおりです。
通知の最小重要度:フォールドの下の日陰でのみ表示されます。これはService.startForegroundで使用しないでください。フォアグラウンドサービスはユーザーが気にするものであるため、通知を最小重要度としてマークする意味論的な意味をなさないためです。 Android version Build.VERSION_CODES.Oの時点でこれを行うと、バックグラウンドで実行されているアプリに関する優先度の高い通知が表示されます。
元の質問に答えるには:
Android OにForegroundService
の単一行の継続的な通知を取得する組み込みの方法はないようです。カスタムデザインを追加してみることができますが、通知用にさまざまなデザインがありますが、そのソリューションはほとんど良いものではありません。
ただし、希望はあります:)
On Android PIMPORTANCE_LOW
のNotificationChannel
の優先度がPRIORITY_LOW
isForegroundService
であっても単一行に圧縮されます。うん!
充電通知のようなコンパクトな単一行の通知を表示するには、IMPORTANCE_MINを優先して_Notification Channel
_を作成する必要があります。
_@TargetApi(Build.VERSION_CODES.O)
private static void createFgServiceChannel(Context context) {
NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannel(channel);
}
_
そして、そのような継続的な通知を作成します。
_public static Notification getServiceNotification(Context context) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id");
mBuilder.setContentTitle("One line text");
mBuilder.setSmallIcon(R.drawable.ic_notification);
mBuilder.setProgress(0, 0, true);
mBuilder.setOngoing(true);
return mBuilder.build();
}
_
[〜#〜] note [〜#〜]
IntentService
の代わりにService
を使用してテストしたことに注意してください。また、15秒のThread.sleep()
の設定を確認したところ、IntentService
が停止するまで通知は完全に表示されます。
画像がいくつかあります(一部のテキストはスペイン語ですが、画像はまだ有用だと思います):
下にドラッグして通知を開くと、次のように表示されます。
[〜#〜] extra [〜#〜]
Androidシステムは、バッテリーを使用しているすべてのアプリ(継続的なサービスを備えたアプリ)を示す通知を表示します。充電通知など。
これをみて:
この通知を長押しして、すべてのカテゴリを選択します。
そして、重要度を低に設定します。
次回、この「バッテリー消費」通知は充電通知として表示されます。
通知の優先度を最小に、通知チャネルの重要度を最小に設定し、通知チャネルバッジの表示を無効にする必要があります。
ここに私がそれをする方法のサンプルがあります。参考のために完全な通知も作成しました
private static final int MYAPP_NOTIFICATION_ID= -793531;
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String CHANNEL_ID = "myapp_ongoing";
CharSequence name = context.getString(R.string.channel_name_ongoing);
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN);
channel.setShowBadge(false);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_stat_notification_add_reminder)
.setContentTitle(context.getString(R.string.app_name))
.setContentText(context.getString(R.string.create_new))
.setOngoing(true).setWhen(0)
.setChannelId(CHANNEL_ID)
.setPriority(NotificationCompat.PRIORITY_MIN);
// Creates an intent for clicking on notification
Intent resultIntent = new Intent(context, MyActivity.class);
...
// The stack builder object will contain an artificial back stack
// for the
// started Activity.
// This ensures that navigating backward from the Activity leads out
// of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MyActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build());
拡張可能な通知
デフォルトでは、通知のテキストコンテンツは1行に収まるように切り捨てられます。通知を長くしたい場合は、追加のテンプレートを適用することにより、拡大可能なより大きなテキスト領域を有効にできます。
さらに、Android 4.1は拡張可能な通知をサポートしています。通常の通知ビューに加えて、通知が展開されたときに表示される大きなビューを定義できます。大きなビューで使用する3つのスタイルがあります:大きな画像スタイル、大きなテキストスタイル、受信ボックススタイル。次のコードは、最大256 dpを使用できるBigTextStyle()の使用方法を示しています。
たとえば:
String longText = "...";
Notification noti = new Notification.Builder(this)
.....
.....
.....
.setStyle(new Notification.BigTextStyle().bigText(longText))
次のような空のカスタムビューを作成して、フォアグラウンドサービス通知のサイズを小さくしました。
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
</LinearLayout>
そして、次のような通知を作成します。
RemoteViews notifiactionCollapsed = new RemoteViews(getPackageName(),R.layout.notification_collapsed);
Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
.setSmallIcon(R.drawable.eq_icon)
.setCustomContentView(notifiactionCollapsed)
.setStyle(new NotificationCompat.DecoratedCustomViewStyle())
.setShowWhen(false)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setOngoing(true)
.setVisibility(NotificationCompat.VISIBILITY_SECRET)
.build();
startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
notification);
これは通知の高さを減らすのに役立ちますが、それでも通知アイコンを非表示にする方法がわかりません。