自定义通知栏图标?不是很简单么。自定义布局都不在话下!

是的,有xml布局文件当然一切都很简单,如果不给你布局文件用呢?


听我慢慢道来!

首先怎么创建一个通知呢?


1.new 一个

Notification n = new Notification(android.R.drawable.ic_menu_share, null, System.currentTimeMillis());

参数:图标 ID,发送到状态栏瞬间的文字,当前时间

2.设置详细信息:标题、内容、intent

PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);n.setLatestEventInfo(this, "早上好!", "今天是个晴朗的天气!", contentIntent);

3.发送到通知栏

NotificationManager mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mNM.notify(1001, n);

这样就完成了一个通知的展示,很简单!


我们来看看 n.setLatestEventInfo 干了些什么呢

    public void setLatestEventInfo(Context context,            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {        // TODO: rewrite this to use Builder        RemoteViews contentView = new RemoteViews(context.getPackageName(),                R.layout.notification_template_base);        if (this.icon != 0) {            contentView.setImageViewResource(R.id.icon, this.icon);        }        if (priority < PRIORITY_LOW) {            contentView.setInt(R.id.icon,                    "setBackgroundResource", R.drawable.notification_template_icon_low_bg);            contentView.setInt(R.id.status_bar_latest_event_content,                    "setBackgroundResource", R.drawable.notification_bg_low);        }        if (contentTitle != null) {            contentView.setTextViewText(R.id.title, contentTitle);        }        if (contentText != null) {            contentView.setTextViewText(R.id.text, contentText);        }        if (this.when != 0) {            contentView.setViewVisibility(R.id.time, View.VISIBLE);            contentView.setLong(R.id.time, "setTime", when);        }        if (this.number != 0) {            NumberFormat f = NumberFormat.getIntegerInstance();            contentView.setTextViewText(R.id.info, f.format(this.number));        }        this.contentView = contentView;        this.contentIntent = contentIntent;    }
可以看到,他实际上就是使用系统默认布局为我们创建了一个 RemoteViews , RemoteViews 是专门用来跨进程显示的 View ,详情参考官方文档:http://developer.android.com/intl/zh-cn/reference/android/widget/RemoteViews.html


看这句:

contentView.setImageViewResource(R.id.icon, this.icon);
其实就是设置图标了:

参数1:用来显示图标的 ImageView 的 id

参数2:图标 id

但是还有一个这样的方法:

RemoteViews.setImageViewBitmap(int viewId, Bitmap bitmap)

用 Bitmap 来设置图标。

而 Notifycation 里面有个参数:Notification.contentView,仔细看,setLastestEventInfo 方法里创建的 RemoteViews 就是他,所以你知道该怎么做了!

但是这里还有一个问题?R.id.icon 怎么获取,这个东西其实在com.android.internal.R 这个里面,但是这个类我们访问不到怎么办?

反射呗, Java 的反射可谓是万能啊,啥都可以拿到只要他在。

Class<?> clazz = Class.forName("com.android.internal.R$id");Field field = clazz.getField("icon");field.setAccessible(true);int id_icon = field.getInt(null);


n.setLatestEventInfo(context, title, msg, contentIntent);n.flags |= Notification.FLAG_AUTO_CANCEL;if(n.contentView != null && icon != null){n.contentView.setImageViewBitmap(id_icon, icon);}
发出通知,下拉通知栏看看,图标是不是变了^_^

此外这里还有一个小细节,就是你 new Notifycation() 是传进去的图标会作为状态栏的小图标,小图标尺寸在 hdpi 下面放 32x32 的就可以


所以你可以第一次传小图标,然后通过 contentView 设置大图标,这样就OK了



更多相关文章

  1. Android--隐藏状态栏图标
  2. Android中SimpleAdapter,ArrayAdapter和BaseAdapter详解
  3. Android(安卓)通过系统使用NotificationListenerService 监听各
  4. RelativeLayout相对布局介绍及属性介绍
  5. Android(安卓)使用MotionLayout实现动画效果
  6. Android实现一个通用的PopupWindow
  7. 高德地图实现Marker模拟gif动画
  8. Android(安卓)launcher加载流程
  9. 布局及视图(一)

随机推荐

  1. android 布局文件属性说明
  2. Android面试必备知识点总结
  3. Android安卓51个开源代码
  4. android 问题总结
  5. Android(安卓)总结
  6. 上百个Android开源项目分享
  7. android之组件1
  8. android 环境搭建 windows 和linux 环境
  9. 自定义ListView中的分割线
  10. actionbar设置menu以及获取item实例