Android自定义状态栏通知(Status Notification)的正确实现

Android样式和主题 4、Style样式是可以继承的,通过style标签中的parent属性指定新定义的样式所继承的样式。ActionBar又称之为操作栏,操作栏是Android 系统在3.0以后的SDK中引入的,操作栏的作用是取代标题栏,操作栏和标题栏一样紧挨在状态栏的下方。5、自定义的Style样式继承:可以通过”.“符号进行自定义的属性继承,在继承的基础上,进行属性的自定义修改。6、设计style样式的目的:在复杂多样式的控件使用和项目应用中,保持统一的格式和展现效果,同时降低维护成本。 阅读详情

在Android应用开发中,经常会使用到状态栏通知(Status Notification),例如新浪微博、网易新闻等提供的推送消息,软件后台更新时进度的显示等等,如下图所示:

看了网上很多关于Notification的博客文章,发现几乎没有一个能将自定义状态栏通知完全实现正确的,因此,本文就来说说实现自定义状态栏通知经常被忽略的一些知识点。


1) 使用Notification最常见的场景

运行在后台的Service当需要和用户交互时,由于它不能直接启动一个Activity,因此,Service必须使用Notification来间接的启动Activity(当用户点击Notification时跳转)。


2) 自定义布局文件支持的控件类型

Notification的自定义布局是RemoteViews,因此,它仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件,同时支持AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些UI控件。对于其他不支持的控件,使用时将会抛出ClassNotFoundException异常。


3) Notification支持的Intent类型(都是PendingIntent类的实例)

contentIntent:在通知窗口区域,Notification被单击时的响应事件由该intent触发;

deleteIntent:在通知窗口区域,当用户点击全部清除按钮时,响应该清除事件的Intent;

fullScreenIntent:响应紧急状态的全屏事件(例如来电事件),也就是说通知来的时候,跳过在通知区域点击通知这一步,直接执行fullScreenIntent代表的事件。

上面三种PendingIntent可以拉起Activity、Service和BroadcastReceiver,如图所示:


4) 状态栏通知字体的设置

不同的手机,不同的Android平台版本,状态栏通知窗口的背景颜色可能千差万别,例如Android2.3之前的版本通知窗口默认背景是白色的,Android4.0之后的版本通知窗口背景默认是黑色的,这就需要在设置Notification的字体时加以区别,否则,很容易导致通知的字体颜色和背景色一样,从而看不到字体部分,市面上很多app就存在这个问题。如下图所示,华为智汇云和百度音乐这两款应用就明显存在这个问题。


从Android2.3(API level 9)开始,系统为默认通知栏布局的字体定义了样式如下:

"android:TextAppearance.StatusBar.EventContent"

"android:TextAppearance.StatusBar.EventContent.Title"

因此,在2.3之后的版本中我们自定义布局文件中的字体直接应用这个样式就可以。对于2.3之前的版本,由于背景色是白色的,因此,我们使用如下系统预定义样式指定字体的颜色:

?android:attr/textColorPrimary

因此,在res的values目录下定义styles.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="NotificationText">
        <item name="android:textColor">?android:attr/textColorPrimary</item>
    </style>

    <style name="NotificationTitle">
        <item name="android:textColor">?android:attr/textColorPrimary</item>
        <item name="android:textStyle">bold</item>
    </style>

</resources>

在res的values-v9目录下定义styles.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />

    <style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />

</resources>

自定义通知布局文件使用styles文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:ignore="ContentDescription" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5.0dp"
        android:layout_marginRight="10.0dp" />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/image" >

        <TextView
            android:id="@+id/title"
            style="@style/NotificationTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/text"
            style="@style/NotificationText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/title" />
    </RelativeLayout>

</RelativeLayout>



C++中size()与length()函数深度解析:从STL容器到字符串处理 在C++编程中,容器和字符串操作是基础且高频的技术点。理解STL(标准模板库)的设计哲学,掌握其提供的统一接口,是编写高效、健壮代码的关键。容器通过`size()`函数提供了一种泛型编程的通用标尺,它返回无符号整数类型`size_t`,用于获取元素数量,这一设计支撑了迭代器和算法库的协同工作。而字符串作为特殊序列,除了`size()`外还提供了`length()`函数,两者在功能上完全一致,但`length()`更符合“字符串长度”的语义直觉,体现了接口设计中对历史习惯和代码可读性的考量。在实际工程中,正确 阅读详情

