Android:通知栏的使用

非常久没有使用Android的通知功能了,今天把两年前的代码搬出来一看。发现非常多方法都废弃了,代码中各种删除线看的十分不爽。于是乎,打开Google,查看官方文档。学习最新的发送通知栏消息的方法。

本文中的代码均參照谷歌官方文档编写:

http://developer.android.com/guide/topics/ui/notifiers/notifications.html

1.首先。获取系统的通知服务:

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

2.发送一个最简单的通知

    public void simpleNotice(View view) {
        //此Builder为android.support.v4.app.NotificationCompat.Builder中的,下同。
        Builder mBuilder = new Builder(this);
        //系统收到通知时。通知栏上面显示的文字。

mBuilder.setTicker("天津。晴,2~15度,微风");
        //显示在通知栏上的小图标
        mBuilder.setSmallIcon(R.drawable.consult_answer);
        //通知标题
        mBuilder.setContentTitle("天气预报");
        //通知内容
        mBuilder.setContentText("天津,晴,2~15度。微风");

        //设置大图标,即通知条上左側的图片(假设仅仅设置了小图标,则此处会显示小图标)
        mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.share_sina));
        //显示在小图标左側的数字
        mBuilder.setNumber(6);

        //设置为不可清除模式
        mBuilder.setOngoing(true);

        //显示通知,id必须不反复,否则新的通知会覆盖旧的通知(利用这一特性。能够对通知进行更新)
        nm.notify(1, mBuilder.build());
    }

3.删除一个通知。參数即为通知的id

nm.cancel(1);

4.发送一个通知。点击通知后跳转到一个Activity,从这个Activity返回后,进入程序内的某一个页面(一般为主页)

//点击通知进入一个Activity,点击返回时进入指定页面。
    public void resultActivityBackApp(View view) {
        Builder mBuilder = new Builder(this);
        mBuilder.setTicker("通知标题2");
        mBuilder.setSmallIcon(R.drawable.ic_launcher);
        mBuilder.setContentTitle("通知标题2");
        mBuilder.setContentText("点击通知进入一个Activity,点击返回时进入指定页面。

");

        //设置点击一次后消失(假设没有点击事件。则该方法无效。

)
        mBuilder.setAutoCancel(true);

        //点击通知之后须要跳转的页面
        Intent resultIntent = new Intent(this, ResultActivityBackApp.class);

        //使用TaskStackBuilder为“通知页面”设置返回关系
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        //为点击通知后打开的页面设定 返回 页面。(在manifest中指定)
        stackBuilder.addParentStack(ResultActivityBackApp.class);
        stackBuilder.addNextIntent(resultIntent);

        PendingIntent pIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pIntent);
        // mId allows you to update the notification later on.
        nm.notify(2, mBuilder.build());
    }

同一时候。须要在manifest中为点击通知后打开的Activity指定父Activity.

<activity
            android:name=".ResultActivityBackApp"
            android:parentActivityName=".MainActivity">

            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />

        </activity>

(当中,activity的属性parentActivityName为API 16中的属性。meta-data中的代码为兼容API 16下面。

因此,对于大多数程序。这两个地方都得写。)

5.和上述4类似,仅仅是在打开的Activity中返回时回到home页

 //点击通知进入一个Activity,点击返回时回到桌面
    public void resultActivityBackHome(View view) {
        Builder mBuilder = new Builder(this);
        mBuilder.setTicker("通知标题3");
        mBuilder.setSmallIcon(R.drawable.ic_launcher);
        mBuilder.setContentTitle("通知标题3");
        mBuilder.setContentText("点击通知进入一个Activity,点击返回时回到桌面");

        //设置点击一次后消失(假设没有点击事件,则该方法无效。)
        mBuilder.setAutoCancel(true);

        Intent notifyIntent = new Intent(this, ResultActivityBackHome.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pIntent);

        nm.notify(3, mBuilder.build());
    }

