发表于: 2018-10-29 23:01:10
0 913
一、今天完成的事情
自定义Notification
需要用到RemoteViews来加载布局,自定义的Notification布局和普通布局一样,但需要注意的是它支持的布局和控件种类是有限的,如果使用了不支持的布局和控件运行时会报错。
具体实现
对布局中的控件添加点击事件或者更新自定义布局中的View不仅要用到Intent和PendingIntent,还需要用到RemoteVIews。在更新RemoteViews时,无法直接访问里面的View,而必须通过RemoteViews所提供的一系列方法来更新View。比如设置TextView的文本,要采用如下方式:
remoteViewsSilent.setTextViewText(R.id.tv_title, title);
其中setTextViewText的两个参数分别为TextView的Id和要设置的文本。
而设置ImageView的图片也不能直接访问ImageView,必须通过如下方式:
remoteViewsSilent.setImageViewResource(R.id.iv_cancel,
R.drawable.outline_delete_forever_black_24dp);
setImageViewResource的两个参数分别为ImageView的Id和要设置的图片资源的id。如果要给一个控件加单击事件,则要使用PendingIntent并通过setOnClickPendingIntent方法来实现。PendingIntent支支持三种动作:启动Activity、启动Service、发送Broadcast,这里面我选择了发送广播来执行任务。
另外,如果自定义布局高度过高,超过了64dp,这时候通知栏会显示不全,这个问题的解决办法是设置Notification的bigContentView
.setCustomBigContentView(remoteViewsSilent)
具体代码:
Intent intent = new Intent(context, SettingActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context,
"channelWithoutSound");RemoteViews remoteViewsSilent= new RemoteViews(getContext().getPackageName(),
R.layout.notification_download);
remoteViewsSilent.setTextViewText(R.id.tv_title, title);
remoteViewsSilent.setTextViewText(R.id.tv_content, content);remoteViewsSilent.setImageViewResource(
R.id.iv_cancel, R.drawable.outline_delete_forever_black_24dp);
if (progress > 0) {
remoteViewsSilent.setProgressBar(R.id.pb_downloading, 100, progress, false);
}
//设置点击事件
Intent startIntent = new Intent();
startIntent.setAction("com.example.forrestsu.logintest.START_PAUSE");
PendingIntent startPendingIntent = PendingIntent.getBroadcast(
context, PAUSE, startIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViewsSilent.setOnClickPendingIntent(R.id.iv_start_pause, startPendingIntent);
builder.setContentIntent(pi)
.setCustomContentView(remoteViewsSilent) //设置自定义布局
.setCustomBigContentView(remoteViewsSilent)
.setSmallIcon(R.drawable.android_white_18dp)
.setAutoCancel(true); //点击通知后取消显示
NotificationManager notificationManager
= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.build());
然后需要执行任务的地方接收一下广播、执行相应的动作就可以了。
class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive:接收到广播");
//执行动作......
}
}
项目资源文件夹中的文件命名必须是字母开头的,即使这个文件没有被用到,编译时依然会报错。
比如我今天在drawable中放了几张图片,其中有一张是以纯数字命名的,虽然代码里没有引用这张图,但编译时还是报错了
所以一定要注意命名的规范。
二、明天计划的事情
1.解决自定义通知中的控件更新问题
2.任务六
三、遇到的问题
自定义的Notification中,RemoteVIews的控件无法及时更新
四、收获
评论