自定义锁屏界面,锁定系统,禁止返回和home键关闭界面

本文提供一个实现将自定义的界面显示在系统最顶层,达到锁定系统,禁止返回和home键关闭界面的解决方案。

在手机黑屏状态,也能够弹出解锁界面

1添加权限

<!-- 系统窗口,显示在最顶层 -->
 < uses-permission android:name= "android.permission.SYSTEM_ALERT_WINDOW" />

2创建界面布局文件lock_screen.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:gravity="center"
        android:text="屏幕已锁定" />

    <Button
        android:id="@+id/btn"
        android:layout_marginTop="250dp"
        android:textColor="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="关闭界面" />

</LinearLayout>

3创建服务AppService

Don‘t go for activity, because android will not show lock
screen behind your activity for security reason, so use service instead of Activity.

不要在activity中显示,由于安全原因,安卓系统不会在锁屏时候显示自定义的窗口,所以使用服务代替activity

WindowManager 这个类能够实现系统级别的窗口。
首先设置布局界面的属性

关键是设置TYPE_SYSTEM_ERROR

</pre><pre name="code" class="java">wm = (WindowManager) getSystemService(WINDOW_SERVICE);
		// 设置lockScreenView视图的属性
		// 属性TYPE_SYSTEM_ERROR:出现在任何界面的前面
		mLayoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
				0, 0, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
						| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
						| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, PixelFormat.RGBA_8888);
		LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

AppService.java完整代码

/*
 *@author Dawin,2015-2-4
 *
 */
package com.example.superlockscreen;

import com.example.superlockscreen.R;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;

/**
 * 实现界面锁定。禁止手机的任何按键操作
 * @author Dawin
 *
 *Don't go for activity,
 *because android will not show lock screen behind your activity for security reason,
 *so use service instead of Activity.
 */
public class AppService extends Service
{
	private WindowManager.LayoutParams mLayoutParams;
	private WindowManager wm;
	private View lockScreenView;
	private Button btn;

	@Override
	public void onCreate()
	{
		super.onCreate();
		wm = (WindowManager) getSystemService(WINDOW_SERVICE);
		// 设置lockScreenView视图的属性
		// 属性TYPE_SYSTEM_ERROR:出现在任何界面的前面
		mLayoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
				0, 0, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
						| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
						| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, PixelFormat.RGBA_8888);
		LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		//绑定自定义界面
		lockScreenView = mInflater.inflate(R.layout.lock_screen, null);
		//获取界面的按钮
		btn = (Button) lockScreenView.findViewById(R.id.btn);
		btn.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// 关闭锁屏界面
				removeViewFromWindow();
			}
		});
		wm.addView(lockScreenView, mLayoutParams);
	};

	/** 关闭锁屏界面 */
	public void removeViewFromWindow()
	{
		if (lockScreenView != null)
			{
				wm.removeView(lockScreenView);
			}
	}

	@Override
	public IBinder onBind(Intent intent)
	{
		return null;
	}
}

4最后在Activity中绑定服务

package com.example.superlockscreen;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;

public class MainActivity extends Activity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 绑定服务
		Intent service = new Intent(this, AppService.class);
		bindService(service, connServiceConnection, BIND_AUTO_CREATE);
	}

	private ServiceConnection connServiceConnection = new ServiceConnection()
	{
		@Override
		public void onServiceConnected(ComponentName name, IBinder service)
		{
			// get Binder
		}

		@Override
		public void onServiceDisconnected(ComponentName name)
		{

		}
	};

	// 解绑服务
	protected void onDestroy()
	{
		super.onDestroy();
		unbindService(connServiceConnection);
	};
}

时间: 2024-11-08 10:28:06

自定义锁屏界面,锁定系统,禁止返回和home键关闭界面的相关文章

【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸爽程度不亚于捏气泡膜.确实,一款漂亮的锁屏能为手机增色不少,但锁屏存在的核心目的主要是三个:保护自己手机的隐私,防止误操作,在不关闭