相关推荐

C++模板编程:从泛型基础到元编程实战

泛型编程是现代软件开发中提升代码复用性和类型安全性的核心技术,它允许开发者编写与具体数据类型无关的通用算法和数据结构。其核心原理是通过参数化类型,在编译时生成针对特定类型的优化代码,从而在保证类型安全的同时避免运行时开销。这一技术为构建高性能基础库和框架提供了基础,广泛应用于容器、算法库和系统级软件开发中。C++模板作为泛型编程的主要实现机制,通过函数模板、类模板、特化等特性,支持从简单泛型函数到复杂元编程的各类场景。本文以C++模板为例,深入解析模板元编程和类型萃取等高级主题,帮助开发者掌握这一提升代码质

weixin_30675247的博客 440

Android——8种通知栏-超简单自定义

做一个类似酷狗音乐播放通知栏,轻而易举~~~

GSLS 2万+

模板调用规则全解析:从C++到Vue.js的高效实践指南

模板技术作为实现代码复用和逻辑抽象的核心机制,其本质是通过预定义的结构或逻辑蓝图,在调用时填充具体内容来生成最终结果。其核心原理在于分离变化与不变的部分,通过参数传递、作用域管理和特定的解析渲染规则来实现动态内容生成。这一技术在提升开发效率、保证一致性方面具有重要价值,广泛应用于泛型编程、前端组件化和服务端页面渲染等场景。本文聚焦于模板的调用规则,深入探讨了C++模板的编译期实例化与SFINAE机制、Vue.js模板的响应式数据绑定原理,以及Jinja2等模板引擎的上下文渲染规则,并针对常见的性能瓶颈和晦涩

weixin_30628801的博客 460

android 自定义通知栏

/自定义的布局视图。一、创建通知栏布局文件 view_notification_layout.xml。// .setContentText("您有一项新活动")//.setContent(views)//设置布局。// .setContentTitle("活动")

kk3087961的博客 998

C++模板编程:从基础到进阶,掌握元编程核心机制

C++模板是一种编译期代码生成机制,它通过类型参数化实现泛型编程,在编译时根据具体类型生成特化代码。其核心原理是模板实例化,编译器依据提供的类型或值将模板蓝图转化为具体函数或类。这一机制带来的技术价值在于实现了类型安全与零开销抽象,避免了运行时多态的性能损耗,是构建高性能通用库的基石。在应用场景上,模板广泛应用于STL容器、算法、智能指针等基础组件,以及元编程、编译期计算等高级领域。本文聚焦C++模板的深度解析,涵盖函数模板、类模板、模板特化、变参模板等核心概念,并探讨了现代C++中Concepts、SFI

weixin_33831196的博客 580

Google CEL-CPP:安全高效的C++表达式语言,构建动态规则引擎

表达式语言是一种用于动态计算和逻辑判断的领域特定语言,它允许程序在运行时解析和执行外部输入的代码片段,而无需修改和重新编译主程序。其核心原理在于将字符串形式的表达式解析为抽象语法树,并在一个受控的沙箱环境中进行类型检查和求值,从而在灵活性和安全性之间取得平衡。这种技术的核心价值在于实现了业务逻辑的动态化与配置化,极大地提升了系统的可扩展性和运维效率。在工程实践中,它被广泛应用于需要动态策略的场景,例如风控系统的实时规则判断、微服务网关的请求路由决策、低代码平台的自定义计算逻辑以及游戏服务器的行为验证等。Go

weixin_34341229的博客 385

C++11四大核心特性深度解析:auto、lambda、constexpr与nullptr

C++11标志着C++从底层控制迈向现代系统编程的关键跃迁,其核心并非语法糖,而是编译器语义理解能力的质变。auto实现基于模板推导的类型自动识别,lambda构建具有确定内存布局的闭包对象,constexpr确立编译期求值的严格契约,nullptr则以std::nullptr_t类型终结空指针的类型歧义。这些特性共同提升了类型安全、零开销抽象与编译期计算能力,在嵌入式开发、TensorRT部署、实时系统及跨平台工程中构成稳定底座。本文聚焦真实项目中的认知断层——如GCC 4.6兼容性、VS Code配置陷

