4.5Android灯光系统-通知灯

本文详细介绍了Android系统中通知灯的工作原理,通过源码分析`lights.h`和`NotificationManagerService.java`,阐述了如何在APP中实现通知灯的控制。在APP编写部分,展示了如何设计界面并编写程序,通过点击按钮触发通知灯闪烁,并提供了权限修改的参考。
摘要由CSDN通过智能技术生成

 

 

上小节我们分析了电池灯的源码,这小节我们将编写通知灯的使用过程。
我们知道,当手机接收到短信的时候,他会发出声音,并且这个通知灯会亮起,那么我们怎么实现呢?一般步骤如下:

1.  getSystemService("NOTIFICATION_SERVICE")
2. 构造notfification
		(1)类别:该次实现类别为通知等
		(2)其他:颜色,OnMS,OffMS。
3. 发出通知

以上是我们自己编写APP的步骤,那么系统一般会什么呢?如下:

1. 启动通知Service
2. 收到通知之后:
		(1)分辨通知类型
		(2)执行相应操作
3. 对于通知灯:  
  	(1)获取lightService
  	(2) 执行执行灯光操作

下面我们先分析一下系统中的源码

源码分析

我们打开源码中lights.h文件,可以看到如下:

#define LIGHT_ID_BACKLIGHT          "backlight"
#define LIGHT_ID_KEYBOARD           "keyboard"
#define LIGHT_ID_BUTTONS            "buttons"
#define LIGHT_ID_BATTERY            "battery"
#define LIGHT_ID_NOTIFICATIONS      "notifications"
#define LIGHT_ID_ATTENTION          "attention"
#define LIGHT_ID_BLUETOOTH          "bluetooth"
#define LIGHT_ID_WIFI               "wifi"

然后在源码中搜索LIGHT_ID_NOTIFICATIONS(通知灯),然后找到文件NotificationManagerService.java:

mNotificationLight = lights.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);

和电池灯类似,获得一个对应的Light类型对象,之后所有对通知灯的操作,都是通过mNotificationLight实现,我们还能再改文件中找到一个updateLightsLocked()方法,名字和电池灯中的是一样的,当然内容是不一样的,但是对于通知灯的所有操作都是通过updateLightsLocked()方法实现的,现在我们想知道updateLightsLocked()的调用过程,直接从updateLightsLocked着手是比较困难的。前面提到过,我们编写APP程序时会调用getSystemService(“NOTIFICATION_SERVICE”),那么我们在源码中搜索一下NOTIFICATION_SERVICE,既然有get那么肯定存在类似set的方法,最终我们锁定文件ContextImpl.java,调用了

 registerService(Context.NOTIFICATION_SERVICE, NotificationManager.class,
                new CachedServiceFetcher<NotificationManager>()

在使用getSystemService(“NOTIFICATION_SERVICE”),我们获得的是一个NotificationManager实例化的对象。

@Override
    public Object getSystemService(String name) {
        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
        return fetcher == null ? null : fetcher.getService(this);
    }
public Object getService(ContextImpl ctx) {
            ArrayList<Object> cache = ctx.mServiceCache;
            Object service;
            synchronized (cache) {
                if (cache.size() == 0) {
                    // Initialize the cache vector on first access.
                    // At this point sNextPerContextServiceCacheIndex
                    // is the number of potential services that are
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值