Android LockScreen (锁屏弹窗)

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

    @Override
    protected void onCreate(Bundle 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);    //打开屏幕
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

<activity android:name=".Activity"  
          android:launchMode="singleInstance"  
          android:excludeFromRecents="true"  
          android:taskAffinity=""  
          android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/> 

 

在MainActivity:

 

public class MainActivity extends Activity {
     IntentFilter intentFilter;
     LocalBroadcastManager localBroadcastManager;
     LocalBroadcastReceiver localBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread thread =new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            try {
                                Thread.sleep(5000);
                                Log.i("send", "send ok");
                                Intent intent = new Intent("com.example.stuart.LOCAL_BROADCAST");
                                localBroadcastManager.sendBroadcast(intent);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }
                    }
                }


        );
        thread.start();//模拟5秒自动发送广播



        localBroadcastManager =LocalBroadcastManager.getInstance(this);
        intentFilter =new IntentFilter();
        intentFilter.addAction("com.example.stuart.LOCAL_BROADCAST");
        localBroadcastReceiver =new LocalBroadcastReceiver();
        localBroadcastManager.registerReceiver(localBroadcastReceiver,intentFilter);



    }

    public void check_lock(){

//        KeyguardManager km = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
//            if (km.isKeyguardLocked()) {
//                Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
//                intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                localBroadcastManager.sendBroadcast(intent);
//
//            }
//          Thread thread =new Thread(
//            new Runnable() {
//                @Override
//                public void run() {
//                    try {
//                        Thread.sleep(5000);
//                        Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
//                        localBroadcastManager.sendBroadcast(intent);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//
//                }
//            }
//
//
//
//        );
//        thread.start();








    }
    class  LocalBroadcastReceiver extends 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.isKeyguardLocked()) {
                Intent alarmIntent = new Intent(context, AlarmActivity.class);
                alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(alarmIntent);
            }
        }
    }

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

 

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

 

 

 

再次亮起屏幕

如果该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();  
}  

 

 

权限

<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

        

 

转载于:https://www.cnblogs.com/stuart/p/4533003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
在Qt for Android中实现锁屏功能可以通过使用Qt框架提供的QJNIObject和QAndroidJniObject类。首先,需要在.pro文件中添加以下行以访问Android权限: ``` ANDROID_PERMISSIONS += android.permission.DISABLE_KEYGUARD ``` 然后,在Qt代码中,可以使用以下代码来实现锁屏功能: ```cpp #include <QGuiApplication> #include <QAndroidJniObject> #include <QAndroidJniEnvironment> // 锁屏 void lockScreen() { QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); QAndroidJniObject localLayoutParams = window.callObjectMethod("getAttributes", "()Landroid/view/WindowManager$LayoutParams;"); jint FLAG_KEEP_SCREEN_ON = QAndroidJniObject::getStaticField<jint>("android/view/WindowManager$LayoutParams", "FLAG_KEEP_SCREEN_ON"); localLayoutParams.callMethod<void>("setFlags", "(I)V", FLAG_KEEP_SCREEN_ON); window.callMethod<void>("setAttributes", "(Landroid/view/WindowManager$LayoutParams;)V", localLayoutParams.object<jobject>()); } // 解锁屏幕 void unlockScreen() { QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); QAndroidJniObject localLayoutParams = window.callObjectMethod("getAttributes", "()Landroid/view/WindowManager$LayoutParams;"); jint FLAG_KEEP_SCREEN_ON = QAndroidJniObject::getStaticField<jint>("android/view/WindowManager$LayoutParams", "FLAG_KEEP_SCREEN_ON"); localLayoutParams.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON); window.callMethod<void>("setAttributes", "(Landroid/view/WindowManager$LayoutParams;)V", localLayoutParams.object<jobject>()); } int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // 锁定屏幕 lockScreen(); // 解锁屏幕 unlockScreen(); return app.exec(); } ``` 以上示例代码演示了如何在Qt for Android中实现锁定和解锁屏幕功能。首先,定义了两个函数`lockScreen()`和`unlockScreen()`,分别用于锁定和解锁屏幕。在`lockScreen()`函数中,通过获取当前活动的窗口对象,并设置窗口属性`FLAG_KEEP_SCREEN_ON`来锁定屏幕。在`unlockScreen()`函数中,通过清除窗口属性`FLAG_KEEP_SCREEN_ON`来解锁屏幕。 需要注意的是,这些代码需要在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> ``` 通过以上步骤,可以在Qt for Android中实现锁屏功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值