繁体   English   中英

如何让 Android WakeLock 工作?

[英]How to get an Android WakeLock to work?

我的 WakeLock 没有让我的设备保持唤醒状态。

OnCreate()我有:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
mWakeLock.acquire();

然后:

new CountDownTimer(1320000, 200) {

    public void onTick(long millisUntilFinished) {
        // I update a progress bar here.                                         
    }

    public void onFinish() {
        // I finish updating the progress bar.
        mWakeLock.release();
    }
}.start();

屏幕在计时器结束前关闭,如何使屏幕保持可见?

mWakeLock是一个先前声明的字段,如下所示:

private PowerManager.WakeLock mWakeLock;

我的设备使用 Android 1.6。 我真的很感激任何帮助解决这个问题。

WakeLock通常不会导致重新启动问题。 您的编码可能还有其他一些问题。 如果在使用后没有释放,WakeLock会严重占用电池。

WakeLock是一种保持屏幕开启的低效方式。 而是使用WindowManager来做魔术。 以下一行就足够了WakeLock。 为此,还需要WakeLock权限。 此代码也比wakeLock更有效。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

您无需手动重新启动WakeLock。 此代码将允许Android系统自动处理锁定。 当您的应用程序在Foreground中时,将保留WakeLock,否则android System会自动释放Lock。

试试这个并发表评论......

您是否在您的清单中设置了所需的权限

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

你只需写这个:

 private PowerManager.WakeLock wl;

    protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
    }//End of onCreate

            @Override
        protected void onPause() {
            super.onPause();
            wl.release();
        }//End of onPause

        @Override
        protected void onResume() {
            super.onResume();
            wl.acquire();
        }//End of onResume

然后在清单文件中添加权限

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

现在你的活动将永远清醒。 您可以根据自己的要求执行w1.release()等其他操作。

AndroidManifest.xml添加权限,如下所示

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

最好在你的<application>声明标签之前但在<manifest>标签之后,然后尝试使你的onCreate()方法只包含WakeLock实例。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
}

然后在你的onResume()方法的地方

@Override
public void onResume() {
   mWakeLock.aquire();
}

并在你的onFinish()方法的地方

@Override
public void onFinish() {
   mWakeLock.release();
}

要实现相同的程序,您可以使用以下

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

或者在布局中添加以下内容也将执行上述任务

 android:keepScreenOn="true"

您可以从以下网址http://developer.android.com/training/scheduling/wakelock.html获取详细信息

当键盘锁定时我使用了以下组合来唤醒我的屏幕并保持我的屏幕开启

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

保持屏幕开启

第一种方式:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

第二种方式:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

保持CPU开启:

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

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

要释放唤醒锁定,请调用wakelock.release() 这将释放您对CPU的声明。 一旦您的应用程序完成使用它以避免耗尽电池,释放唤醒锁定非常重要。

文档在这里

谢谢你这个帖子。 我一直很难在我的代码中实现一个定时器5分钟来运行一个活动,因为我的手机已经设置为屏幕关闭/睡眠大约2分钟。 根据上述信息,我似乎能够得到解决方案。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* Time Lockout after 5 mins */
    getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

       public void run() {

        Intent i = new Intent(AccountsList.this, AppEntryActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        finish();
        return;

       }

    }, 300000); 
    /* Time Lockout END */
 }

Android开发者网站的示例代码片段

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }

后台工作的最佳实践

我有个类似的问题。 我可以让屏幕保持开启,但如果我使用部分唤醒锁定并关闭屏幕,则在打开屏幕之前不会调用我的onFinish功能。

你可以使用mWakeLock.isHeld()检查你的唤醒锁,首先,确保你得到它。 最简单的方法是将其添加到代码中,在调试器中设置断点,然后检查它。

在我的情况下,我得到它,但部分唤醒锁似乎没有做任何事情。 这是我的屏幕调光锁的工作代码。

protected void setScreenLock(boolean on){
        if(mWakeLock == null){
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
                                        PowerManager.ON_AFTER_RELEASE, TAG);
        }
        if(on){
         mWakeLock.acquire();
        }else{
            if(mWakeLock.isHeld()){
                mWakeLock.release();
            }
         mWakeLock = null;
        }

    }

附录:

Droid Eris和DROID用户向我报告说这不适用于他们的设备,尽管它在我的G1上工作正常。 你在测试什么设备? 我认为这可能是一个Android错误。

{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); 
wakeLock.acquire();}

使用此代码,不要忘记在Android清单中允许唤醒锁

确保在准备好释放mWakeLock之前不会意外清除它。 如果它已完成,则锁定被释放。 例如,如果将其设置为null并且垃圾收集器随后运行,则会发生这种情况。 如果您不小心设置了同名的局部变量而不是方法级变量,也会发生这种情况。

我还建议检查LogCat以查找具有PowerManagerService标记的条目或传递给newWakeLock的标记。

创建唤醒锁时,请尝试使用ACQUIRE_CAUSES_WAKEUP标志。 ON_AFTER_RELEASE标志只是重置活动计时器以使屏幕保持更长时间。

http://developer.android.com/reference/android/os/PowerManager.html#ACQUIRE_CAUSES_WAKEUP

在AndroidManifest.xml中添加权限:

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

然后在my.xml中添加代码:

android:keepScreenOn="true"

在这种情况下永远不会关闭页面! 你可以阅读更多这个

如果您的用例在执行操作时打开屏幕(活动),则不应使用 WakeLock。

最好的方法是启用标志FLAG_KEEP_SCREEN_ON

您可以以编程方式执行此操作:

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

或者在应用程序的布局 XML 文件中,使用android:keepScreenOn属性:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

保持屏幕亮着


如果不是这种情况,请根据您的用例检查这些替代解决方案使用唤醒锁的替代方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM