手机来电或者通话时闪烁的LED效果,比较绚丽,找了机会,研究了一下。。
一 . 分析过程
1. 既然是闪光,那肯定是跟Light有关系了,于是乎,找到了一个LightService.java的文件,实现了IBinder接口,可以用于进程间通信。看起来好像是找到了 ! 如下:
public class LightsService extends ILightService.Stub {},
但是突然失望的发现,这个对象在安卓系统中并没有公布它的系统服务接口。。 换句话说,我们不能通过
getSystemService(String service_name) 的方式来获取它的引用(Context.jva里面并没有这个服务的字符串)。所以得找另外的方法。
2. 继续寻找哪里有个系统的引用。。好的好的,在SystemServer.java,这个专门用于拉起系统服务的类中,我们找到了这样的代码 lights = new LightsService(context); 是的,它就是在这里实例化的。然后继续调用
Slog.i(TAG, "Notification Manager");
notification = new NotificationManagerService(context, statusBar, lights);
嗯!没错,它被防到通知服务里面去了。^_^, 这个服务我们是可以获取到滴!
NotificationManager notify =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
然后我们就可以通过NotificationManager来控制Led灯了!
3. 继续研究NotificationManagerService.java类,终于发现它里面有个BroadCastReceiver, 在onReceive方法里面有这样的代码:
else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
mInCall = (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_OFFHOOK));
updateNotificationPulse();
}
我们都知道, 当电话状态发生改变的时候,我们会发出TelephonyManager.ACTION_PHONE_STATE_CHANGED的广播。
然后这里慢慢进去,就是调用到LightService里面的一些东东了,LightService里面有些本地方法。下面的就是底层做的事情了。
不过,当然,这得咱们的手机支持Led灯才可以呀!
随手所记, 不知所云, ^_^
+5
原创内容
2012-12-29 20:50
分享至: