• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

android 随手记 自定义广播通知栏

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

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


听我慢慢道来!

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


1.new 一个

 

[java] view plain copy
  1. Notification n = new Notification(android.R.drawable.ic_menu_share, null, System.currentTimeMillis());  


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

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

 

[java] view plain copy
  1. PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
  2. n.setLatestEventInfo(this, "早上好!", "今天是个晴朗的天气!", contentIntent);  


3.发送到通知栏

 

[java] view plain copy
  1. NotificationManager mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
  2. mNM.notify(1001, n);  


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


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

 

[java] view plain copy
  1. public void setLatestEventInfo(Context context,  
  2.         CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {  
  3.     // TODO: rewrite this to use Builder  
  4.     RemoteViews contentView = new RemoteViews(context.getPackageName(),  
  5.             R.layout.notification_template_base);  
  6.     if (this.icon != 0) {  
  7.         contentView.setImageViewResource(R.id.icon, this.icon);  
  8.     }  
  9.     if (priority < PRIORITY_LOW) {  
  10.         contentView.setInt(R.id.icon,  
  11.                 "setBackgroundResource", R.drawable.notification_template_icon_low_bg);  
  12.         contentView.setInt(R.id.status_bar_latest_event_content,  
  13.                 "setBackgroundResource", R.drawable.notification_bg_low);  
  14.     }  
  15.     if (contentTitle != null) {  
  16.         contentView.setTextViewText(R.id.title, contentTitle);  
  17.     }  
  18.     if (contentText != null) {  
  19.         contentView.setTextViewText(R.id.text, contentText);  
  20.     }  
  21.     if (this.when != 0) {  
  22.         contentView.setViewVisibility(R.id.time, View.VISIBLE);  
  23.         contentView.setLong(R.id.time, "setTime", when);  
  24.     }  
  25.     if (this.number != 0) {  
  26.         NumberFormat f = NumberFormat.getIntegerInstance();  
  27.         contentView.setTextViewText(R.id.info, f.format(this.number));  
  28.     }  
  29.   
  30.     this.contentView = contentView;  
  31.     this.contentIntent = contentIntent;  
  32. }  

可以看到,他实际上就是使用系统默认布局为我们创建了一个 RemoteViews , RemoteViews 是专门用来跨进程显示的 View ,详情参考官方文档:http://developer.android.com/intl/zh-cn/reference/android/widget/RemoteViews.html


看这句:

[java] view plain copy
  1. contentView.setImageViewResource(R.id.icon, this.icon);  

其实就是设置图标了:

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

    参数2:图标 id

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

[java] view plain copy
  1. RemoteViews.setImageViewBitmap(int viewId, Bitmap bitmap)  

用 Bitmap 来设置图标。

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

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

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

 

[java] view plain copy
  1. Class<?> clazz = Class.forName("com.android.internal.R$id");  
  2.               
  3.             Field field = clazz.getField("icon");  
  4.             field.setAccessible(true);  
  5.             id_icon = field.getInt(null);  


 

[java] view plain copy
  1. n.setLatestEventInfo(context, title, msg, contentIntent);  
  2.         n.flags |= Notification.FLAG_AUTO_CANCEL;  
  3.           
  4.         if(n.contentView != null && icon != null){  
  5.             n.contentView.setImageViewBitmap(InternalID.id_icon, icon);  
  6.         }  

发出通知,下拉通知栏看看,图标是不是变了^_^

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


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


posted @ 2013-09-26 22:39  Class Xman  阅读(494)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3