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

简介:

在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>



相关文章
|
1月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
27 1
|
2月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
44 3
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
101 0
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
41 5
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
72 10
|
Android开发
Android Status(状态栏) 着色
方案一 将状态栏透明 代码设置 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.
749 0
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
20天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
45 14