androidwakelock_如何使Android WakeLock正常工作?

如何使Android WakeLock正常工作?

我的WakeLock不能使我的设备保持唤醒状态。

在mWakeLock中,我得到了:

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。 我非常感谢您为解决此问题提供的帮助。

Curyous asked 2020-06-21T09:49:47Z

13个解决方案

106 votes

WakeLock通常不会导致重新启动问题。 您的编码中可能还有其他问题。WakeLock会消耗大量电池,如果使用后没有释放电池。

WakeLock是使屏幕保持打开状态的一种低效方式。 而是使用WindowManager来做魔术。 下面的一行足以满足WakeLock的要求。WakeLock权限也需要此项才能起作用。同样,此代码比wakeLock更有效。

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

您无需手动释放WakeLock。 此代码将允许Android系统自动处理锁定。 当您的应用程序位于前景中时,将保持WakeLock,否则android系统会自动释放Lock。

试试这个,发表您的评论...

Anoop CH answered 2020-06-21T09:50:19Z

50 votes

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

wf. answered 2020-06-21T09:50:38Z

23 votes

您只需要编写以下代码:

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

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

现在,您的活动将始终保持清醒状态。您可以根据需要执行其他操作,例如w1.release()。

Maverick answered 2020-06-21T09:51:08Z

7 votes

如下所示,在onFinish()中添加权限

最好在您的onFinish()声明标签之前,但在标签之后,之后,尝试使您的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");

}

然后在您的onFinish()方法位置

@Override

public void onResume() {

mWakeLock.aquire();

}

并在您的onFinish()方法中

@Override

public void onFinish() {

mWakeLock.release();

}

CharlieNorris answered 2020-06-21T09:51:41Z

6 votes

要实现相同的程序设计,您可以使用以下代码

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);

Sunil Kumar Sahoo answered 2020-06-21T09:52:14Z

6 votes

保持萤幕开启

第一种方式:

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

第二种方式:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:keepScreenOn="true">

...

保持CPU处于打开状态:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

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

wakeLock.acquire();

要释放唤醒锁,请致电wakelock.release()。这会将您的主张释放给CPU。 请务必在应用程序使用完后立即释放唤醒锁,以免耗尽电池。

文档在这里。

Beyaz answered 2020-06-21T09:53:00Z

2 votes

我有个类似的问题。 我可以让屏幕保持打开状态,但是如果我使用了部分唤醒锁并且关闭了屏幕,则在打开屏幕之前不会调用我的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错误。

Brock Tice answered 2020-06-21T09:53:38Z

2 votes

感谢您的关注。我一直在花5分钟的时间在代码中实现Timer来进行一项活动,这一直很困难,因为我的手机已设置为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 */

}

Steven Bennett answered 2020-06-21T09:53:59Z

2 votes

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);

}

后台作业的最佳做法

Sree Rama answered 2020-06-21T09:54:23Z

2 votes

{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);

WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock");

wakeLock.acquire();}

使用此代码,别忘了在Android清单中允许唤醒锁

Tugadar answered 2020-06-21T09:54:43Z

1 votes

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

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

Emdot answered 2020-06-21T09:55:08Z

1 votes

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

