zoukankan      html  css  js  c++  java
  • Notification 使用详解

    极力推荐文章:欢迎收藏
    Android 干货分享

    阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

    本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

    1. Notification 简介
    2. 通知的创建
    3. 通知的管理
    4. 简单的通知
    5. 可以 扩展的通知
    6. 通知中含下载进度条
    7. 通知中含媒体播放控件
    8. 自定义通知内容

    Notification 通知是应用向用户显示的消息提示,当发送通知时,通知将先以图标的形式显示在通知区域中。用户可以打开下拉通知栏查看通知的详细信息。 通知区域和下拉通知栏均是由系统控制的区域,用户可以随时查看。

    Notification 简介

    通知在Android用户界面的一个重要部分,其使用方法请看以下内容:

    Notification 继承关系如下:

    java.lang.Object
       ↳
        android.app.Notification
    

    1.Notification 简介

    通知是应用向用户显示的消息提示,当发送通知时,通知将先以图标的形式显示在通知区域中。用户可以打开下拉通知栏查看通知的详细信息。 通知区域和下拉通知栏均是由系统控制的区域,用户可以随时查看。

    通知区域中的通知

    下拉通知栏中的通知

    2.创建Notification 的方法

      1. 调用NotificationCompat.Builder.build() 创建Notification 对象
      1. 然后调用 NotificationManager.notify()Notification对象传递给系统。

    Notification 对象必须包含以下内容:

      1. 小图标,由setSmallIcon()设置
      1. 标题,由 setContentTitle() 设置
      1. 详细文本,由 setContentText() 设置

    通知可选内容

    • 设置优先级

    通知默认优先级为 PRIORITY_DEFAULT 0
    Notification.Builder.setPriority()
    5个级别可选(-2、-1、0、1、2)

    通知优先级如下:

        PRIORITY_LOW=-1
        PRIORITY_MIN=-2
        PRIORITY_DEFAULT = 0
        PRIORITY_HIGH=1
        PRIORITY_MAX=2
    

    设置可以扩展样式

    通过Notification.Builder.setStyle()可以设置通知的样式。

    点击通知启动Activity(PendingIntent)

    通知中经常遇到,点击通知栏,打开 Activity

    
    
    		Notification.Builder mBuilder = new Notification.Builder(this);
    
    		mBuilder.setSmallIcon(R.drawable.gril)
    				.setDefaults(Notification.DEFAULT_SOUND).setColor(000)
    				.setContentTitle("简单通知Tittle").setContentText("点击可以打开Activity");
    
    		Intent resultIntent = new Intent(this, NotificationMethods.class);
    		// 新开一个Activity 栈
    
    		resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
    				| Intent.FLAG_ACTIVITY_CLEAR_TASK);
    		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    		stackBuilder.addParentStack(NotificationMethods.class);
    		stackBuilder.addNextIntent(resultIntent);
    		PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
    				PendingIntent.FLAG_UPDATE_CURRENT);
    		mBuilder.setContentIntent(resultPendingIntent);
    
    		NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    		mNotificationManager.notify(0, mBuilder.build());
    	
    

    3. 通知的管理

      1. 更新通知

    调用 NotificationManager.notify(ID) 发出带有通知ID的通知,ID相同,即可更新以前ID发送的通知。

      1. 删除通知

    创建时 调用了 setAutoCancel(true)

    删除时候调用删除指定ID

    NotificationManager.cancel(notificationId)
    

    删除自己应用发的所有通知

    Utils.mNotificationManager.cancelAll();
    
      1. 在通知中显示进度条

    setProgress()

    4. 简单的通知

    • 实现效果

    简单通知图片

    • 实现代码
    	/**
    	 * 简单通知
    	 */
    	public void SimpleNotification(View view) {
    
    		Notification.Builder mBuilder = new Notification.Builder(this);
    
    		mBuilder.setSmallIcon(R.drawable.gril)
    				.setDefaults(Notification.DEFAULT_SOUND).setColor(000)
    				.setContentTitle("简单通知Tittle").setContentText("点击可以打开Activity");
    
    		Intent resultIntent = new Intent(this, NotificationMethods.class);
    		// 新开一个Activity 栈
    
    		resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
    				| Intent.FLAG_ACTIVITY_CLEAR_TASK);
    		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    		stackBuilder.addParentStack(NotificationMethods.class);
    		stackBuilder.addNextIntent(resultIntent);
    		PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
    				PendingIntent.FLAG_UPDATE_CURRENT);
    		mBuilder.setContentIntent(resultPendingIntent);
    
    		NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    		mNotificationManager.notify(0, mBuilder.build());
    	}
    

    5. 可以 扩展的通知

    • 实现效果

    通知展开图

    通知未展开图

    • 实现代码
    
    	/**
    	 * 可扩展通知
    	 * **/
    	public void NotificationStyle(View view) {
    
    		Notification.Builder mBuilder = new Notification.Builder(this);
    
    		mBuilder.setLargeIcon(
    				DrawableUtils.DrawableToBitmap(getResources().getDrawable(
    						R.drawable.ic_launcher)))
    				.setContentTitle("我是可扩展通知的Tittle ")
    				.setDefaults(Notification.DEFAULT_SOUND)
    
    				.setContentText("我是可扩展通知的内容")
    				.setSmallIcon(R.drawable.ic_launcher)
    				.setAutoCancel(true)
    				.setStyle(
    						new Notification.InboxStyle().addLine("我是可扩展通知第一行")
    								.addLine("我是可扩展通知第二行")
    								.setBigContentTitle("我是可扩展的大 Tittle")
    								.setSummaryText("点击,展开获取更多内容"));
    
    		NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    		// 如果Id 一样可以更新通知
    		mNotificationManager.notify(1, mBuilder.build());
    	}
    

    6. 通知中含下载进度条

    • 实现效果

    下载中通知

    下载完成通知

    • 实现代码
    
    	/**
    	 * 带有下载进度条的通知
    	 * **/
    	public void NotificationProcess(View view) {
    
    		final NotificationManager mNotifyManagerProcess;
    		final Notification.Builder mBuilder;
    		mNotifyManagerProcess = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    		mBuilder = new Notification.Builder(this);
    		mBuilder.setContentTitle("Picture Downloading").setSmallIcon(
    				R.drawable.ic_launcher);
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				for (MIncr = 0; MIncr <= 100; MIncr += 1 + 5 * Math.random()) {
    					mBuilder.setProgress(100, MIncr, false).setContentText(
    							MIncr + "%");
    					mNotifyManagerProcess.notify(2, mBuilder.build());
    					try {
    						Thread.sleep(500);
    					} catch (InterruptedException e) {
    					}
    				}
    				/**
    				 * setProgress true 则表示 进度条一直不停的从左至右滑动,类似于圆形进度条 false :进度条消失
    				 * **/
    				mBuilder.setContentText("Download complete").setProgress(0, 0,
    						false);
    				mNotifyManagerProcess.notify(2, mBuilder.build());
    			}
    		}).start();
    	}
    
    

    7. 通知中含媒体播放控件

    • 实现效果

    未展开图

    展开图

    • 实现代码
    	/**
    	 * 音乐播放器样式
    	 * **/
    	public void NotificationMediaStyle(View view) {
    		Notification.Builder mMediaBuilder = new Notification.Builder(this);
    		mMediaBuilder.setSmallIcon(R.drawable.ic_launcher);
    		mMediaBuilder.setContentTitle("如果有一天我变有钱");
    		mMediaBuilder.setContentText("毛不易");
    		mMediaBuilder.setLargeIcon(DrawableUtils
    				.DrawableToBitmap(getResources().getDrawable(
    						R.drawable.ic_launcher)));
    		Intent mIntent = new Intent();
    		ComponentName name = new ComponentName(this, NotificationMethods.class);
    		mIntent.setComponent(name);
    		PendingIntent mPendingIntent = PendingIntent.getActivity(
    				getApplicationContext(), 0, mIntent, 0);
    		mMediaBuilder.setContentIntent(mPendingIntent);
    		mMediaBuilder.setPriority(Notification.PRIORITY_MAX);
    		mMediaBuilder.addAction(new Notification.Action.Builder(Icon
    				.createWithResource(NotificationMethods.this,
    						R.drawable.music_pre), "1", null).build());
    		mMediaBuilder.addAction(new Notification.Action.Builder(Icon
    				.createWithResource(NotificationMethods.this,
    						R.drawable.music_play), "2", null).build());
    		mMediaBuilder.addAction(new Notification.Action.Builder(Icon
    				.createWithResource(NotificationMethods.this,
    						R.drawable.music_next), "3", null).build());
    
    		Notification.MediaStyle mMediaStyle = new Notification.MediaStyle();
    		mMediaStyle.setShowActionsInCompactView(0, 1, 2);
    		mMediaBuilder.setStyle(mMediaStyle);
    
    		NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    		// 如果Id 一样可以更新通知
    		mNotificationManager.notify(1, mMediaBuilder.build());
    	}
    
    

    8. 自定义通知内容

    • 实现效果

    自定义通知效果图

    • 实现代码
    	/**
    	 * 自定义样式通知
    	 * **/
    	public void NotificationCustomView(View view) {
    
    		/***
    		 * 自定义Remoteview
    		 * **/
    		RemoteViews remoteViews = new RemoteViews(getPackageName(),
    				R.layout.notification_view);
    		remoteViews.setTextViewText(R.id.tv_content_title, "十年");
    		remoteViews.setTextViewText(R.id.tv_content_text, "陈奕迅");
    		// 打开上一首
    		remoteViews.setOnClickPendingIntent(R.id.btn_pre,
    				SetClickPendingIntent(NOTIFICATION_PRE));
    		// 打开下一首
    		remoteViews.setOnClickPendingIntent(R.id.btn_next,
    				SetClickPendingIntent(NOTIFICATION_NEXT));
    		// 点击整体布局时,打开播放器
    		remoteViews.setOnClickPendingIntent(R.id.btn_play,
    				SetClickPendingIntent(NOTIFICATION_PLAY));
    		// 点击整体布局时,打开Activity
    		remoteViews.setOnClickPendingIntent(R.id.ll_root,
    				SetClickPendingIntent(NOTIFICATION_ACTIVITY));
    
    		remoteViews.setOnClickPendingIntent(R.id.img_clear,
    				SetClickPendingIntent(NOTIFICATION_CANCEL));
    
    		Notification.Builder builder = new Notification.Builder(this)
    				.setSmallIcon(R.drawable.ic_launcher)
    				.setTicker("当前正在播放..")
    				.setWhen(System.currentTimeMillis())
    				.setContentTitle("十年")
    				.setContentText("陈奕迅")
    				.setAutoCancel(true)
    				.setLargeIcon(
    						DrawableUtils.DrawableToBitmap(getResources()
    								.getDrawable(R.drawable.ic_launcher)))
    				.setContent(remoteViews);
    
    		Utils.mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		// 打开通知
    		Utils.mNotificationManager.notify(Utils.NOTIFICATION_CUSTOM_ID,
    				builder.build());
    	}
    
    	public PendingIntent SetClickPendingIntent(int what) {
    		switch (what) {
    
    		case NOTIFICATION_PRE:
    			Intent intentPre = new Intent(this, MainActivity.class);
    			intentPre.putExtra("cmd", what);
    			int flagPre = PendingIntent.FLAG_UPDATE_CURRENT;
    			PendingIntent clickPreIntent = PendingIntent.getActivity(this,
    					what, intentPre, flagPre);
    			return clickPreIntent;
    
    		case NOTIFICATION_PLAY:
    			Intent intentPlay = new Intent(this, NotificationMethods.class);
    			intentPlay.putExtra("cmd", what);
    			int flagPlay = PendingIntent.FLAG_UPDATE_CURRENT;
    			PendingIntent clickPlayIntent = PendingIntent.getActivity(this,
    					what, intentPlay, flagPlay);
    			return clickPlayIntent;
    		case NOTIFICATION_NEXT:
    			Intent intentNext = new Intent(this, ActivityMethods.class);
    			intentNext.putExtra("cmd", what);
    			int flagNext = PendingIntent.FLAG_UPDATE_CURRENT;
    			PendingIntent clickNextIntent = PendingIntent.getActivity(this,
    					what, intentNext, flagNext);
    			return clickNextIntent;
    		case NOTIFICATION_ACTIVITY:
    			Intent intentActivity = new Intent(this, ServiceMethod.class);
    			intentActivity.putExtra("cmd", what);
    			int flag = PendingIntent.FLAG_UPDATE_CURRENT;
    			PendingIntent clickIntent = PendingIntent.getActivity(this, what,
    					intentActivity, flag);
    			Toast.makeText(getApplicationContext(), "打开Activity", 0).show();
    			return clickIntent;
    		case NOTIFICATION_CANCEL:
    
    			Intent intentCancel = new Intent("Notification_cancel");
    			intentCancel.putExtra("cancel_notification_id",
    					Utils.NOTIFICATION_CUSTOM_ID);
    			int flagCancel = PendingIntent.FLAG_CANCEL_CURRENT;
    			PendingIntent clickCancelIntent = PendingIntent.getBroadcast(this,
    					0, intentCancel, flagCancel);
    			return clickCancelIntent;
    		default:
    			break;
    		}
    		return null;
    
    	}
    

    自定View 布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ll_root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#282828"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="8dp" >
    
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:padding="5dp"
            android:src="@drawable/ic_launcher" />
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tv_content_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:textSize="18sp"
                android:text="十年"
                android:textColor="@android:color/white" />
    
            <TextView
                android:id="@+id/tv_content_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="5dp"
                android:text="陈奕迅"
                android:textSize="14sp"
               android:textColor="@android:color/white" />
        </LinearLayout>
    
        <Button
            android:id="@+id/btn_pre"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="@drawable/music_pre" />
    
        <Button
            android:id="@+id/btn_play"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@drawable/music_play" />
    
        <Button
            android:id="@+id/btn_next"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@drawable/music_next" />
    
        <ImageView
            android:id="@+id/img_clear"
            android:layout_width="30dp"
            android:layout_height="match_parent"
            android:layout_gravity="top|center_horizontal"
            android:padding="6dp"
            android:src="@drawable/clear_img" />
    
    </LinearLayout>
    

    实现自定义通知删除按钮事件实现

    		case NOTIFICATION_CANCEL:
    
    			Intent intentCancel = new Intent("Notification_cancel");
    			intentCancel.putExtra("cancel_notification_id",
    					Utils.NOTIFICATION_CUSTOM_ID);
    			int flagCancel = PendingIntent.FLAG_CANCEL_CURRENT;
    			PendingIntent clickCancelIntent = PendingIntent.getBroadcast(this,
    					0, intentCancel, flagCancel);
    			return clickCancelIntent;
    
    注意

    广播是四大组件之一,需要在AndroidManfest.xml 中注册

    注册方式如下:

            <receiver
                android:name="com.programandroid.BroadcastReceiver.NotificationReceived"
                android:enabled="true"
                android:exported="true" >
                <intent-filter>
                    <action android:name="Notification_cancel" />
                    <action android:name="Notification_music_pre" />
                    <action android:name="Notification_music_play" />
                    <action android:name="Notification_music_next" />
                </intent-filter>
            </receiver>
    

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    微信关注公众号:  程序员Android,领福利

  • 相关阅读:
    Metricbeat
    Flask安装与基本配置
    web框架
    git
    占位
    算法
    面试
    CMDB
    order by关键字排序优化
    动态主机配置协议-DHCP
  • 原文地址:https://www.cnblogs.com/wangjie1990/p/11310850.html
Copyright © 2011-2022 走看看