Android 在锁屏界面添加未读短信和电话提醒

来源:互联网 发布:易娱网络太古汇39楼 编辑:程序博客网 时间:2024/05/19 22:04

最近碰到了一个锁屏问题,大概学习了一下。

需求:在锁屏界面加入未读电话和未读短信的通知。

设计:在滑动解锁的界面,点击锁时,会同时出现一下两种情况:

1、以锁为中心会出现光圈并在四周显示解锁、短信、电话、相机。
其中,短信、电话、相机是否在滑动解锁界面显示可以在代码中设置显示:在KeyguardSelectorView.java类的updateResources()方法中,通过setEnableTarget()方法设置其是否显示。

2、在锁下方显示的“运营商、紧急呼叫”内容会消失。
因此,为了添加未读短信和电话的提醒,我们可以首先增加未读短信和未读电话的布局,并利用“紧急呼叫”按钮的控制逻辑来控制未读消息界面的显示。

实现:

1、在KeyguardSelectorView.java的onUnreadStateChanged()方法中,控制了光圈四周图标上未读图标的显示以及数量。
[1] 首先,在KeyguardSelectorView.java中onUnreadStateChanged()方法下,根据未读状态来更新未读短信和未读电话的图标。
[2] 其次,通过KeyguardUpdateMonitor的handleUnreadStateChanged()方法监听未读短信和电话状态改变,并回调onUnreadStateChanged()方法。

2、实现未读图标的重绘:获取需要重绘的图标位置或view,并通过调用mGlowPadView.onReplaceTargetDrawables(mContext.getResources(),unreadNum, resIdNormal, pos);方法来进行重绘操作,具体如下:
在GlowPadView.java中的onReplaceTargetDrawables()方法,通过未读数量绘制递增的数字图标,重绘并显示在view的指定位置上。

3、实现未读图标的点击事件:
类似滑动解锁时会跳转到短信和电话界面一样,该功能的实现在KeyguardSelectorView.java的mOnTriggerListener中复写的onTrigger()方法,即
case R.drawable.ic_lockscreen_camera:
mActivityLauncher.launchCamera(null, null);
mCallback.userActivity(0);
break;
因此,可以仿照上述方法,为两个未读图标添加点击事件。在EmergencyCarrierArea.java文件中加入对两个imageview的点击事件的响应。
在创建KeyguardSelectorView.java 的对象后,需要为该对象赋值:
[A] mKeyguardSelectorView = (KeyguardSelectorView) getParent().getParent();
[B] mKeyguardSelectorView = (KeyguardSelectorView) getRootView().findViewById(R.id.keyguard_selector_view);
上述两种方式都可以在EmergencyCarrierArea.java中获取到KeyguardSelectorView.java的id,但是方式不一样。
[A]方法中是根据整体布局的嵌套关系知道EmergencyCarrierArea的父容器的父容器是KeyguardSelectorView,可以在EmergencyCarrierArea.java中通过获取父亲的父亲来得到KeyguardSelectorView。但是这种方式有个缺点,如果后期在他们二者之间加入新的布局,使其现在的对应关系getParent().getParent()不成立,那么获取到的布局就不是我们想要的了。因此,这种方式不灵活。
[B]方法是通过在KeyguardSelectorView.java中先获取RootView(根View),然后通过RootView来findViewById(R.id.keyguard_selector_view)。因为findViewById这个方法只能在当前视图向下寻找view。

补充:在加入布局文件时,碰到了几个问题:
1. 首先加入一个LinearLayout后整个加载的布局都乱了,因为多个线性布局叠加会产生重叠或者显示不全的现象,因此,可以尝试使用FrameLayout使所有布局都叠加显示。
2. 在LinearLayout中加入两个ImageView,希望两个ImageView可以显示在屏幕的左右两边,但是设置left和right没有用,可以设置RelativeLayout,并将ImageView的属性设置为android:layout_alignParentLeft=”true”和android:layout_alignParentRight=”true”。
3. 加载的图片资源较大,占用的屏幕空间很大,可以在加载图片的地方加入
android:scaleX设置X轴缩放
android:scaleY设置Y轴缩放

1 0
原创粉丝点击