weixin_30443075的博客 387

Claude AI助手与编译器区别解析:智能编程实践指南

编译器作为编程基础工具,通过词法分析、语法分析和代码生成将高级语言转换为机器可执行代码,确保程序正确性。而AI编程助手基于自然语言处理技术,能够理解开发者意图并生成代码片段。在工程实践中,Claude这类智能助手通过代码生成、调试分析和优化建议等核心功能,显著提升开发效率。特别是在快速原型开发、技术栈迁移和复杂问题求解等应用场景中,AI助手与编译器形成互补协作关系。本文重点解析Claude在代码调试和智能代码生成方面的独特价值,帮助开发者正确理解其在软件开发流程中的定位。

weixin_30755393的博客 364

C++与Python工程选型:性能边界与开发效率的权衡指南

编程语言选型本质是运行时模型与工程目标的匹配问题。C++提供确定性内存控制和零开销抽象,适用于实时系统、嵌入式及CPU密集型场景;Python凭借动态类型、自动内存管理和丰富生态,在快速迭代、数据管道与胶水层开发中具备不可替代性。理解二者在编译/解释机制、内存模型(手动管理 vs 引用计数+分代GC)及并发模型(无GIL限制 vs GIL约束)上的根本差异,才能避免将性能瓶颈错误归因于语言本身。真实项目决策需聚焦延迟敏感度、开发速度、运维成本与团队能力四维平衡,而非语法优劣。本文结合高频交易、边缘计算与大数

weixin_38170862的博客 474

C++ Primer高效学习指南:从环境搭建到项目实战

C++作为一门支持面向对象、泛型和过程式编程的系统级语言,其核心在于对内存、类型系统和性能的精细控制。理解其底层原理,如对象生命周期管理、模板元编程和RAII(资源获取即初始化)机制,是掌握现代C++开发的关键。这些技术价值体现在能够构建高性能、资源可控且类型安全的复杂系统软件。在嵌入式开发、游戏引擎、高频交易等对性能和资源有严苛要求的应用场景中,C++的这些特性尤为重要。本文以经典教材《C++ Primer》为蓝本,聚焦于**智能指针**和**移动语义**等现代C++核心特性,提供一套从环境配置、概念梳理

weixin_30394981的博客 398

C++实现编译器前端:从词法分析到四元式生成的完整实践

编译原理是计算机科学的核心基础,它研究如何将高级编程语言转换为计算机可执行的机器代码。其核心流程包括词法分析、语法分析和中间代码生成。词法分析通过有限状态自动机将源代码字符串切分为有意义的单词(Token);语法分析则依据文法规则,使用递归下降等方法构建抽象语法树(AST),以描述程序结构;最终,中间代码生成阶段将AST转换为如四元式等接近机器指令的表示形式,为后续优化和代码生成奠定基础。掌握这些原理对于深入理解编程语言设计、提升系统编程能力至关重要。本文通过一个具体的C++实践项目,详细展示了如何不依赖L

weixin_30642869的博客 347

C++模板进阶:从编译期计算到变参模板实战

C++模板是支持泛型编程的核心机制,它允许编写独立于特定数据类型的代码,实现高度的代码复用。其原理在于编译器在编译时根据提供的类型参数生成具体的代码实例,这一过程称为模板实例化。这种编译期多态的技术价值在于能够实现零开销的抽象,消除运行时虚函数调用等开销,从而生成高度优化的机器码。在应用场景上,模板技术广泛应用于标准库容器(如vector、map)、算法(如sort、find)以及需要高性能和类型安全的通用组件开发中。本文聚焦于C++模板的进阶应用,深入探讨模板元编程、编译期计算、类型萃取、策略模式与CRT

weixin_34357887的博客 454

Godot 4 GDScript数据类型全解析:从Variant到PackedArray的性能优化实践

