android开发技巧——仿新版QQ锁屏下弹窗

新版的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"/>

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

本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/40587935

参考资料:
http://bbs.csdn.net/topics/390425777 CSDN论坛帖子 发帖人:  JJMM2009
android api 文档。
  • 10
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的GUI界面库和网络库等,非常适合开发聊天软件。在本文中,我们将介绍如何使用Qt实现一个高仿QQUI设计的聊天软件。 第一步:UI设计 QQUI是一种基于Qt的UI设计风格,它的特点是简洁、美观、易用。我们可以借鉴一下QQUI的设计思路,设计出我们的聊天软件UI。 首先,我们需要准备好UI所需的资源文件,包括图片、字体等。然后,在Qt Creator中创建一个新的“Qt Widgets Application”项目,选择“Dialog with Buttons Bottom”模板。在“Designer”中,我们可以使用“Widget Box”中的控件来设计UI界面,例如:Label、LineEdit、PushButton、TextBrowser等。我们可以使用样式表来设置控件的属性和样式,例如:颜色、字体、边框等。 第二步:网络通信 在聊天软件中,网络通信是必不可少的。我们可以使用Qt提供的网络库来实现客户端和服务器之间的通信。在本例中,我们将使用TCP协议来进行通信。 首先,我们需要在客户端中创建一个QTcpSocket对象,通过调用connectToHost()函数来连接服务器。连接成功后,我们可以使用write()函数向服务器发送数据,使用read()函数接收服务器发送的数据。当客户端需要关闭连接时,可以通过调用disconnectFromHost()函数来断开连接。 在服务器端,我们需要创建一个QTcpServer对象,通过调用listen()函数来监听客户端的连接请求。当客户端连接成功后,服务器会自动创建一个QTcpSocket对象与客户端进行通信。我们可以使用QTcpSocket对象的readyRead()信号来接收客户端发送的数据,使用write()函数向客户端发送数据。当服务器需要关闭连接时,可以通过调用close()函数来关闭连接。 第三步:消息处理 在聊天软件中,消息的处理非常重要。我们需要对接收到的消息进行解析,并根据消息类型来执行相应的操作。例如:当接收到一条文本消息时,需要在聊天窗口中显示该消息;当接收到一条图片消息时,需要在聊天窗口中显示该图片。 在本例中,我们将使用JSON格式来传递消息。每个消息都包含一个消息类型和消息内容。我们可以使用QJsonDocument和QJsonObject类来解析JSON格式的消息。 第四步:数据库存储 在聊天软件中,数据库存储可以帮助我们保存聊天记录、用户信息等。我们可以使用Qt提供的SQL库来实现数据库存储。 在本例中,我们将使用SQLite数据库来存储聊天记录。首先,我们需要在Qt Creator中创建一个新的SQLite数据库,并创建一个表来存储聊天记录。然后,我们可以使用QSqlDatabase类来连接数据库,使用QSqlQuery类来执行SQL语句。当接收到一条消息时,我们可以将消息内容存储到数据库中。 第五步:实现功能 在完成了以上四步之后,我们就可以开始实现聊天软件的各种功能了。例如:登录、注册、添加好友、发送消息等。 在本例中,我们将实现以下功能: 1. 登录和注册:用户需要输入用户名和密码进行登录或注册。 2. 添加好友:用户可以通过输入好友的用户名来添加好友。 3. 聊天窗口:用户可以选择好友进行聊天,发送和接收消息。 4. 聊天记录:聊天记录将保存在数据库中,用户可以查看历史聊天记录。 5. 用户信息:用户可以修改自己的用户名和密码。 第六步:优化和测试 在完成了功能的实现之后,我们需要对程序进行优化和测试。例如:优化界面的交互体验、提高程序的性能、进行功能测试和兼容性测试等。 最后,我们可以将程序打包成可执行文件,发布到用户手中。 总结 通过以上步骤,我们就可以使用Qt实现一个高仿QQUI设计的聊天软件了。Qt提供了丰富的GUI界面库和网络库等,可以帮助我们快速地开发跨平台的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值