[HTTP://developer.Android.com/reference/Android/OS/power manager.HTML#acquire_causes_wakeup]

Archit answered 2020-06-21T09:55:33Z

0 votes

在AndroidManifest.xml中添加权限:

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

android:keepScreenOn="true"

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

Mortreza AD answered 2020-06-21T09:56:02Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
author:杨兴达; 邮箱:yangxingda1988@163.com 电话:180 1018 0585 Android 电源管理 -- wakelock机制,通过控制wakelock 实现保持pad 禁止休眠状态; Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是没有超时的, 超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠. PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心。 第二种锁是超时锁,这种锁会在锁住后一段时间解锁。 在创建了 PowerManager.WakeLock 后,有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( --count == 0 )的时候,同样当 (count == 0) 的时候才会去申请加锁。所以 PowerManager.WakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计,然后再去操作。 源码 位置:frameworks/base/core/java/android/os/PowerManager.java ++++++++++++++++++++++++ 讲述 应用层 申请的锁 怎么传到kernel下面的,来理解 整个wakelock的框架。 比如android跑起来之后 在 /sys/power/wake_lock 下面的PowerManagerService 的生成过程。 1).应用程序申请锁 Android 提供了现成 android.os.PowerManager 类 , 类中 提供newWakeLock(int flags, String tag)方法 来取得 应用层的锁, 此函数的定义 frameworks/base/core/java/android/os/PowerManager.java 应用程序 在申请wake_lock时 都会有调用以下 部分。 实例: PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, “MyTag”); wl.acquire();//申请锁,这里会调用PowerManagerService里面acquireWakeLock() *********************** wl.release(); //释放锁,显示的释放锁,如果申请的锁不在此释放,系统就不会进入休眠。 ====================================== 2). frameworks层 /frameworks/base/services/java/com/android/server/PowerManagerService.java这个类是来管理 所有的应用程序 申请的wakelock。比如音视、频播放器、camera等申请的wakelock 都是通过这个类来 管理的。 static final String PARTIAL_NAME ="PowerManagerService" nativeAcquireWakeLock(PARTIAL_WAKE_LOCK_ID, PARTIAL_NAME); 上面 这个函数调用Power类 里面的 acquireWakeLock(),此时的PARTIAL_NAME作为参数传递到底层去。 public static native void nativeAcquireWakeLock(int lock, String id); 注:在PowerManagerService 类中没有实现nativeAcquireWakeLock,其实现体在 frameworks/base/core/jni/android_os_Power.cpp中,所以nativeAcquireWakeLock()方法时会调用JNI下的实现方法。 3).JNI层的实现 路径:frameworks/base/core/jni/android_os_Power.cpp // static void acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) { ************** const char *id = env->GetStringUTFChars(idObj, NULL); acquire_wake_lock(lock, id); env->ReleaseStringUTFChars(idObj, id); } 注:在acquireWakeLock()中调用了 路径下hardware/libhardware_legacy/power/power.c下面的acquire_wake_lock(lock, id) 4).与kernel层的交互 在power.c下的acquire_wake_lock(lock, id)函数如下: int acquire_wake_lock(int lock, const char* id) { ************** return write(fd, id, strlen(id)); } 注: fd就是文件描述符,在此 表示”/sys/power/wake_lock” id就是从PowerManagerService类中传下来的参数即:PARTIAL_NAME = "PowerManagerService" 到此 就是通过 文件系统 来与kernel层 交互的地方。 +++++++++++++++++++++++++++++++++++++++++++++++++++++ PowerManager类被应用程序调用,控制电源设备状态切换: PowerManager类对外有三个接口函数: 1、void goToSleep(long time); //强制设备进入Sleep状态 Note:在应用层调用该函数, 应用需要 在 源码下编译,用系统签名,否则 调用 此函数 出错; 2、newWakeLock(int flags, String tag);//取得相应层次的锁 flags参数说明: PARTIAL_WAKE_LOCK :保持CPU 运转,屏幕和键盘灯是关闭的。 SCREEN_DIM_WAKE_LOCK :保持CPU 运转,允许保持屏幕显示但有可能是灰的,关闭键盘灯 SCREEN_BRIGHT_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,关闭键盘灯 FULL_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 ACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时,强制打开Screen和keyboard light ON_AFTER_RELEASE: 在释放锁时reset activity timer Note: 如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时 如果申请了其它的wakelocks,按Power键,系统还是会进Sleep 3、void userActivity(long when, boolean noChangeLights);//User activity事件发生,设备会被切换到Full on的状态,同时Reset Screen off timer. PowerManager和WakeLock的操作步骤 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemService().方法获取PowerManager实例。 然后通过PowerManager的newWakeLock ((int flags, String tag)来生成WakeLock实例。int Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。 获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他操作,最后使用release()释放(释放是必须的)。 Note: 1. 在使用以上函数的应用程序中,必须在其Manifest.xml文件中加入下面的权限: <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> 2. 所有的锁必须成对的使用, 如果申请了而没有及时释放,会造成系统故障。如申请了partial wakelock,而没有及时释放, 那系统就永远进不了Sleep模式.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值