6.带进度条的通知

     public void progressNotice(View view) {
        final Builder mBuilder = new Builder(this);
        mBuilder.setTicker("通知标题4");

        mBuilder.setContentTitle("Picture Download")
                .setContentText("Download in progress")
                .setSmallIcon(R.drawable.ic_launcher);

        // Start a lengthy operation in a background thread
        new Thread(new Runnable() {
            @Override
            public void run() {
                int progress;
                for (progress = 0; progress <= 100; progress++) {
                    // Sets the progress indicator to a max value, the current completion percentage,
                    // and "determinate" state
                    mBuilder.setProgress(100, progress, false);

                    //不明白进度的进度条
//                    mBuilder.setProgress(0, 0, true);

                    nm.notify(4, mBuilder.build());
                    // 模拟延时
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                // When the loop is finished, updates the notification
                mBuilder.setContentText("Download complete");
                // Removes the progress bar
                mBuilder.setProgress(0, 0, false);
                nm.notify(4, mBuilder.build());
            }
        }
        ).start();
    }

7.扩展布局的通知。按住通知条下滑,能够查看更具体的内容

public void expandLayoutNotice(View view) {
        Builder mBuilder = new Builder(this);
        mBuilder.setTicker("通知标题5");
        mBuilder.setSmallIcon(R.drawable.ic_launcher);
        mBuilder.setContentTitle("通知标题5");
        mBuilder.setContentText("按住通知下拉可显示扩展布局");

        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
        String[] events = new String[]{"Beijing", "Tianjin", "Shanghai", "Guangzhou"};
        // 设置扩展布局的标题
        inboxStyle.setBigContentTitle("Event tracker details:");

        for (String s : events) {
            inboxStyle.addLine(s);
        }
        mBuilder.setStyle(inboxStyle);

        nm.notify(5, mBuilder.build());
    }

8.自己定义布局的通知栏。(依据谷歌的官方文档不推荐这么做。由于使用这样的方式时,对不同屏幕进行适配须要考虑的因素太多。

并且,通知栏应该展示的就是最简明扼要的信息。对于大多数程序默认的布局已经足够了。

//自己定义布局的通知
    public void customLayoutNotice(View view) {
        Builder mBuilder = new Builder(this);
        mBuilder.setTicker("通知标题6");
        mBuilder.setTicker("通知标题6");
        mBuilder.setSmallIcon(R.drawable.ic_launcher);

        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_layout_notice);
        mBuilder.setContent(remoteViews);
        //为RemoteViews上的按钮设置文字
        remoteViews.setCharSequence(R.id.custom_layout_button1, "setText", "Button1");
        remoteViews.setCharSequence(R.id.custom_layout_button2, "setText", "Button2");

        //为RemoteViews上的按钮设置点击事件
        Intent intent1 = new Intent(this, CustomLayoutResultActivity.class);
        intent1.putExtra("content", "From button1 click!");
        PendingIntent pIntentButton1 = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.custom_layout_button1, pIntentButton1);

        Intent intent2 = new Intent(this, CustomLayoutResultActivity.class);
        intent2.putExtra("content", "From button2 click!");
        PendingIntent pIntentButton2 = PendingIntent.getActivity(this, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.custom_layout_button2, pIntentButton2);

        nm.notify(6, mBuilder.build());
    }
时间: 2024-08-23 07:22:29

Android:通知栏的使用的相关文章

Android通知栏版本兼容解决方案

Android通知栏是我们在APP中几乎必须使用到的,自定义通知栏给我们带来很多拓展性,但是我们在使用自定义通知栏时往往会遇到自定义通知栏和系统本身颜色.字体等不兼容的问题,本篇博客就重点讲解如何解决Android自定义通知栏在各Android系统的适配问题. 概述: 众所周知,Android通知有两种,默认通知与自定义通知. 默认通知栏通过调用系统接口就能实现,代码如下: new NotificationCompat.Builder(this) /* 状态栏相关 */ //状态栏显示的icon

android通知栏Notification点击,取消,清除响应事件

主要是检测android通知栏的三种状态的响应事件 这次在实现推送需求的时候,要用到android通知栏Notification点击后进入消息页面,因为要实现一个保存推送用户名字的功能,我在点击后处理了这个功能,但是测试发现我点击删除或者滑动清除后这个功能并没有执行,所以才意识到要处理删除和滑动清除的事件: 首先实现一个BroadcastReceiver public class NotificationBroadcastReceiver extends BroadcastReceiver {

Android通知栏的高度获取

public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; Field field = null; int x = 0, statusBarHeight = 0; try { c = Class.forName("com.android.internal.R$dimen"); obj = c.newInstance(); field = c.getF

Android通知栏介绍与适配总结

由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更多人的口味.本文总结了Android通知栏的版本迭代过程,在通知栏开发过程中所遇到的各种各样的坑,以及一些解决技巧,特别的,对于大众期盼的Android 7.0的到来,通知栏又会发生怎样的改变呢?接下来一一进行介绍. Android通知栏发展历史 首先来看一张各个Android版本通知栏消息的全家福

Android抽屉(SlidingDrawer --类似android通知栏下拉效果)

Android抽屉(SlidingDrawer)的实现发 - 红黑联盟http://www.2cto.com/kf/201301/182507.html 可动态布局的Android抽屉之基础http://blog.csdn.net/hellogv/article/details/6789698 android抽屉实现http://blog.csdn.net/wangkuifeng0118/article/details/7229200 Android 使用动画效果后的控件位置处理 类似系统通知栏

Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. 下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知.它是位于顶层可以展开的通知列表.它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等. (网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记.下面我就通过官方文档.源代码

Android 通知栏Notification的整合 全面学习 (一个DEMO让你全然了解它)

在android的应用层中.涉及到非常多应用框架.比如:Service框架,Activity管理机制,Broadcast机制.对话框框架.标题栏框架,状态栏框架.通知机制,ActionBar框架等等. 以下就来说说常常会使用到通知机制中的通知栏框架(Notificaiton).它适用于交互事件的通知.它是位于顶层能够展开的通知列表. 它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等. (网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头.随便当作回想笔记. 以下我就通过官方文档.

Android 通知栏Notification详解

在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. 下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知.它是位于顶层可以展开的通知列表.它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等. (网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记.下面我就通过官方文档.源代码

Android通知栏Notification的整合 全面学习

在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. 下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知.它是位于顶层可以展开的通知列表.它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等. (网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记.下面我就通过官方文档.源代码

如何解决android 通知栏不显示的问题

android 8.0 以后的版本,在创建通知栏的时候,加了一个channelId的东西.要想在上述版本中显示通知,总共分两步 1.创建Channel if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String channelId = "whatever"; //根据业务执行 String channelName = "whatever conent"; //这个是channelid 的解释,在安装