やりたいこと
常駐するサービスでForeground属性を使うため、Notificationを指定している。
ステータスバーへのアイコン表示は目立つため、できるなら消したい。
以前は空のNotificationインスタンスを渡すと、Foreground属性を指定していても通知領域には表示されなかった。
最近のAndroidだと、空のnotificationをForeground属性の指定に利用するとシステムが自動生成するnotificationが表示される。(Nexus5で確認)
この記事では、通知欄からNotificationを消すことはできないが、ステータスバーへの通知は見えないようにする方法を紹介します。
(ユーザが嫌がるのはステータスバーに常に表示されてることだと思う...)
やること
実現するためにやることは2つです。
- 通知アイコンを透明にする
- ステータスバー上の表示位置を右側によせる
通知アイコンを透明にする
これは簡単でNotification.Builder#setSmallIcon()に透明なdrawableを渡せばいいです。
res/drawable/ic_stat_transparent.xml
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#00000000" >
</color>
このままだと通知欄を展開した時のアイコンも透明のままなので、ランチャーアイコンなどのBitmapをNotification.Builder#setLargeIcon()で指定します。
Drawable largeIconDrawable = getResources().getDrawable(R.drawable.ic_launcher);
Bitmap largeIconBitmap = ((BitmapDrawable)largeIconDrawable).getBitmap();
notificationBuilder.setLargeIcon(largeIconBitmap);
ステータスバー上の表示位置を右側によせる
ステータスバー上のアイコンの位置はAPI 16から用意されているNotificationのPriority指定である程度操作することができます。
Notification.Builder#setPriority(int pri)で設定できます。
用意されている定数は
PRIORITY_MAX = 2
PRIORITY_HIGH = 1
PRIORITY_DEFAULT = 0
PRIORITY_LOW = -1
PRIORITY_MIN = -2
の5つです。
数値が大きいほど左側に表示されるので、PRIORITY_MINを使います。
// API 16以上のみ指定する
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
notificationBuilder.setPriority(Notification.PRIORITY_MIN);
}
これで透明な通知アイコンが一番右側に表示されるので、通知アイコンが見えないようになりました。
通知欄からも消せたらベストだけど、さすがにそれはできなさそう...