ios监听锁屏解锁如何实现,需要调用啥方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios监听锁屏解锁如何实现,需要调用啥方法?相关的知识,希望对你有一定的参考价值。

刚开始接触ios开发对ios开发不太熟悉,目前APP开发需要一个能够后台运行的监听计时模块,需要当模块在后台运行时,以屏幕是否解锁为依据进行计时。想知道ios如何实现对锁屏和解锁等事件的监听?需要调用什么方法?如果不能实现的话对上述功能需求应该要如何实现?目前没能找到较为明确的答案,恳请高人解答

首先提出这个需求的不了解ios就敢提这样的功能,实在是佩服

一般应用在切入后台时会给你短暂的处理任务的时间,音乐类、GPS等应用会有特殊的延长时间使不被KILL,但像你的需求在后台做这种事情是不可行的。

你可以监听应用是否进入后台,但监听锁屏和解锁是系统级的,你无法获取。
如果现在有能处理你所说的需求的方法,那也是越狱系统能干的事了,但即使是这种技术你要能实现,你也不仅仅是个做应用的程序员了。
我说的以上内容有时效性,不保证未来IOS系统不会开放。追问

我们是大二的大学生,之前也没接触或学习过ios编程但两周前开始的实训不知为何就给我们组安排了ios开发,一周前才开始抽空看ios开发相关的知识,都是边做边学了。给的文本在这个模块的功能描述大致是要我们记录ios移动设备的屏幕使用时间,既然知道ios没办法监控锁屏的话这个模块我们目前只能考虑做成通过用户手动开关后台计时,感觉这个功能模块这样做出来都没啥意义了…不管怎样还是谢谢解答

参考技术A   iOS 7 之前,只能够在设备屏幕的底部进行解锁操作,现在的可行面积则扩大到整个屏幕。安装 iOS7 之后,在锁屏界面上任意滑动--无论是屏幕的底部、中部还是顶部,无论是从左到右还是从上到下(带倾斜角度),都可以直接进入桌面。
  方法如下:
  1、屏幕中间解锁。
  2、屏幕顶部解锁。
  3、左上至右下解锁。
  4、左下至右上解锁。

BroadcastReceiver之实现锁屏解锁样例

好久没有写android的小样例了,因为前几天写了一篇关于Intent.Action的文章(http://blog.csdn.net/ljphhj/article/details/38796739)。有朋友私信问我关于ACTION_SCREEN_ON和ACTION_SCREEN_OFF还有ACTION_USER_PRESENT三个Action的使用方法,因为作为一个总结博文,当时并没有具体讲,ACTION_SCREEN_ON和ACTION_SCREEN_OFF仅仅能通过动态注冊的方式(代码内context.register和unregister)。而ACTION_USER_PRESENT则是动态、静态注冊两种方式都能够。

以下我们通过这个锁屏、解锁相关的BroadcastReceiver来了解一下。


package cn.panghu.activitys;

import com.example.broadcastsappdemo.R;

import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class ScreenLockedActivity extends Activity{
	private ScreenBroadcastReceiver screenBroadcastReceiver = null;
	private Context context = null;
	private Button lockedScreenBtn = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		context = getApplicationContext();
		setContentView(R.layout.screen_lock_layout);
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		//注冊这个广播
		registerScreenBroadcastReceiver();
	}
	
	private void registerScreenBroadcastReceiver() {
		screenBroadcastReceiver = new ScreenBroadcastReceiver();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//当屏幕锁屏的时候触发
		intentFilter.addAction(Intent.ACTION_SCREEN_ON);//当屏幕解锁的时候触发
		intentFilter.addAction(Intent.ACTION_USER_PRESENT);//当用户又一次唤醒手持设备时触发
		context.registerReceiver(screenBroadcastReceiver, intentFilter);
		Log.i("screenBR", "screenBroadcastReceiver注冊了");
	}
	//重写广播
	class ScreenBroadcastReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			String strAction = intent.getAction();
			if (Intent.ACTION_SCREEN_OFF.equals(strAction)){
				//屏幕锁屏
				Log.i("screenBR", "屏幕锁屏:ACTION_SCREEN_OFF触发");
				Toast.makeText(context, "锁屏了", Toast.LENGTH_SHORT).show();
			}else if (Intent.ACTION_SCREEN_ON.equals(strAction)){
				//屏幕解锁(实际測试效果,不能用这个来推断解锁屏幕事件)
				//【因为这个是解锁的时候触发。而解锁的时候广播还未注冊】
				Log.i("screenBR", "屏幕解锁:ACTION_SCREEN_ON触发");
				Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();
			}else if (Intent.ACTION_USER_PRESENT.equals(strAction)){
				//屏幕解锁(该Action能够通过静态注冊的方法注冊)
				//在解锁之后触发的,广播已注冊
				Log.i("screenBR", "屏幕解锁:ACTION_USER_PRESENT触发");
				Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();
			}else{
				//nothing
			}
		}
		
	}
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		context.unregisterReceiver(screenBroadcastReceiver);
		Log.i("screenBR", "screenBroadcastReceiver取消注冊了");
	}
}


LogCat结果图:

技术分享


因为是静态注冊的方式,所以大家可能会认为那我要怎么让它长久地监听这锁屏、解锁屏幕的广播呢?

首先我们再次强调ACTION_SCREEN_ON和ACTION_SCREEN_OFF仅仅能通过动态注冊的方式(代码内context.register和unregister),而ACTION_USER_PRESENT则是动态、静态注冊两种方式都能够。


那么我们的突破口便是:我们能够动态地注冊一个关于屏幕解锁后(ACTION_USER_PRESENT)的广播者。而且在这个广播的onReceive方法中实现我们要做的一些操作。

比如我们能够开启一个Service服务。用于注冊我们所想要的这个Broadcast Receiver


1.在Service中定义receiver

  1. private BroadcastReceiver mScreenFilterReceiver = new BroadcastReceiver() {  
  2.     public void onReceive(Context context, Intent intent) {  
  3.             if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {  
  4.                 //做要求的处理  
  5.             }else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
  6. }  
  7.     }  
  8. };  

2.在Service的onCreate中定义IntentFilter及注冊receiver

  1. IntentFilter ScreenFilter = new IntentFilter();  
  2. ScreenFilter.addAction(Intent.ACTION_SCREEN_ON);  
  3. ScreenFilter.addAction(Intent.ACTION_SCREEN_OFF); 
  4. registerReceiver(mScreenFilterReceiver, ScreenFilter);  

3.在Service的onDestroy中要反注冊这个receiver。

  1. unregisterReceiver(mScreenFilterReceiver);  

以上是关于ios监听锁屏解锁如何实现,需要调用啥方法?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发-检测程序在前台和后台锁屏解锁的状态

BroadcastReceiver之实现锁屏解锁样例

锁屏解锁

windows锁屏中,怎么实现自动解锁,进入界面

检测手机屏幕是否亮屏解锁

Appium 解决锁屏截屏问题(java篇)