在Android上关闭屏幕

the*_*pot 18 android android-wake-lock wakelock

我试图在某个动作发生后打开和关闭显示器(让我们担心暂时关闭屏幕).根据我对唤醒锁的理解,这就是我所拥有的:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);    
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
Run Code Online (Sandbox Code Playgroud)

当我在stackoverflow上阅读其他帖子时,他们似乎告诉我PARTIAL_WAKE_LOCK将关闭屏幕.但是,如果我阅读SDK,它会说它只允许屏幕关闭.所以我觉得这不对.

任何提示都会有所帮助!谢谢,

麦克风

A. *_*iri 18

关闭屏幕有两种选择:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);

// Choice 1
manager.goToSleep(int amountOfTime);

// Choice 2
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
wl.release();
Run Code Online (Sandbox Code Playgroud)

您可能也需要此权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

更新:

试试这个方法; 一旦光线足够低,android会关闭屏幕.

WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

  • 根据我的经验,这些方法非常不可靠. (3认同)

jia*_*ily 7

以下内容从SDK文档中复制.如果你想保持屏幕,我认为SCREEN_BRIGHT_WAKE_LOCK就足够了.


Flag Value                CPU   Screen  Keyboard
Run Code Online (Sandbox Code Playgroud)
PARTIAL_WAKE_LOCK          On*    Off      Off

SCREEN_DIM_WAKE_LOCK       On     Dim      Off

SCREEN_BRIGHT_WAKE_LOCK    On     Bright   Off

FULL_WAKE_LOCK             On     Bright   Bright
Run Code Online (Sandbox Code Playgroud)


Max*_*tin 5

对我来说这些方法不起作用。所以我使用了其他场景(并非微不足道)来关闭屏幕。

Android 有 2 个负责唤醒的标志:

  • 显示 --> 屏幕超时
  • 应用程序 --> 开发 -->充电时保持清醒复选框。

我使用了以下流程:

  1. 首先保存您之前的配置,例如屏幕超时为 1 分钟并选中 充电时保持清醒

  2. 之后,我取消选中充电时保持清醒并将屏幕超时设置为最短时间。

  3. 我注册到广播接收器服务以从屏幕关闭的 Android 获取事件。

  4. 当我关闭屏幕上的事件时,我将之前的配置设置为默认值:屏幕超时为 1 分钟并选中 充电时保持清醒

  5. 取消注册接收者

15秒后。设备休眠

这是代码片段:

广播接收器

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Catch Screen On/Off
 * */
public class BroadcastReceiverScreenListener extends BroadcastReceiver{

private BroadCastListenerCallBackItf mBroadCastListenerCallBack = null;

public BroadcastReceiverScreenListener(
        BroadCastListenerCallBackItf broadCastListenerCallBack) {
    this.mBroadCastListenerCallBack = broadCastListenerCallBack;
}

@Override
public void onReceive(Context arg0, Intent intent) {


    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        mBroadCastListenerCallBack.broadCastListenerCallBack__ScreenOff_onResponse();
    }       
}

}
Run Code Online (Sandbox Code Playgroud)

用作回调的接口

public interface BroadCastListenerCallBackItf {
    public void broadCastListenerCallBack__ScreenOff_onResponse();
}
Run Code Online (Sandbox Code Playgroud)

主类的2个方法:

....

AndroidSynchronize mSync = new AndroidSynchronize();

....

public void turnScreenOff(int wait){
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);

    BroadCastListenerCallBackItf broadCastListenerCallBack = this;

    BroadcastReceiver mReceiver = new BroadcastReceiverScreenListener(broadCastListenerCallBack);       
    m_context.registerReceiver(mReceiver, filter);



    //set Development --> disable STAY_ON_WHILE_PLUGGED_IN
    Settings.System.putInt(
            m_context.getContentResolver(), 
            Settings.System.STAY_ON_WHILE_PLUGGED_IN,
            0                                );



    // take current screen off time 
    int defTimeOut = Settings.System.getInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, 3000);
    // set 15 sec
    Settings.System.putInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, 15000);

    // wait 200 sec till get response from BroadcastReceiver on Screen Off
    mSync.doWait(wait*1000);


    // set previous settings
    Settings.System.putInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, defTimeOut);

    // switch back previous state
    Settings.System.putInt(
            m_context.getContentResolver(), 
            Settings.System.STAY_ON_WHILE_PLUGGED_IN,
            BatteryManager.BATTERY_PLUGGED_USB);


    m_context.unregisterReceiver(mReceiver);


}





public void broadCastListenerCallBack__ScreenOff_onResponse() {
    mSync.doNotify();
}

....
Run Code Online (Sandbox Code Playgroud)

Android同步类

public class AndroidSynchronize {

    public void doWait(long l){
        synchronized(this){
            try {
                this.wait(l);
            } catch(InterruptedException e) {
            }
        }
    }       

    public void doNotify() {
        synchronized(this) {
            this.notify();
        }
    }   

    public void doWait() {
        synchronized(this){
            try {
                this.wait();
            } catch(InterruptedException e) {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

您需要注册权限:

android.permission.WRITE_SETTINGS
Run Code Online (Sandbox Code Playgroud)