zoukankan      html  css  js  c++  java
  • 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());
        }


  • 相关阅读:
    基于vue-cli快速构建
    '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法
    js / ajax 成功提交后怎么跳转到另外一个页面?
    SpringMVC 拦截器不拦截静态资源的三种处理方式方法
    各种JSON的maven引用
    java版微信公众号支付(H5调微信内置API)
    阿里云MongoDB存储数据
    阿里RocketMq(TCP模式)
    Nginx 简单安装
    Redis-主从复制
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5129671.html
Copyright © 2011-2022 走看看