• [Android] 锁定屏幕


      最近玩的比较欢脱,欠了好多东西没写。今天先简单地补一篇简单的内容。就是最近涉及到一个锁定Android设备屏幕的设计,大概就是通过一个按钮或者服务消息,来控制设备界面完全锁定,不能点击任何东西。感觉上这个需求可能会涉及很多东西,然而做起来发现并没有。。。内容很简单,跟着代码快速过一遍。

    本文地址:http://www.cnblogs.com/rossoneri/p/4409691.html 

    主界面就放一个按钮来触发事件好了:

    按下按钮后显示另一个锁屏界面,同时加上一个解锁按钮(如果不加的话怎么退出程序啊- -!)

    可以看到,启动锁屏后 顶部的status bar完全消失,下方的Navigation bar按钮淡化成小圆点。这时你点击屏幕任何地方程序都不会有任何反应。好了,下面上代码。

    锁屏类 LockScreen.java:

    package com.example.wow.demo_lockscreen;
    
    import android.content.Context;
    import android.graphics.PixelFormat;
    import android.graphics.Point;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.Button;
    
    /**
     * Created by wow on 15-4-9.
     */
    public class LockScreen {
    
        Point mLpSize;
        Button mBtnUnlock;
        ViewGroup mView;
        final WindowManager mWindowManager;
        final WindowManager.LayoutParams mLp;
    
        public LockScreen(Context mContext){
    
            mView = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.lock_screen_view, null);
            mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            mLp = new WindowManager.LayoutParams();
            mBtnUnlock = (Button)mView.findViewById(R.id.btn_unlock);
    
            mBtnUnlock.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    show(false);
                }
            });
    
            initLp();
    
        }
    
        private void initLp(){
            mLp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;// TYPE_SYSTEM_ALERT;
            mLp.format = PixelFormat.RGBA_8888;
    
            mLp.flags |= WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    
            mLp.systemUiVisibility = View.STATUS_BAR_HIDDEN;
    
            mLp.width = WindowManager.LayoutParams.MATCH_PARENT;
            mLp.height = WindowManager.LayoutParams.MATCH_PARENT;
    
        }
    
        public void show(boolean flag){
            if (flag){
                mWindowManager.addView(mView, mLp);
            } else {
                mWindowManager.removeView(mView);
            }
        }
    
    
    }

    这里的重点在于

    mLp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

      这一句,type一定要设置成这种类型,这个类型的功能就是让当前显示的view无理由地出现在最上端。 flags 就是根据需求来设定,可以再加其他内容,也可以删掉一些,不影响的。

      这里还要在Manifest中添加权限才行

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

    MainActivity:

    package com.example.wow.demo_lockscreen;
    
    import android.app.Activity;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    
    
    public class MainActivity extends Activity {
    
        Button mBtnLock;
        LockScreen mLockScreen;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mBtnLock = (Button)findViewById(R.id.btn_lock);
            mLockScreen = new LockScreen(this);
    
    
            mBtnLock.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mLockScreen.show(true);
                }
            });
    
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    }

      界面文件就不贴了,太简单。。哦对,这个我在5.0上测的是完美运行,4.2有点问题,不太清楚为什么。。有知道的给我说下。

      好了,锁屏其实就这么简单。后面我会再研究一些界面效果,做点实用的锁屏功能。

      最近在研究 system bar,挺简单的,之前写了几篇相关的博客,发现之前理解还是有点偏差,打算过一段写个最终版的,把这块知识搞定。

  • 相关阅读:
    数据库锁表处理汇总
    2021,顺其自然
    NetCore中跨域策略的一个坑
    Furion框架亮点之-动态WebAPI
    sql中where in的数量限制
    动态规划学习笔记
    用Go编写Web应用程序
    Asp.net Core AutoFac根据程序集实现依赖注入
    Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务
    CentOS8.0安装Nacos
  • 原文地址:https://www.cnblogs.com/rossoneri/p/4409691.html
Copyright © 2020-2023  润新知