Android之利用RemoteViews自定义Notification

转载请注明出处:http://blog.csdn.net/loveyaozu/article/details/51178707。这是对别人劳动成果的尊重。


一、概述

RemoteViews从字面上看是一种远程视图。RemoteViews具有View的结构,既然是远程View,那么它就可以在其他进程中显示。由于它可以跨进程显示,所以为了能够更新他的界面,RemoteViews提供一组基础的操作用于跨进程更新它的UI。
RemoteViews在Android日常开发中最常见的使用场景有两种:通知栏的通知和桌面小部件。通知栏通知大家应该都不陌生,因为这还经常用到的,notification主要是通过NotificationManager的notify方法来实现,它除了默认的效果外,开发人员还可以根据自己的需求自定义UI布局。桌面小部件是通过AppWidgetProvider来实现的,其实AppWidgetProvider是一个广播。通知栏通知和小部件的开发过程中经常会用到RemoteViews。它们在更新UI的时候无法像Activity和Fragment那样直接更新,前面讲过,因为它是跨进程的view,更确切一点来说的话,它是运行在SystemServer进程中。为了能够跨进程更新界面,RemoteViews提供了一些列可以跨进程更新UI的方法,内部有一些列的set方法,这些方法都是View的子集。

二、RemoteViews使用场景之Notification


①首先看一下原生的的notification

	/**
	 * 显示原生的notification
	 */
	protected void showNotification() {
		// API 16之前的方式好多都过时
		Notification.Builder builder = new Notification.Builder(this);
		builder.setTicker("Hello World!");// 收到通知的时候用于显示于屏幕顶部通知栏的内容
		builder.setSmallIcon(R.drawable.ic_launcher);// 设置通知小图标,在下拉之前显示的图标
		builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));// 落下后显示的图标
		builder.setWhen(System.currentTimeMillis());
		builder.setContentTitle("This is title");
		builder.setContentText("Here is content");
		// builder.setSound(uri);//声音提示
		// builder.setSound(sound, streamType);//科设置 streamtype
		// builder.setStyle(style);//style设置
		// http://developer.android.com/reference/android/app/Notification.Style.html
		// builder.setVibrate(long[]);//设置震动
		builder.setOngoing(true);// 不能被用户x掉,会一直显示,如音乐播放等
		builder.setAutoCancel(true);// 自动取消
		builder.setOnlyAlertOnce(true);// 只alert一次
		builder.setDefaults(Notification.DEFAULT_ALL);
		builder.setContentInfo("额外的内容");// 添加到了右下角
		Intent intent = new Intent(this, SecondActivity.class);
		intent.putExtra(SINGLE, NATIVE_NOTIFICATION);
		intent.setPackage(this.getPackageName());
		PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.setContentIntent(pendingIntent);
		Notification notification = builder.build();
		notification.flags = Notification.FLAG_AUTO_CANCEL;
		NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		manager.notify(0, notification);

	}
	protected String getCurrentTime() {
		String time = "unknown";
		Calendar c = Calendar.getInstance();
		int hour = c.get(Calendar.HOUR_OF_DAY);
		int minute = c.get(Calendar.MINUTE);
		time = hour + ":" + minute;
		return time;
	}



效果展示:

主界面:

 Android之利用RemoteViews自定义Notification_第1张图片   

点击后的效果

Android之利用RemoteViews自定义Notification_第2张图片



下拉后查看

Android之利用RemoteViews自定义Notification_第3张图片


② 利用RemoteViews自定义通知

	protected void showRemoteViewsNotification() {
		Notification.Builder builder = new Notification.Builder(this);
		builder.setTicker("Hello RemotesViews!");// 收到通知的时候用于显示于屏幕顶部通知栏的内容
		builder.setSmallIcon(R.drawable.ic_launcher);// 设置通知小图标,在下拉之前显示的图标
		builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));// 落下后显示的图标
		builder.setWhen(System.currentTimeMillis());
		builder.setOngoing(true);// 不能被用户x掉,会一直显示,如音乐播放等
		builder.setAutoCancel(true);// 自动取消
		builder.setOnlyAlertOnce(true);// 只alert一次
		builder.setDefaults(Notification.DEFAULT_ALL);
		mRemoteViews.setImageViewResource(R.id.logo, R.drawable.large_icon);
		mRemoteViews.setTextViewText(R.id.notify_title, "这是自定义view的title");
		mRemoteViews.setTextViewText(R.id.notify_content, "这里是自定义view的内容");
		mRemoteViews.setTextViewText(R.id.notify_time, getCurrentTime());
		builder.setContent(mRemoteViews);

		Intent intent = new Intent(this, SecondActivity.class);
		intent.putExtra(SINGLE, REMOTE_VIEWS_NOTIFICATION);
		intent.setPackage(this.getPackageName());
		PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.setContentIntent(pendingIntent);
		Notification notification = builder.build();
		notification.flags = Notification.FLAG_AUTO_CANCEL;
		NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		manager.notify(0, notification);
	}

效果展示:

Android之利用RemoteViews自定义Notification_第4张图片       Android之利用RemoteViews自定义Notification_第5张图片





未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。

你可能感兴趣的:(android,notification,RemoteViews,widget)