カスタムNotificationのBackgroundカラーについて

上記のように、ICS端末で真っ白なNotificationが表示されてしまう場合があります。

この現象が発生する条件は、Notification登録時に以下の指定を行っている場合です。

  • setContentでRemoteViewsをセット
  • PackageのtargetSdkVersionが"9"未満の場合

現象発生の原因

Android-4.0.3_r1のframeworksのソースを見てましょう。

\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone
- PhoneStatusBar.java

    private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) {
        StatusBarNotification sbn = entry.notification;
        RemoteViews remoteViews = sbn.notification.contentView;
        if (remoteViews == null) {
            return false;
        }
                     :
                     :
                     :
        applyLegacyRowBackground(sbn, content);

        entry.row = row;
        entry.content = content;
        entry.expanded = expanded;
        entry.largeIcon = largeIcon;

        return true;
    }

    void applyLegacyRowBackground(StatusBarNotification sbn, View content) {
        if (sbn.notification.contentView.getLayoutId() !=
                com.android.internal.R.layout.status_bar_latest_event_content) {
            int version = 0;
            try {
                ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.pkg, 0);
                version = info.targetSdkVersion;
            } catch (NameNotFoundException ex) {
                Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.pkg, ex);
            }
            if (version > 0 && version < Build.VERSION_CODES.GINGERBREAD) {
                content.setBackgroundResource(R.drawable.notification_row_legacy_bg);
            } else {
                content.setBackgroundResource(R.drawable.notification_row_bg);
            }
        }
    }

NotificationのBackgroundカラーをセットしている判定文をチェック!!
なんとBuild.VERSION_CODES.GINGERBREAD(APILevel9)以前と以降で値が異なるのです。


ということで、カスタムNotificationを使用しているFroyo向アプリを公開している方は要注意です。