Android Notification使用

转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/50453244;
本文出自:【梁大盛的博客】

Android之Notification使用

引:作为对Notification学习的一个总结.涉及到RemoteView的使用.

Notification使用

Notification的使用牵涉到三个关键类:Notification,Notification.Builder,NotificationManager

Notification - Notification类标识一个Notification.其中包括Icon,标题,内容,时间戳,LED闪烁形式,震动形式,提示声音等等.

Notification.Builder - Notification类构造器.在HONEYCOMB(API level 11)新增加的工具类.在HONEYCOMB之前的版本,Notification很多属性都是通过Flag设置.很繁琐而且使用起来很别扭.Notification.Builder内部也是通过Notification类实现.但是提供了很多setXXX方法设置Flag.使用起来更容易.

NotificationManager - Notification管理类,负责对notification管理.通过notify函数显示、更新notification.

package com.example.dsliang.notificationdemo;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    Button btnShow;
    NotificationManager notificationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        btnShow = (Button) findViewById(R.id.btnShow);

        btnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Notification notification;

                Notification.Builder builder;

                //Api大于等于HONEYCOMB,使用Notification.Builder创建notification
                builder = new Notification.Builder(MainActivity.this);
                builder.setTicker("滚动提示");  //N滚动提示
                builder.setContentTitle("应该是标题");   //标题
                builder.setContentText("这个是内容");    //内容
                builder.setSmallIcon(android.R.drawable.sym_action_chat);  //Icon 如果不设置Icon,Notification不会跳出来
                builder.setAutoCancel(false);    //点击以后是否自动清除,true-点击后自动清除,false-点击以后不会自动清除
                builder.setContentInfo("右侧提示");
                //铃声,震动,提示灯默认设置.
                // DEFAULT_ALL会忽略已经设置的震动,声音,提示等设置
                //除此还有三个参数 DEFAULT_SOUND - 默认声音, DEFAULT_VIBRATE - 默认震动, DEFAULT_LIGHTS - 默认提示灯
                builder.setDefaults(Notification.DEFAULT_ALL);
                //但设置了LargeIcon,小图标依然会在状态栏中显示.当时下拉状态的时候大图会显示在左边,小图片给显示在右下角
                builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), android.R.drawable.sym_action_call));
                //在右边显示一个数量,等价于setContentInfo函数.如果有设置setContentInfo函数,那么本函数会给覆盖
//                builder.setNumber(12);
                //是否常驻状态栏
                //builder.setOngoing(true);
                //setOnlyAlertOnce 是否提示一次.true - 如果Notification已经存在状态栏即使在调用notify函数也不会更新.
                builder.setOnlyAlertOnce(true);
                //滚动条
                //setProgress (int max, int progress, boolean indeterminate)
                //indeterminate true - 不确定的,不会显示进度,false - 根据max和progress情况显示进度条
                builder.setProgress(100, 50, false);
                //显示一个计数器
                builder.setUsesChronometer(true);

                //点击事件
                // PendingIntent ClickPending = PendingIntent.getActivity(MainActivity.this, 0, new Intent().setClass(MainActivity.this, NotificationActivity.class), 0);
                //builder.setContentIntent(ClickPending);

                //清除事件
                //PendingIntent DelPending = PendingIntent.getActivity(MainActivity.this, 0, new Intent().setClass(MainActivity.this, NotificationActivity.class), 0);
                //builder.setDeleteIntent(DelPending);

                notification = builder.build();
                notificationManager.notify(1, notification);
            }
        });


    }
}

随便展示几张截图:
Android Notification使用_第1张图片

Android Notification使用_第2张图片

代码中对一些常用的函数附上注释.其中要注意的地方
1.builder.setSmallIcon(android.R.drawable.sym_action_chat)如果不设置Icon那么Notification不会显示出来.文档中也写得很清楚.
这里写图片描述

2.builder.setContentInfo(“右侧提示”)和builder.setNumber(12)作用是一样,setContentInfo函数会覆盖setNumber函数.其实一个是显示字符串一个是显示数字.setContentInfo函数完全可以实现setNumber函数的功能.

3.notificationManager.notify(“notify”, 1, notification)和notificationManager.notify(1, notification)的区别.notification是已(tag,id)键值对表示一个notification.notificationManager.notify(“notify”, 1, notification)和notificationManager.notify(1, notification)即使是同一个notification但是还是因为(tag,id)当中tag一个为null一个为”notify”,字符串.这个时候系统会显示两个一样的notification.

总结:创建notification类,包含两类函数.第一类属于对界面的调整,例如setProgress,setSmallIcon ,setContentText等.还有一类属于对notification表现形态(震动,意图,常驻等)的调整,例如setLights,setOnlyAlertOnce等.在实战实用中对第二种调整是更有意义!因为第一种只是对notification系统平台提供的RemoteView进行调整.在项目当中更多我们会自定义RemoteView.

Notification部分源码片段分析

什么是RemoteView?
在第一次使用Notification的时候我就已经好奇.为啥Notification不会设计成和普通View一样的使用方式?理由很简单!状态栏不是单单由你的应用程序管理.状态栏是由Android系统管理的.你需要显示Notification就必须和系统打交道.必须通过Notification服务才能显示你的Notification.所以设计成用一个Notification实例代表一个Notification,然后通过notificationManager.notify函数提交给Notification服务.
Notification服务是什么?是一个独立的线程!
又扯出一个问题.跨线程显示View.该怎么显示?不是在本应用程序显示View.这里就要借用RemoteView.
RemoteView理解成对一个View的封装,然后把RemoteView提交给其他线程.其他线程接收到RemoteView并且解析里面View的信息把它显示出来.

在使用系统自带的Notification系统会创建一个默认的RemoteView!

Android Notification使用_第3张图片

Android Notification使用_第4张图片

系统默认使用R.layout.notification_template_material_base生产一个RemoteView.

notification提供setContent(RemoteViews views)函数给我们设置我们自定义的RemoteView.自定义RemoteView就是这样简单了!

Notification总结

Notification总结:其实系统提供的Notification View功能是很强大的!图片,文字,计数器,进度条,按钮一些很常用的控件都提供了.对于Notification没有特殊要求的程序一般都能满足.当然需要个性化就自定义RemoteView.Notification的学习更重要在于了解Notification行为的设置.事实上Notification完全就是一个进程之间的通信.我们的App和Notification管理的通信.一个作为客户端一个作为服务端.通过Notification类传递相应的数据.


参考

1:Notification - http://www.android-doc.com/reference/android/app/Notification.html

2:NotificationManager - http://www.android-doc.com/reference/android/app/NotificationManager.html

3:Notification.Builder - http://www.android-doc.com/reference/android/app/Notification.Builder.html#setProgress(int, int, boolean)

4:RemoteViews - http://www.android-doc.com/reference/android/widget/RemoteViews.html

你可能感兴趣的:(Android)