[Android] 锁定屏幕

本文介绍了一种在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,挺简单的,之前写了几篇相关的博客,发现之前理解还是有点偏差,打算过一段写个最终版的,把这块知识搞定。

转载于:https://www.cnblogs.com/rossoneri/p/4409691.html

### 实现Android锁屏上显示自定义文本的方法 为了实现Android锁屏界面上显示自定义文本的功能,可以采用多种方法。一种常见的方式是创建一个带有特定权限的服务,在该服务中绘制覆盖于锁屏界面之上的视图。 对于更深入的定制化需求,比如直接修改系统级组件,则涉及到对`SystemUI`模块源码的操作[^2]。然而,这种方式不仅复杂度较高,而且可能影响设备稳定性以及安全性,因此通常只适用于具备相应技术背景并愿意承担风险的研究人员或开发者。 如果目标是在应用层面上实现这一特性而不触及底层改动的话,可以通过构建具有特殊权限的应用程序来完成此任务。具体来说: - 应用需请求并获得`SYSTEM_ALERT_WINDOW`权限以便能够在其他应用程序之上展示窗口; - 使用`WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY`参数创建悬浮窗布局文件,并将其放置在屏幕顶部中央位置; - 设置TextView属性以适应不同尺寸屏幕的需求; 下面是一个简单的代码片段用于说明如何利用上述提到的技术要点向锁屏页面添加一段可滚动的文字流光效果[^1]: ```java // 获取 WindowManager 对象实例 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); // 创建 LayoutParams 参数对象 WindowManager.LayoutParams params = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN| WindowManager.LayoutParams.FLAG_FULLSCREEN, PixelFormat.TRANSLUCENT); params.gravity = Gravity.CENTER; // 初始化 TextView 并设置样式 TextView textView = new TextView(this); textView.setText("这是要显示的内容"); textView.setTextColor(Color.WHITE); // 文字颜色设为白色 textView.setTextSize(30f); // 字体大小调整至合适范围 // 将 TextView 添加到 Window Manager 中 wm.addView(textView, params); ``` 需要注意的是,这段代码仅为概念验证性质的例子,实际部署前还需考虑更多细节处理如响应用户交互事件、适配各种机型差异等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值