当前位置: 移动技术网 > IT编程>移动开发>Android > Android程序开发仿新版QQ锁屏下弹窗功能

Android程序开发仿新版QQ锁屏下弹窗功能

2019年07月24日  | 移动技术网IT编程  | 我要评论

新概念二册,天龙私服gogoxl,高清图

新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能。经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意。

下面是实现过程。

1.使用activity,而不是view

qq的弹窗一开始我以为是悬浮view,用windowmanager去添加,但是无论如何就是不显示,后来在朋友提示下换成activity来实现,在锁屏状态下就能弹窗了。

2.activity的设置

activity需要进行以下设置,才可以在锁屏状态下弹窗。

首先是oncreate方法,需要添加4个标志,如下:

protected void oncreate(bundle savedinstancestate) { 
super.oncreate(savedinstancestate); 
final window win = getwindow(); 
win.addflags(windowmanager.layoutparams.flag_show_when_locked 
| windowmanager.layoutparams.flag_dismiss_keyguard 
| windowmanager.layoutparams.flag_keep_screen_on 
| windowmanager.layoutparams.flag_turn_screen_on); 
// 自己的代码 
}

四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕。这样当activity启动的时候,它会解锁并亮屏显示。

然后在androidmanifest.xml文件当中,对该activity的声明需要加上以下属性:

<activity android:name=".alarm.alarmhandleractivity" 
android:launchmode="singleinstance" 
android:excludefromrecents="true" 
android:taskaffinity="" 
android:theme="@android:style/theme.wallpaper.notitlebar"/>

而对于布局文件,要显示的view居中,背景透明。由于上面已经设置了背景为壁纸的背景,所以显示的是桌面的背景。如果背景设为默认的白色,则导致弹窗后面是一片白色,看起来很丑。如果背景设置为透明,则弹窗后面会显示出解锁后的界面(即使有锁屏密码,也是会显示解锁后的界面的),一样很影响视觉效果。

3.在广播中启动锁屏弹窗

我们设置的是锁屏下才弹窗的,非锁屏下就不适合弹出这个窗口了(你可以试一下,效果会很怪)。一般是注册一个广播接收器,在接收到指定广播之后判断是否需要弹窗,所以在broadcastreceiver的接收代码中需要先判断是否为锁屏状态下:

@override 
public void onreceive(context context, intent intent) { 
log.d(log_tag, intent.getaction()); 
keyguardmanager km = (keyguardmanager) context.getsystemservice(context.keyguard_service); 
if (km.inkeyguardrestrictedinputmode()) { 
intent alarmintent = new intent(context, alarmactivity.class); 
alarmintent.addflags(intent.flag_activity_new_task); 
context.startactivity(alarmintent); 
} 
}

这里用到的是keyguardmanager类,用来管理锁屏的,4.1之后该类的api新增了一个iskeyguardlocked()的方法判断是否锁屏,但在4.1之前,我们只能用inkeyguardrestrictedinputmode()方法,如果为true,即为锁屏状态。需要注意的是,在广播中启动activity的context可能不是activity对象,所以需要添加new_task的标志,否则启动时可能会报错。

4.更新弹窗信息

如果弹窗activity本身并不主动更新信息,当有新的信息来时需要更新activity的界面,由于在上面我们设的是singleinstance启动模式,所以需要覆写onnewintent(intent intent)方法,这样当再次启动这个activity时,新的intent会在该方法中传入。

5.再次亮起屏幕

如果该activity并未退出,但是被手动按了锁屏键,当前面的广播接收器再次去启动它的时候,屏幕并不会被唤起,所以我们需要在activity当中添加唤醒屏幕的代码,这里用的是电源锁。可以添加在onnewintent(intent intent),因为它会被调用。也可以添加在其他合适的生命周期方法。添加代码如下:

powermanager pm = (powermanager) this.getsystemservice(context.power_service); 
if (!pm.isscreenon()) { 
powermanager.wakelock wl = pm.newwakelock(powermanager.acquire_causes_wakeup | 
powermanager.screen_bright_wake_lock, "bright"); 
wl.acquire(); 
wl.release(); 
}

6.一些权限

下面是实现过程中需要的一些权限,由于我是从项目代码中抽取出来的,难免多加或遗漏,开发者自己注意一下:

<uses-permission android:name="android.permission.disable_keyguard"/> 
<uses-permission android:name="android.permission.wake_lock"/>

第一条是解锁屏幕需要的,第二条是申请电源锁需要的。

以上所述是小编给大家介绍的android程序开发仿新版qq锁屏下弹窗功能,希望对大家有所帮助!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网