在游戏开发中,数据类型是构建一切逻辑的基石,它定义了数据的存储、操作与交互方式。理解其原理,对于编写高效、健壮的代码至关重要。GDScript作为Godot引擎的动态脚本语言,其核心在于Variant这一通用容器类型,它实现了脚本灵活性与引擎底层C++高效性之间的桥梁,支撑了序列化、进程间通信等核心机制。在追求性能的场景下,如处理大量粒子或网格顶点数据,PackedArray系列(如PackedVector2Array)因其连续内存布局和单一数据类型特性,相比普通Array能带来数量级的性能提升。本文深入探

weixin_33728708的博客 429

华为OD机试真题解析:字符串解密算法与多语言实现详解

字符串处理是编程面试与算法竞赛中的基础核心技能,它涉及对字符序列的遍历、查找、过滤与重组等操作。其原理在于高效利用数据结构(如哈希集合)进行成员查找,将时间复杂度从O(N*M)优化至O(N+M),体现了空间换时间的经典算法思想。掌握字符串处理技术对于提升代码效率、应对复杂业务逻辑至关重要,广泛应用于数据清洗、文本解析、密码学等场景。本文以一道高频出现的华为OD机试真题——字符串解密为例,深入剖析其解题思路,并提供C、C++、Java、Python、JavaScript五种主流语言的完整实现方案,帮助读者巩固

weixin_30487201的博客 313

C++从入门到实战:核心语法、内存管理与现代特性全解析

在计算机编程领域,理解底层内存管理和性能优化是构建高效系统的关键。C++作为一门支持底层操作和面向对象编程的语言,其核心原理在于通过直接内存访问和编译器优化实现高性能。这种技术价值使其在游戏引擎、高频交易、嵌入式系统等对性能要求极高的场景中不可替代。本文聚焦C++的核心语法与内存管理,深入探讨智能指针、虚函数表等现代特性,并结合开发环境配置、STL容器使用等工程实践,为学习者提供从基础到进阶的完整路径。通过解析常见面试题和项目实战思路,帮助读者掌握写出健壮、高效C++代码的能力。

weixin_34075268的博客 370

Android 系统界面下拉通知栏自定义开发指南

本文将介绍如何进行系统界面下拉通知栏的UI定制化开发,并提供相应的源代码示例。通过修改布局文件和代码,开发者可以实现自定义布局元素和功能模块,提供更好的用户体验。在模拟器或真机上拉下系统界面的通知栏,可以看到自定义的布局元素,如按钮等。了解 SystemUI 框架:SystemUI 是 Android 系统中负责状态栏和导航栏显示的框架,需要对其基本原理和相关的类和接口有所了解。引入第三方库和工具:根据需求引入适合的第三方库和工具,扩展系统界面下拉通知栏的功能和效果。六、进一步定制化开发。

ByteKnight的博客 854

机器学习生产化落地:从Notebook到高可用ML服务的六大工程实践

机器学习模型部署不是简单导出为API,而是涉及持续训练、环境一致性、服务SLA、数据质量、可观测性与团队协作的系统工程。其核心原理在于构建‘感知-响应-进化’的闭环机制,通过模型版本管理、特征漂移检测、统一时区与依赖锁定、Triton推理优化、Great Expectations数据断言及OpenTelemetry全链路追踪等技术手段,保障模型在真实业务中稳定、可信、可归因。该体系显著提升线上模型效果稳定性与迭代效率,广泛应用于金融风控、电商推荐、支付反欺诈等对延迟、准确率和可解释性要求严苛的场景。本文聚焦

weixin_30236595的博客 543

Android自定义状态栏通知的实现

在Android应用程序中,我们经常需要使用状态栏通知来向用户展示重要的信息或者提醒。Android提供了一套通知管理系统,可以让开发者自定义状态栏通知的外观和行为。从Android 8.0(API级别26)开始,Android引入了通知渠道的概念,用于对通知进行分类和管理。首先,我们创建一个通知渠道,并指定其唯一的ID、名称和重要性级别。在上面的代码中,我们设置了通知的小图标、标题和正文,并为通知添加了点击后打开MainActivity的操作。接下来,我们需要构建通知的内容,包括标题、正文、图标等。

CyberGenius的博客 502
上一篇: Android应用中意见反馈功能的探讨与实现
下一篇: 百度贴吧布局框架的研究与实现(Android版本)
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值