精华内容
下载资源
问答
  • 关闭常驻通知:左上角主界面----软件设置----通知栏图标,关闭。 希望可以帮到您!微笑为您解答,如果有什么问题还可以继续咨询哦!O(∩_∩)O 追问 这个方法应该是旧版本app的方法吧?我现在使用的是...

    2013-10-19 10:08提问者采纳
    您好,感谢您对金山网络的支持:
    
          关闭常驻通知:左上角主界面----软件设置----通知栏图标,关闭。
    
    希望可以帮到您!微笑为您解答,如果有什么问题还可以继续咨询哦!O(∩_∩)O
    追问

    这个方法应该是旧版本app的方法吧?我现在使用的是3.1.2版本,设置菜单如图所示,并没有“通知栏图标”这一项,而且也只在骚扰拦截和防御监控这两项里找到控制通知栏在拦截到骚扰信息/隐私行为时是否提醒的选项,常驻通知如何关闭还是没有发现

    回答
    新版在如下位置:主界面----设置----通知栏图标,关闭。最新的是有的,您尝试卸载手机毒霸,再次下载安装试试。
    提问者评价
    重装后还是这样,无法关闭。联系了金山才知道是因为4.3系统本身的原因无法隐藏常驻图标。望尽早优化
    浪涛_朵朵2014-1-1 20:29
    看我的评论回复
    浪涛_朵朵2014-1-1 20:27
    这是4.3为了让垃圾软件的后台进程无从遁形,这样恶意程序就容易被发现,当然如果属于正常的可信任程序,在应用程序管理器里面把相应程序“显示通知”的选项关闭,就不会在通知栏占地方了回复
    展开全文
  • Android通知栏微技巧,8.0系统中通知栏的适配

    万次阅读 多人点赞 2018-04-17 07:39:11
    大家好,今天我们继续来学习Android 8.0系统的适配。...在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配

    转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/79854070

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    大家好,今天我们继续来学习Android 8.0系统的适配。

    之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏。在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配

    那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配。

    其实在8.0系统之前,还有一次通知栏变动比较大的版本,就是5.0系统。关于5.0系统需要对通知栏进行适配的内容,我也整理了一篇文章,感兴趣的朋友可以去阅读 Android通知栏微技巧,那些你所没关注过的小细节

    那么下面我们就开始进入本篇文章的正题。


    为什么要进行通知栏适配?

    不得不说,通知栏真是一个让人又爱又恨的东西。

    通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是Android系统原创的,反而苹果在iOS 5之后也加入了类似的通知栏功能。

    通知栏的设计确实非常巧妙,它默认情况下不占用任何空间,只有当用户需要的时候用手指在状态栏上向下滑动,通知栏的内容才会显示出来,这在智能手机发展的初期极大地解决了手机屏幕过小,内容展示区域不足的问题。

    可是随着智能手机发展的逐渐成熟,通知栏却变得越来越不讨人喜欢了。各个App都希望能抢占通知栏的空间,来尽可能地宣传和推广自己的产品。现在经常是早上一觉醒来拿起手机一看,通知栏上全是各种APP的推送,不胜其烦。

    我个人虽然是Android应用开发者,但同时也是Android手机的资深用户。我已经使用了8年的Android手机,目前我对于通知栏的这种垃圾推送是零容忍的。现在每当我安装一个新的App时,我都会先到设置里面去找一找有没有推送开关,如果有的话我会第一时间把它关掉。而如果一个App经常给我推送垃圾信息却又无法关闭时,我会直接将它的通知总开关给关掉,如果还不是什么重要的App的话,那么我可能就直接将它卸载掉了。

    为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?很大一部分原因都是因为开发者没有节制地使用导致的。就好像App保活一样,直到今天还是不断有人问我该如何保活App,试想如何每个人都能保活自己的App,那么最终受害的人是谁?还不是使用Android手机的用户。大家的手机只会越来越卡,最后只想把手机丢掉,变成iPhone用户了。也是因为开发者没节制地使用,Android现在的每个版本都会不断收缩后台权限。

    回到通知栏上也是一样,每个开发者都只想着尽可能地去宣传自己的App,最后用户的手机就乱得跟鸡窝一样了。但是通知栏又还是有用处的,比如我们收到微信、短信等消息的时候,确实需要通知栏给我们提醒。因此分析下来,通知栏目前最大的问题就是,无法让用户对感兴趣和不感兴趣的消息进行区分。就比如说,我希望淘宝向我推送卖家发货和物流的相关消息,但是我不想收到那些打折促销或者是让我去买衣服的这类消息。那么就目前来说,是没有办法对这些消息做区分的,我要么同意接受所有消息,要么就屏蔽所有消息,这是当前通知栏的痛点。

    那么在Android 8.0系统中,Google也是从这个痛点开始下手的。

    8.0系统的通知栏适配

    从Android 8.0系统开始,Google引入了通知渠道这个概念。

    什么是通知渠道呢?顾名思义,就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。

    拥有了这些控制权之后,用户就再也不用害怕那些垃圾推送消息的打扰了,因为用户可以自主地选择自己关心哪些通知、不关心哪些通知。举个具体的例子,我希望可以即时收到支付宝的收款信息,因为我不想错过任何一笔收益,但是我又不想收到支付宝给我推荐的周围美食,因为我没钱只吃得起公司食堂。这种情况,支付宝就可以创建两种通知渠道,一个收支,一个推荐,而我作为用户对推荐类的通知不感兴趣,那么我就可以直接将推荐通知渠道关闭,这样既不影响我关心的通知,又不会让那些我不关心的通知来打扰我了。

    对于每个App来说,通知渠道的划分是非常需要仔细考究的,因为通知渠道一旦创建之后就不能再修改了,因此开发者需要仔细分析自己的App一共有哪些类型的通知,然后再去创建相应的通知渠道。这里我们来参考一下Twitter的通知渠道划分:

    可以看到,Twitter就是根据自己的通知类型,对通知渠道进行了非常详细的划分,这样用户的自主选择性就比较高了,也就大大降低了用户不堪其垃圾通知的骚扰而将App卸载的概率。


    我一定要适配吗?

    Google这次对于8.0系统通知渠道的推广态度还是比较强硬的。

    首先,如果你升级了appcompat库,那么所有使用appcompat库来构建通知的地方全部都会进行废弃方法提示,如下所示:

    上图告诉我们,此方法已废弃,需要使用带有通知渠道的方法才行。

    当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。

    好了,前面向大家介绍了这么多的背景知识,那么现在开始我们就正式进入正题,来学习一下如何进行8.0系统中通知栏的适配。

    创建通知渠道

    首先我们使用Android Studio来新建一个项目,就叫它NotificationTest吧。

    创建好项目之后,打开app/build.gradle文件检查一下,确保targetSdkVersion已经指定到了26或者更高,如下所示:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        defaultConfig {
            applicationId "com.example.notificationtest"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }

    可以看到,这里我在创建新项目的时候默认targetSdkVersion就是26,如果你是低于26的话,说明你的Android SDK有些老了,最好还是更新一下。当然如果你懒得更新也没关系,手动把它改成26就可以了。

    接下来修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                String channelId = "chat";
                String channelName = "聊天消息";
                int importance = NotificationManager.IMPORTANCE_HIGH;
                createNotificationChannel(channelId, channelName, importance);
    
                channelId = "subscribe";
                channelName = "订阅消息";
                importance = NotificationManager.IMPORTANCE_DEFAULT;
                createNotificationChannel(channelId, channelName, importance);
            }
        }
    
    
        @TargetApi(Build.VERSION_CODES.O)
        private void createNotificationChannel(String channelId, String channelName, int importance) {
            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }
    }

    代码不长,我来简单解释下。这里我们在MainActivity中创建了两个通知渠道,首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高,因为低版本的手机系统并没有通知渠道这个功能,不做系统版本检查的话会在低版本手机上造成崩溃。

    创建一个通知渠道的方式非常简单,这里我封装了一个createNotificationChannel()方法,里面的逻辑相信大家都看得懂。需要注意的是,创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数,其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为,当然这里只是初始状态下的重要等级,用户可以随时手动更改某个渠道的重要等级,App是无法干预的。

    上述代码我是模拟了这样一个场景。想象一下我们正在开发一个类似于微信的App,其中App通知主要可以分为两类,一类是我和别人的聊天消息,这类消息非常重要,因此重要等级我设为了IMPORTANCE_HIGH。另一类是公众号的订阅消息,这类消息不是那么重要,因此重要等级我设为了IMPORTANCE_DEFAULT。除此之外,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。

    现在就可以运行一下代码了,运行成功之后我们关闭App,进入到设置 -> 应用 -> 通知当中,查看NotificationTest这个App的通知界面,如下图所示:

    刚才我们创建的两个通知渠道这里已经显示出来了。可以看到,由于这两个通知渠道的重要等级不同,通知的行为也是不同的,聊天消息可以发出提示音并在屏幕上弹出通知,而订阅消息只能发出提示音。

    当然,用户还可以点击进去对该通知渠道进行任意的修改,比如降低聊天消息的重要等级,甚至是可以完全关闭该渠道的通知。

    至于创建通知渠道的这部分代码,你可以写在MainActivity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。


    让通知显示出来

    触发通知的代码和之前版本基本是没有任何区别的,只是在构建通知对象的时候,需要多传入一个通知渠道ID,表示这条通知是属于哪个渠道的。

    那么下面我们就来让通知显示出来。

    首先修改activity_main.xml中的代码,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送聊天消息"
            android:onClick="sendChatMsg"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送订阅消息"
            android:onClick="sendSubscribeMsg"
            />
    </LinearLayout>

    这里我们在布局文件中加入了两个按钮,很显然,一个是用于触发聊天消息渠道通知的,一个是用于触发订阅消息渠道通知的。

    接下来修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        public void sendChatMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "chat")
                    .setContentTitle("收到一条聊天消息")
                    .setContentText("今天中午吃什么?")
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.drawable.icon)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
                    .setAutoCancel(true)
                    .build();
            manager.notify(1, notification);
        }
    
        public void sendSubscribeMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "subscribe")
                    .setContentTitle("收到一条订阅消息")
                    .setContentText("地铁沿线30万商铺抢购中!")
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.drawable.icon)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
                    .setAutoCancel(true)
                    .build();
            manager.notify(2, notification);
        }
    }

    这里我们分别在sendChatMsg()和sendSubscribeMsg()方法中触发了两条通知,创建通知的代码就不再多做解释了,和传统创建通知的方法没什么两样,只是在NotificationCompat.Builder中需要多传入一个通知渠道ID,那么这里我们分别传入了chat和subscribe这两个刚刚创建的渠道ID。

    现在重新运行一下代码,并点击发送聊天消息按钮,效果如下图所示:

    由于这是一条重要等级高的通知,因此会使用这种屏幕弹窗的方式来通知用户有消息到来。然后我们可以下拉展开通知栏,这里也能查看到通知的详细信息:

    用户可以通过快速向左或者向右滑动来关闭这条通知。

    接下来点击发送订阅消息按钮,你会发现现在屏幕上不会弹出一条通知提醒了,只会在状态栏上显示一个小小的通知图标:

    因为订阅消息通知的重要等级是默认级别,这就是默认级别通知的展示形式。当然我们还是可以下拉展开通知栏,查看通知的详细信息:

    不过上面演示的都是通知栏的传统功能,接下来我们看一看Android 8.0系统中通知栏特有的功能。

    刚才提到了,快速向左或者向右滑动可以关闭一条通知,但如果你缓慢地向左或者向右滑动,就会看到这样两个按钮:

    其中,左边那个时钟图标的按钮可以让通知延迟显示。比方说这是一条比较重要的通知,但是我暂时没时间看,也不想让它一直显示在状态栏里打扰我,我就可以让它延迟一段后时间再显示,这样我就暂时能够先将精力放在专注的事情上,等过会有时间了这条通知会再次显示出来,我不会错过任何信息。如下所示:

    而右边那个设置图标的按钮就可以用来对通知渠道进行屏蔽和配置了,用户对每一个App的每一个通知渠道都有绝对的控制权,可以根据自身的喜好来进行配置和修改。如下所示:

    比如说我觉得订阅消息老是向我推荐广告,实在是太烦了,我就可以将订阅消息的通知渠道关闭掉。这样我以后就不会再收到这个通知渠道下的任何消息,而聊天消息却不会受到影响,这就是8.0系统通知渠道最大的特色。

    另外,点击上图中的所有类别就可以进入到当前应用程序通知的完整设置界面。


    管理通知渠道

    在前面的内容中我们已经了解到,通知渠道一旦创建之后就不能再通过代码修改了。既然不能修改的话那还怎么管理呢?为此,Android赋予了开发者读取通知渠道配置的权限,如果我们的某个功能是必须按照指定要求来配置通知渠道才能使用的,那么就可以提示用户去手动更改通知渠道配置。

    只讲概念总是不容易理解,我们还是通过具体的例子来学习一下。想一想我们开发的是一个类似于微信的App,聊天消息是至关重要的,如果用户不小心将聊天消息的通知渠道给关闭了,那岂不是所有重要的信息全部都丢了?为此我们一定要保证用户打开了聊天消息的通知渠道才行。

    修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        public void sendChatMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = manager.getNotificationChannel("chat");
                if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
                    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
                    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
                    intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
                    startActivity(intent);
                    Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();
                }
            }
    
            Notification notification = new NotificationCompat.Builder(this, "chat")
                    ...
                    .build();
            manager.notify(1, notification);
        }
    
        ...
    
    }

    这里我们对sendChatMsg()方法进行了修改,通过getNotificationChannel()方法获取到了NotificationChannel对象,然后就可以读取该通知渠道下的所有配置了。这里我们判断如果通知渠道的importance等于IMPORTANCE_NONE,就说明用户将该渠道的通知给关闭了,这时会跳转到通知的设置界面提醒用户手动打开。

    现在重新运行一下程序,效果如下图所示:

    可以看到,当我们将聊天消息的通知渠道关闭后,下次再次发送聊天消息将会直接跳转到通知设置界面,提醒用户手动将通知打开。

    除了以上管理通知渠道的方式之外,Android 8.0还赋予了我们删除通知渠道的功能,只需使用如下代码即可删除:

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.deleteNotificationChannel(channelId);

    但是这个功能非常不建议大家使用。因为Google为了防止应用程序随意地创建垃圾通知渠道,会在通知设置界面显示所有被删除的通知渠道数量,如下图所示:

    这样是非常不美观的,所以对于开发者来说最好的做法就是仔细规划好通知渠道,而不要轻易地使用删除功能。


    显示未读角标

    前面我们提到过,苹果是从iOS 5开始才引入了通知栏功能,那么在iOS 5之前,iPhone都是怎么进行消息通知的呢?使用的就是未读角标功能,效果如下所示:

    实际上Android系统之前是从未提供过这种类似于iOS的角标功能的,但是由于很多国产手机厂商都喜欢跟风iOS,因此各种国产手机ROM都纷纷推出了自己的角标功能。

    可是国产手机厂商虽然可以订制ROM,但是却没有制定API的能力,因此长期以来都没有一个标准的API来实现角标功能,很多都是要通过向系统发送广播来实现的,而各个手机厂商的广播标准又不一致,经常导致代码变得极其混杂。

    值得高兴的是,从8.0系统开始,Google制定了Android系统上的角标规范,也提供了标准的API,长期让开发者头疼的这个问题现在终于可以得到解决了。

    那么下面我们就来学习一下如何在Android系统上实现未读角标的效果。

    修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        @TargetApi(Build.VERSION_CODES.O)
        private void createNotificationChannel(String channelId, String channelName, int importance) {
            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            channel.setShowBadge(true);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }
    
        public void sendSubscribeMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "subscribe")
                    ...
                    .setNumber(2)
                    .build();
            manager.notify(2, notification);
        }
    }

    可以看到,这里我们主要修改了两个地方。第一是在创建通知渠道的时候,调用了NotificationChannel的setShowBadge(true)方法,表示允许这个渠道下的通知显示角标。第二是在创建通知的时候,调用了setNumber()方法,并传入未读消息的数量。

    现在重新运行一下程序,并点击发送订阅消息按钮,然后在Launcher中找到NotificationTest这个应用程序,如下图所示:

    可以看到,在图标的右上角有个绿色的角标,说明我们编写的角标功能已经生效了。

    需要注意的是,即使我们不调用setShowBadge(true)方法,Android系统默认也是会显示角标的,但是如果你想禁用角标功能,那么记得一定要调用setShowBadge(false)方法。

    但是未读数量怎么没有显示出来呢?这个功能还需要我们对着图标进行长按才行,效果如下图所示:

    这样就能看到通知的未读数量是2了。

    可能有些朋友习惯了iOS上的那种未读角标,觉得Android上这种还要长按的方式很麻烦。这个没有办法,因为这毕竟是Android原生系统,Google没有办法像国内手机厂商那样可以肆无忌惮地模仿iOS,要不然可能会吃官司的。但是我相信国内手机厂商肯定会将这部分功能进行定制,风格应该会类似于iOS。不过这都不重要,对于我们开发者来说,最好的福音就是有了统一的API标准,不管国内手机厂商以后怎么定制ROM,都会按照这个API的标准来定制,我们只需要使用这个API来进行编程就可以了。

    好的,关于Android 8.0系统适配的上下两篇文章到这里就结束了,感谢大家阅读。

    文章中的示例源码点击 这里 下载。

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

    20160507110203928         20161011100137978

    展开全文
  • NotificationCompat.PRIORITY_LOW 收缩在通知块中,不会显示全部,点击通知栏后,才会显示 通知栏关闭音效:channel.setSound(null, null); 在notification中:.setSound(null) 再将chanel_idchanel_name换一个唯一...
        builder.setPriority(NotificationCompat.PRIORITY_LOW);
    

    NotificationCompat.PRIORITY_LOW 收缩在通知块中,不会显示全部,点击通知栏后,才会显示

    • 通知栏关闭音效:channel.setSound(null, null); 在notification中:.setSound(null)
      再将chanel_idchanel_name换一个唯一的,这样就ok了 常驻通知栏: NotificationManager
      notificationManager= (NotificationManager)
      context.getSystemService(Context.NOTIFICATION_SERVICE);//常驻通知栏

      普通的就设置:Context.NOTIFICATION_SERVICE

    
    
    public class NotificationHelper {
        private static final String CHANNEL_ID="channel_id";   //通道渠道id
        public static final String  CHANEL_NAME="chanel_name"; //通道渠道名称
        private static SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
    
    
        @TargetApi(Build.VERSION_CODES.O)
        public static  void  show(Context context){
            NotificationChannel channel = null;
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                //创建 通知通道  channelid和channelname是必须的(自己命名就好)
                channel = new NotificationChannel(CHANNEL_ID, CHANEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
                channel.enableLights(true);//是否在桌面icon右上角展示小红点
                channel.setLightColor(Color.GREEN);//小红点颜色
                channel.setShowBadge(false); //是否在久按桌面图标时显示此渠道的通知
            }
            Notification notification;
            //获取Notification实例   获取Notification实例有很多方法处理    在此我只展示通用的方法(虽然这种方式是属于api16以上,但是已经可以了,毕竟16以下的Android机很少了,如果非要全面兼容可以用)
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                //向上兼容 用Notification.Builder构造notification对象
    
                notification = new Notification.Builder(context,CHANNEL_ID)
                        .setContentTitle("通知栏标题1")
                        .setContentText("这是消息通过通知栏的内容1")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.ic_launcher_background)
                        .setColor(Color.parseColor("#FEDA26"))
                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
                        .setTicker("巴士门1")
                        .build();
            }else {
                //向下兼容 用NotificationCompat.Builder构造notification对象
                notification = new NotificationCompat.Builder(context)
                        .setContentTitle("通知栏标题1")
                        .setContentText("这是消息通过通知栏的内容1")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.ic_launcher_background)
                        .setColor(Color.parseColor("#FEDA26"))
                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
                        .setTicker("巴士门1")
                        .build();
    
            }
       notification.flags=Notification.FLAG_AUTO_CANCEL;//取消通知栏
            Intent intent=new Intent(context,MainActivity.class);
            intent.putExtra("message",":"+sdf.format(new Date()));
            //用当前时间充当通知的id,这里是为了区分不同的通知,如果是同一个id,前者就会被后者覆盖
            int requestId=(int) new Date().getTime();
            //第一个参数连接上下文的context
            // 第二个参数是对PendingIntent的描述,请求值不同Intent就不同
            // 第三个参数是一个Intent对象,包含跳转目标
            // 第四个参数有4种状态
            PendingIntent pendingIntent=PendingIntent.getActivity(context,requestId,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    //        builder.setContentIntent(pendingIntent);
    
            notification.contentIntent=pendingIntent;
            //发送通知
            int  notifiId=1;
            //创建一个通知管理器
            NotificationManager   notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                notificationManager.createNotificationChannel(channel);
            }
            notificationManager.notify(notifiId,notification);
        }
    }
    
    

    调用的时候,只需要:NotificationHelper.show(this);
    原地址:https://blog.csdn.net/zheglei/article/details/79869689#commentBox,在他的基础上,添加了一个跳转事件

    创建多个图标及图标对应的事件跳转:

    public class NotificationHelper {
    
        private static final String CHANNEL_ID="channel_id";   //通道渠道id
        public static final String  CHANEL_NAME="chanel_name"; //通道渠道名称
        private static SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        private static int  notifiId=1;
    
    
        @TargetApi(Build.VERSION_CODES.O)
        public static  void  show(Context context){
            NotificationChannel channel = null;
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                //创建 通知通道  channelid和channelname是必须的(自己命名就好)
                channel = new NotificationChannel(CHANNEL_ID, CHANEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
                channel.enableLights(true);//是否在桌面icon右上角展示小红点
                channel.setLightColor(Color.GREEN);//小红点颜色
                channel.setShowBadge(false); //是否在久按桌面图标时显示此渠道的通知
            }
            Notification notification;
            //获取Notification实例   获取Notification实例有很多方法处理    在此我只展示通用的方法(虽然这种方式是属于api16以上,但是已经可以了,毕竟16以下的Android机很少了,如果非要全面兼容可以用)
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                //向上兼容 用Notification.Builder构造notification对象
    
                RemoteViews remoteView = new RemoteViews(getPackageName(), R.layout.item_notification);
                Intent intent0 = new Intent(context, ScanRubbishActivity.class);//垃圾清理
    
                Intent intent1 = new Intent(context, MusicDetailActivity.class);//文件管理
                intent1.putExtra("type","1");
                intent1.putExtra("title","文件管理");
    
                Intent intent2 = new Intent(context, MusicDetailActivity.class);//安装包管理/app管理
                intent2.putExtra("type","2");
                intent2.putExtra("title","安装包");
    
                Intent intent3 = new Intent(context, MusicDetailActivity.class);//微信专清
                intent3.putExtra("type","3");
                intent3.putExtra("title","其他");
    
    //            int requestId=(int) new Date().getTime();
    //				0、1、2是为了防止Intent一样,造成获取不了不一样的pendingIntent,pengdingIntent不一样就可以
    //				设置不一样的跳转事件;
                int requestId=1;
                PendingIntent pendingIntentClear=PendingIntent.getActivity(context,requestId,
                        intent0,PendingIntent.FLAG_UPDATE_CURRENT);
                PendingIntent pendingIntentFile=PendingIntent.getActivity(context,0,
                        intent1,PendingIntent.FLAG_UPDATE_CURRENT);
                PendingIntent pendingIntentApp=PendingIntent.getActivity(context,1,
                        intent2,PendingIntent.FLAG_UPDATE_CURRENT);
                PendingIntent pendingIntentWchat=PendingIntent.getActivity(context,2,
                        intent3,PendingIntent.FLAG_UPDATE_CURRENT);
    
    //            remoteView.setImageViewResource(R.id.notifi_ic_img_clear,R.drawable.icon_clean_normal);
    //            remoteView.setImageViewResource(R.id.notifi_ic_img_file,R.drawable.fun_fiction);
    //            remoteView.setTextColor(R.id.re_text, Color.RED);
    //            remoteView.setTextViewText(R.id.re_text, "remote view demo");
    //            remoteView.setImageViewResource(R.id.re_image, R.drawable.btn_me_share);
                remoteView.setOnClickPendingIntent(R.id.notifi_ic_img_clear, pendingIntentClear);
    
                remoteView.setOnClickPendingIntent(R.id.notifi_ic_img_file,pendingIntentFile);
    
                remoteView.setOnClickPendingIntent(R.id.notifi_ic_img_app, pendingIntentApp);
    
                remoteView.setOnClickPendingIntent(R.id.notifi_ic_img_wchat, pendingIntentWchat);
    
                notification = new Notification.Builder(context,CHANNEL_ID)
                        .setCustomContentView(remoteView)
    //                    .setContentTitle("通知栏标题1")
    //                    .setContentText("这是消息通过通知栏的内容1")
    //                    .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.ic_launcher_background)
    //                    .setColor(Color.parseColor("#FEDA26"))
    //                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
    //                    .setTicker("巴士门1")
    //                    .setContentIntent(pendingIntentClear)
                        .build();
    
    
                Log.d("-------", "show: ");
            }else {
                //向下兼容 用NotificationCompat.Builder构造notification对象
                notification = new NotificationCompat.Builder(context)
                        .setContentTitle("通知栏标题1")
                        .setContentText("这是消息通过通知栏的内容1")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.ic_launcher_background)
                        .setColor(Color.parseColor("#FEDA26"))
                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
                        .setTicker("巴士门1")
                        .build();
    
            }
    
    //        Intent intent=new Intent(context,MainActivity.class);
    //        intent.putExtra("message",":"+sdf.format(new Date()));
    //        //用当前时间充当通知的id,这里是为了区分不同的通知,如果是同一个id,前者就会被后者覆盖
    //        int requestId=(int) new Date().getTime();
    //        //第一个参数连接上下文的context
    //        // 第二个参数是对PendingIntent的描述,请求值不同Intent就不同
    //        // 第三个参数是一个Intent对象,包含跳转目标
    //        // 第四个参数有4种状态
    //        PendingIntent pendingIntent=PendingIntent.getActivity(context,requestId,
    //                intent,PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pendingIntent);
    
    //        notification.contentIntent=pendingIntent;
            //发送通知
            //创建一个通知管理器
            NotificationManager   notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);//常驻通知栏
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
                notificationManager.createNotificationChannel(channel);
            }
            notificationManager.notify(1,notification);
        }
    
        public static boolean checkNotifySetting(Context context) {
            NotificationManagerCompat manager = NotificationManagerCompat.from(context);
            // areNotificationsEnabled方法的有效性官方只最低支持到API 19,低于19的仍可调用此方法不过只会返回true,即默认为用户已经开启了通知。
            return manager.areNotificationsEnabled();
        }
    
    }
    
    
    
    展开全文
  • oppo 通知栏权限关闭官方解释

    千次阅读 2019-09-20 13:42:35
    15、我集成了OPPOPUSH,为什么通知栏权限是关闭的? 目前通知栏权限默认关闭,需要用户手动开启, 建议在APP内做弹框提示,引导用户手动开启应用通知权限。 问题:我发现部分app 比如抖音 西瓜视频 喜马拉雅 应用...

    15、我集成了OPPO PUSH,为什么通知栏权限是关闭的?

    目前通知栏权限默认关闭,需要用户手动开启,

    建议在APP内做弹框提示,引导用户手动开启应用通知权限。

    问题:我发现部分app 比如抖音 西瓜视频 喜马拉雅 应用启动通知栏权限默认都是开启的. 不知道他们怎么绕过这个问题的

     

    展开全文
  • 当APP有推送功能时,需要判断当前app在手机中是否开启了允许消息推送,否则即使添加了推送代码仍然收不到通知,所以需要要么跳转至设置界面设置,要么自定义消息通知。 效果图 方法一:跳转到应用程序设置界面...
  • Android 音乐播放器的通知栏

    千次阅读 2017-10-05 11:52:03
    我点击×按钮会关闭通知栏和应用, 点击停止按钮会在界面显示停止并且这个按钮的图片换成播放图片,再点击一次界面显示播放,且图片换回来 点击上一首和下一首按钮会在界面上分别显示上一首和下一首的字符串。制作...
  • 通知栏Notification和常驻通知栏

    千次阅读 2017-07-25 10:56:24
    通知栏Notification和常驻通知栏: &&.普通Notification 一、整体步骤 //1.获取通知栏管理器实例 NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); ...
  • Android 判断通知栏权限的问题

    千次阅读 2018-08-10 09:36:23
    关闭通知栏权限后,应用将无法弹出toast以及Notification通知栏 判断应用的通知栏权限是否关闭的代码如下:     public class NotificationsUtils {   private static fin...
  • 常驻通知栏

    千次阅读 2019-08-13 13:06:45
    常驻通知栏 设置一个默认通知栏 不废话,上代码 //创建一个通知管理器 NotificationManager notificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 获取Notification...
  • Android系统有个通知栏的管理,里面可以对app的通知栏进行关闭或者开启,现在需要开启自己App的通知栏,要如何通过代码开启呢。。
  • 1.win + s 键 搜索系统图标 2.关闭操作中心
  • 问题:播放时设置服务前台运行,创建一个消息通知栏 service.startForeground(NOTIFICATION_ID, new Notification()); 解决办法:服务停止在前台运行,再清空通知栏 service.stopForeground(true); ...
  • 安卓8.0通知栏适配

    2018-09-09 20:50:07
    一、谷歌为什么在安卓8.0对通知栏进行修改  系统通知栏作为除桌面启动图标之外的唯一入口,对app的日活起到非常重要的作用,因此各个app开发商都希望能抢占用户的通知栏。随着移动端的普及和安卓手机存储容量的...
  • Android 实现点击清理通知而不清理通知栏的通知解决办法 NotificationCompat.Builder builder=new NotificationCompat.Builder(appContext, CHANNEL_ID) .setSmallIcon(appContext.getApplicationInfo().icon) ...
  • Android自定义通知栏显示

    千次阅读 2018-03-09 15:13:37
    本文主要想说一下android项目开发中经常会使用到通知机制中的通知栏框架(Notificaiton)。通知栏位于设备的顶层,可以展开的通知列表。通知栏的主要作用大概可以分为三大块: 显示未读的消息(短信消息、QQ、微信...
  • android设备在系统通知栏处提示有新消息,同时也有声音通知
  • 通知栏声音的开启与关闭

    千次阅读 2015-09-09 11:22:28
    问题引出:在项目中牵涉到设置,里面有对...来开启声音,那么关闭就应该用类似notification.defaults = null; 这样的方式,但是查到的资料发现没有这么用的。 2、因为牵涉到推送的功能,所以难免要看第三方推送给出的de
  • android 发音乐通知到通知栏

    千次阅读 2019-11-02 08:40:33
    我们以音乐播放器为例子做一个通知到通知栏(并且我们要求点击按钮切换通知栏按钮状态并做切歌的操作) 我们先写一个广播 public class XMPlayerReceiver extends BroadcastReceiver { public static final ...
  • 实现这个需求不难,但是在SystemUI/src/com/mediatek/systemui/qs/tiles/MobileDataTile.java里添加个对话框时,点击关闭数据连接会发现弹框被下拉通知栏挡住了,因为下拉通知栏是system dialog,而alertdialog是...
  • private String adChannelDesc = "这是一个广告通知,可以关闭的,但是如果您希望我们做出更好的软件服务于你,请打开广告支持一下吧"; private int adChannelImportance = NotificationManager.IMPORTANCE_LOW; ...
  • 本文转载自郭霖大神的文章,转载...之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏。在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋...
  • 点击通知栏启动程序

    2017-01-04 17:28:28
    大概就是点击通知栏后打开未关闭的程序 就和点击应用的图标启动是一样的private void StartApp(Context cont){ Intent intent = new Intent(Intent.ACTION_MAIN); intent.setAction(Intent.ACTION_MAIN); intent...
  • startForeground如何去除通知栏

    千次阅读 2016-03-17 10:05:21
    写app的时候经常希望某个...但是从android 5.0开始,前台运行的service必须在通知栏有一个常驻通知,点都点不掉,试想一下如果每个app都在通知栏有一个常驻通知的恐怖场景。。。 那么有没有办法去除掉这个常驻通
  • 1、通过NotificationListenerService获取通知栏内容: NotificationListenerService是系统提供的监听通知栏服务,我们需要继承此服务实现自己的逻辑,代码如下: public class MyNotificationListenerService ...
  • Android通知栏与界面沟通需求: 当收到新消息时,显示通知栏; 点击通知栏,无论在哪个页面,都需要跳转到消息界面; 当app在后台运行的时候也能收到通知,并且点击通知能够将app在前台显示,并跳转到消息界面; 当...
  • android通知栏的消息通知(Notification)

    千次阅读 2017-03-19 10:44:56
    转载请注明出处:http://blog.csdn.net/xiaohao0724/article/details/63682146在...通知栏消息通知的使用步骤一般可以分为以下步骤: 1. 首先需要一个NotificationManager对通知进行管理 2. 为了兼容低版本使用v4包
  • 今天早上看到郭霖大神公众号推送了一篇文章:Android 8.0的通知栏适配,自己做个记录我们知道,Android 8.0系统的最大改进就是通知栏适配和应用图标,关于应用图标的适配在后续文章中记录,现在先记录一下通知栏的...
  • Android 8.0 通知栏的详细问题可以参考此篇博客: https://blog.csdn.net/guolin_blog/article/details/79854070 此篇博客仅为个人日后回忆所用: 首先在8.0以后 通知栏的使用 需要与NotificationChannel配合着...
  • 通知栏的安卓音乐播放器

    热门讨论 2014-08-11 10:55:52
    实现了类似天天动听的通知栏管理音乐功能,有上一首、下一首、播放、暂停、关闭应用,实现中用到了IntentService、BroadcastReceiver、Application、Notification等,对安卓进阶很有帮助,当然项目只是个demo,还有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,771
精华内容 21,908
关键字:

如何关闭通知栏