Android 使用wakelock时发生强制关闭错误

Android 使用wakelock时发生强制关闭错误,android,wakelock,Android,Wakelock,我找了很多问题的答案,但似乎什么都没用。我正在应用程序中使用ACQUIRE_CAUSES_WAKEUP wakelock。但每当我在模拟器和设备上运行代码时,都会收到force close错误消息 我的代码如下:- PowerManager.WakeLock wakeLock; final PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); wakeLock = power

我找了很多问题的答案,但似乎什么都没用。我正在应用程序中使用ACQUIRE_CAUSES_WAKEUP wakelock。但每当我在模拟器和设备上运行代码时,都会收到force close错误消息

我的代码如下:-

    PowerManager.WakeLock wakeLock;
    final PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
检查条件后,将调用startAction()方法。我需要在这个方法中获得我的wakelock

    public void startAction(){  
        wakeLock.acquire();
        alert.setVisibility(View.VISIBLE);
        click.setVisibility(View.VISIBLE);
        ....
    }
在一个停止按钮点击事件中,我释放我的wakelock

click.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            // TODO Auto-generated method stub

            v.cancel();
            tg.stopTone();
            tg.release();
            shouldRun=false;
            myThread.interrupt();
            message = (TextView) findViewById(R.id.tvMessage);
            message.setVisibility(View.VISIBLE);
            message.setText(body);                
            speakOut(); 
            wakeLock.release();


        }
logcat错误显示:-

 02-25 13:05:26.246: E/AndroidRuntime(2026): FATAL EXCEPTION: main
02-25 13:05:26.246: E/AndroidRuntime(2026): java.lang.RuntimeException: Unable to start activity ComponentInfo  {com.example.accessinbox/com.example.accessinbox.AccessInbox}: java.lang.IllegalArgumentException
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.os.Looper.loop(Looper.java:123)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread.main(ActivityThread.java:3683)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at java.lang.reflect.Method.invokeNative(Native Method)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at java.lang.reflect.Method.invoke(Method.java:507)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at dalvik.system.NativeStart.main(Native Method)
02-25 13:05:26.246: E/AndroidRuntime(2026): Caused by: java.lang.IllegalArgumentException
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.os.PowerManager$WakeLock.<init>(PowerManager.java:224)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.os.PowerManager.newWakeLock(PowerManager.java:396)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at com.example.accessinbox.AccessInbox.onCreate(AccessInbox.java:63)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-25 13:05:26.246: E/AndroidRuntime(2026):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-25 13:05:26.246: E/AndroidRuntime(2026):     ... 11 more
02-25 13:05:26.246:E/AndroidRuntime(2026):致命异常:主
02-25 13:05:26.246:E/AndroidRuntime(2026):java.lang.RuntimeException:无法启动活动组件信息{com.example.accessinbox/com.example.accessinbox.accessinbox}:java.lang.IllegalArgumentException
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.os.Handler.dispatchMessage(Handler.java:99)上
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.os.Looper.loop(Looper.java:123)上
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread.main(ActivityThread.java:3683)上
02-25 13:05:26.246:E/AndroidRuntime(2026):位于java.lang.reflect.Method.Invokenactive(本机方法)
02-25 13:05:26.246:E/AndroidRuntime(2026):在java.lang.reflect.Method.invoke(Method.java:507)
02-25 13:05:26.246:E/AndroidRuntime(2026):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-25 13:05:26.246:E/AndroidRuntime(2026):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-25 13:05:26.246:E/AndroidRuntime(2026):在dalvik.system.NativeStart.main(本机方法)
02-25 13:05:26.246:E/AndroidRuntime(2026):由以下原因引起:java.lang.IllegalArgumentException
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.os.PowerManager$WakeLock。(PowerManager.java:224)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.os.PowerManager.newWakeLock(PowerManager.java:396)
02-25 13:05:26.246:E/AndroidRuntime(2026):位于com.example.accessinbox.accessinbox.onCreate(accessinbox.java:63)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-25 13:05:26.246:E/AndroidRuntime(2026):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-25 13:05:26.246:E/AndroidRuntime(2026年):。。。还有11个

您必须指定要获取的唤醒锁类型(读取),没有默认类型,
PowerManager.ACQUIRE\u CAUSES\u WAKEUP
只是一个可选参数


您可以看到它与wakelock类型掩码的参数,如果没有,则抛出一个IAE。不过,他们真的应该把异常消息放在那里,这样会使情况更加清楚。

?除了部分唤醒锁定,所有其他唤醒锁定似乎都不受欢迎。知道为什么会这样吗?在相应的描述中提到了-从API17开始,他们决定你不需要使用完全唤醒锁定,或者除非你真的知道为什么需要:)大多数情况下,人们使用它是为了让屏幕不关闭,有一个标志将其与部分唤醒锁定相结合。如果您想要更深入的解释,您需要挖掘API17变更日志,也许他们有更技术性的解释。简言之,如果您确定需要,请使用SCREEN_BRIGHT_WAKE_LOCK而不是PARTIAL_WAKE_LOCK和WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON–不要介意解释中的不推荐项:)当我使用PARTIAL_WAKE_LOCK时,它仍然显示相同的错误日志。但是,如果我使用“保持屏幕打开”标志,它工作正常。但有没有办法在我的任务完成后禁用此标志?当您的活动启动时,此标志将处于活动状态。因此,要解除它,如果不再需要它,您可以
.finish()
该活动,或者执行
getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u保持屏幕\u打开)如果希望活动保持在那里–在这种情况下,屏幕将像往常一样在超时后关闭。当然,也不要忘记释放唤醒锁。