• 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

            

  • 相关阅读:
    Spring
    Spring
    Spring
    Spring
    JS 脱敏通用方法
    JS 实用技巧记录
    多快?好省!
    实战 | 如何使用微搭低代码实现按条件过滤数据
    2021腾讯数字生态大会落地武汉,微搭低代码专场等你来
    实战 | 如何使用微信云托管部署flask项目
  • 原文地址:https://www.cnblogs.com/stuart/p/4533003.html
Copyright © 2020-2023  润新知