第五章-RemoteViews应用

本文详细介绍了Android中的RemoteViews在通知栏和桌面小部件中的使用,包括如何创建自定义通知、桌面小部件的实现步骤及注意事项。通过RemoteViews,开发者可以在不同进程中更新界面。同时,文章提及PendingIntent的匹配规则和常用标志,如FLAG_ONE_SHOT、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT。
摘要由CSDN通过智能技术生成

一、RemoteViews的应用

RemoteViews在实际的开发中,主要用在通知栏和桌面小部件的开发过程中。通知栏每个人都不陌生,主要是通过NotificationManager的notify方法去实现的,它除了默认效果外,还可以另外自定义布局。桌面小部件则是通过AppWidgetProvider来实现的,AppWidgetProvider本质上就是一个广播。通知栏和桌面小部件的开发过程中都会用到RemoteViews,它们在更新界面时无法像在Activity里面那样直接更新View,这是因为两者的界面都运行在其它进程中,确切来说是系统的SystemService进程。为了跨进程更新界面,RemoteViews提供了一系列的set方法,并且这些方法只是View全部方法的子集,另外RemoteViews中所支持的View类型也是有限的。
下面简单介绍下RemoteViews在通知栏和桌面小部件中的使用方法。

1.RemoteViews在通知栏上的应用
首先来看下通知栏,我们先了解一下系统默认的样式

String title = "通知标题";
String content = "通知内容";

String id = "channel_id_01";
String name="channel_id_01_name";
Context context = getApplication();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   //解决android9.0上通知不显示的问题。
	NotificationChannel mChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
	notificationManager.createNotificationChannel(mChannel);

	Intent intent = new Intent(this, testCustomViewActivity.class);
	PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
	//新的sdk中找不到这个方法了。会报错
	//notification.setLatestEventInfo(this, "Test", "This is Notification", pendingIntent);

	notification = new Notification.Builder(context)
			.setChannelId(id)
			.setContentTitle(title)
			.setContentText(content)
			.setContentIntent(pendingIntent)//设置跳转到指定的activity
			.setAutoCancel(true)//设置点击跳转后自动清除消息
			.setSmallIcon(R.mipmap.ic_launcher).build();
} else {
   
	NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
			.setContentTitle(title)
			.setContentText(content)
			.setSmallIcon(R.mipmap.ic_launcher)
			.setOngoing(true);
	notification = notificationBuilder.build();
}

notificationManager.notify(1008, notification);//注意第一个参数如果是一个常量,那么每次通知都覆盖。如果每次都不同,在通知栏就会出现多个消息

上面会弹出一个系统的默认的通知(兼容了android9.0)。点击通知的时候会跳转到指定的activity,并且清除本身。
效果如下:

为了满足个性化需求,我们还可能会用到自定义通知。自定义通知也很简单,首先我们要提供一个布局文件,然后通过RemoteViews来加载这个布局文件改变通知的样式,代码如下所示:

		String id = "channel_id_01";
        String name="channel_id_01_name";
        Context context = getApplication();
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   //解决android9.0上通知不显示的问题。
            NotificationChannel mChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
            notificationManager.createNotificationChannel(mChannel);

            /** 生成跳转的intent */
            Intent intent = new Intent(this, testCustomViewActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

            /** 构造RemoteView */
            RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.layout_notification);
            remoteViews.setTextViewText(R.id.tv_title,"自定义标题_Hello");
            remoteViews.setTextViewText(R.id.tv_content,"自定义内容_welcome to android world");
            remoteViews.setImageViewResource(R.id.iv_img,R.mipmap.ic_launcher);
            remoteViews.setOnClickPendingIntent(R.id.bt_confirm,pendingIntent);//给自定义view的按钮设置一个跳转监听,如果不设置,点击按钮就跳转不了

            notification = new Notification.Builder(context)
                    .setChannelId(id)
                    .setCustomContentView(remoteViews)//设置自定义的布局
                    .setContentIntent(pendingIntent)//设置跳转到指定的activity。这个和上面那个按钮的跳转都是生效的。
                    .setAutoCancel(true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值