浅谈 Android 自定义锁屏页的发车姿势

作者:blowUp,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577446&idx=2&sn=940cfe45f8da91277d1046d90368d440&scene=4#wechat_redirect 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸爽程度不亚于捏气

重新想象 Windows 8.1 Store Apps (92) - 其他新特性: CoreDispatcher, 日历, 自定义锁屏系列图片

[源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之其他新特性 CoreDispatcher 的新特性 “日历”的相关操作 自定义锁屏时需要显示的系列图片 示例1.演示 CoreDispatcher 在 win8.1 中的新特性CoreDispatcherDemo.xaml.cs /* * 演示 CoreDispatcher 在 win8.1 中的新特性 * * 关于几个 Core 的基础请参见:http://www.cnblogs.com/weba

android 滑动锁屏状态下如何禁止下拉状态栏

滑动锁屏状态下状态栏可以下拉是google 4.0 默认的设计.如果要禁止此功能,请修改KeyguardViewMediator.java的adjustStatusBarLocked()方法,将  if (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND) { // showing secure lockscreen; disable expanding. flags |= StatusBarManager.DISABLE_EXPAND; } 修改

spring security使用自定义登录界面后,不能返回到之前的请求界面的问题

昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录. 开始以为是被oauth2拦截了导致出了问题,但是security的拦截器是优先起作用的,所以这不可能. 最后实在没法只有打断点调试找毛病(下图为spring security登录后重定向至拦截前访问的url的实现原理流程) 图片是在这里看到的https://blog.csdn.net/zy_coo

android解锁界面,插上USB弹出打开USB存储设置界面,按HOME键/返回键直接回到launcher,而非滑动锁屏界面

1)如果将setting-->开发者选项-->USB调试  disable掉,表示当前是用户模式,锁屏界面下插上USB,AMS就会叫起UsbStorageActivity"打开USB存储设备"这个界面. 2)UsbStorageActivity界面在onCreate()中设置了如下属性: getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); if (Environment.isExte

Android框架浅析之锁屏(Keyguard)机制原理

最近终于成功的摆脱了FM收音机,迈向了新的模块:锁屏.状态栏.Launcher---姑且称之为"IDLE"小组,或许叫手机 美容小组,要是能施展下周星星同学的还我漂漂拳,岂不快哉. OK,闲话打住,咱开始正文. 本文主要内容: 1.分析锁屏界面的组成 : 2.基于源代码分析锁屏相关类 : 3.提出一种在框架取消锁屏的方法 . 花了一些时间研究Android原生的锁屏框架---Keyguard,今天就慢慢的讲解下我自己对这个模块的总结,因为目前还处于 理论学习的状况,很多细节以及功能上的

仿 惠锁屏 侧滑锁屏的原理

上面是效果图. 锁屏 总体来说 注意的地方 就两点  一个是  关闭电源 重启 的时候 保证  锁屏界面可以出现, 另一个就是  按home键的时候 不要返回 桌面. 对于  唤醒 电源键  和重启手机时候 弹出锁屏界面 ,可以通过监听 电源 唤醒的 广播,开机广播. 1) 待机: 广播消息:android.intent.action.SCREEN_OFF 2) 唤醒: 广播消息:android.intent.action.SCREEN_ON  3) 开机 广播消息:android.intent

android 锁屏程序开发

参考http://blog.csdn.net/wdaming1986/article/details/8837023 锁屏程序的步骤如下: 1.替换系统锁屏 2.屏蔽Home键,back键.menu键 3.锁屏程序不出现在最近任务列表中 4.屏幕唤醒时显示锁屏界面 一.替换系统锁屏 调研市场绝大部分锁屏程序,会引导用户关闭系统锁屏.当用户不关闭系统锁屏的时候我们可以将我们自定义的锁屏程序覆盖在系统锁屏程序上,解锁系统锁屏. 具体做法如下: api level 小于13时: mKeyguardMa