【威哥说】官方文档是比较准确的,但是他并一定完全是符合我们实际的应用的。所以,自然的就会让初学者坠入一些“陷阱”,今天我们就一起看看官方文档里面为初学者埋了多少“坑”。
我们知道自定义notification要使用RemoteViews,相信做过自定义notification的都很清楚,这是一个在其它进程中显示的View。可以改变RemoteViews里面的子View的值。但是这样会有一些坑,本文就来带大家总结下有哪些坑。
public void musicNotificationClick(View v){
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setOngoing(true);//设置 通知为常驻通知
RemoteViews view = new RemoteViews(getPackageName(),R.layout.custom_layout);
view.setTextViewText(R.id.textView_songName,"我是一匹孤独的狼");
view.setImageViewBitmap(R.id.imageView,BitmapFactory.decodeResource(getResources(),android.R.drawable.ic_media_play));
// view.setOnClickPendingIntent(); //设置 按钮的事件
builder.setContent(view);
Notification n = builder.build();
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NID_4,n);
}
设置不同区域的点击PendingIntent
默认的Notification只能通过setContentIntent设置整体的点击事件。不过通过RemoteViews我们可以设置不同地方不同的点击事件,当然这里的事件指的是PendingIntent。如下,设置了点击R.id.notice_view_type_0打开一个Activity,而点击R.id.close_iv会发出一个广播,可以通过这个广播的广播接收器来做一些事情,如这里是关闭当前的Notification。另外还可以打开一个Service。
PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.notice_view_type_0, pendingIntent); int requestCode1 = (int) SystemClock.uptimeMillis(); Intent intent1 = new Intent(ACTION_CLOSE_NOTICE); intent1.putExtra(NOTICE_ID_KEY, NOTICE_ID_TYPE_0); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, requestCode1, intent1, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.close_iv, pendingIntent1);
设置通知的自定义View
以上我们得到了自定义的RemoteViews。通过下面这段代码就能生成自定义View的Notification,注意这里使用了setContent()方法。这是网上自定义Notification都会使用的方法。
Notification notification = new NotificationCompat.Builder(context).setContent(remoteViews).build();
但是它会有一个问题。
通过setContent()方法获得的Notification是定高的。如果View的高度比默认高度要大的话,就有一部分显示不出来。
默认情况下通知高度为64dp,当然Rom不同可能会有些区别。一般文字在小于两行的情况下都是可以显示。
使用如下方法,可以适配内容的大小
NotificationCompat.Builder builder = new NotificationCompat.Builder(context); if(android.os.Build.VERSION.SDK_INT >= 16) { notification = builder.build(); notification.bigContentView = remoteViews; } notification.contentView = remoteViews;
注意:
这里我们需要明确一个我们很容易忽略的问题,那就是通知是可以展开和收起的。
在上面的代码中我们分别设置了bigContentView 这是展开的自定义视图,而contentView则是收起时的视图。
bigContentView是在sdk16时引入的,所以需要判断一下。如果小于sdk16则只能定高了。
bigContentView 的最大高度是100dp。
bigContentView和contentView的设置不能调转顺序,亲测这样会让contentView不显示。
.
【更多精彩内容】