发表于: 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的控件无法及时更新


四、收获

      


返回列表 返回列表
评论

    分享到