Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-唤醒锁未正确获取,应用程序需要在待机状态下保持运行_Android_Accelerometer_Standby_Wakelock_Android Wake Lock - Fatal编程技术网

Android-唤醒锁未正确获取,应用程序需要在待机状态下保持运行

Android-唤醒锁未正确获取,应用程序需要在待机状态下保持运行,android,accelerometer,standby,wakelock,android-wake-lock,Android,Accelerometer,Standby,Wakelock,Android Wake Lock,在我的应用程序中,在主活动的onCreate()方法中,我创建了一个唤醒锁,以便在手机待机/屏幕关闭时CPU能够继续运行 在onCreate方法中,我还打算创建一个使用加速计的服务。这项服务需要在应用程序打开和监测加速计值时持续运行(我知道这对电池不好,但我需要它来做到这一点)。这是我目前的代码,服务可以正常启动 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

在我的应用程序中,在主活动的onCreate()方法中,我创建了一个唤醒锁,以便在手机待机/屏幕关闭时CPU能够继续运行

在onCreate方法中,我还打算创建一个使用加速计的服务。这项服务需要在应用程序打开和监测加速计值时持续运行(我知道这对电池不好,但我需要它来做到这一点)。这是我目前的代码,服务可以正常启动

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

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya");
        wl.acquire();

        if (appStart == true)  
        { 
            Intent AccelService = new Intent(this, Accelerometer.class);
            AccelService.putExtra("unreg", false);
            startService(AccelService);
        }
        appStart = false;
  }
我在清单中设置了以下权限-

<uses-permission android:name="android.permission.WAKE_LOCK" />
我看到有人说部分wakelocks不能正常工作,比如这个链接,但它是去年发布和关闭的,所以我不知道是不是这样,有人能帮我吗?关于最后一点,我也有HTC的愿望,谢谢

在我的应用程序中,在主活动的onCreate()方法中,我创建了一个唤醒锁,以便在手机待机/屏幕关闭时CPU能够继续运行

请在布局中的一个小部件上使用
android:keepScreenOn
。这比手动处理WakeLock要安全得多。另外,你不需要
WAKE\u LOCK
权限,IIRC

我在logcat上的输出在这里

该错误是因为您从未释放WakeLock。请不要泄漏
唤醒锁


现在,你写下了所有这些散文,包括了所有这些列表,但你忘记了一件事:实际上告诉了我们你的问题是什么。对于像StackOverflow这样的问答网站来说,这是一个相当重要的项目。而且,如果您从未定义希望接收的“帮助”是什么,那么“有人能在这里提供帮助吗?”不算问题。

出现问题的原因是您的WakeLock对象是OnCreate方法中的一个局部作用域变量。方法执行后-WakeLock对象不再被引用-因此符合垃圾收集的条件。如果发生Dalvik GC-对象已准备好完成-并且终结器内部代码警告您,WakeLock仍处于保留状态-并处于活动状态-但将被GC'删除。您必须获取新的WakeLock对象,并将其分配给活动派生类中类类型为WakeLock的字段。阅读有关面向对象编程和垃圾收集器的内容-您将理解这个问题

正如@Michal p所说,您在onCreate方法中获得了一个wakelock,但从未释放它

当GC扫描这个零引用对象时,调用默认的finalize方法,但实际上它是活动的

  @Override
    protected void finalize() throws Throwable {
        synchronized (mToken) {
            if (mHeld) {
                Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
                Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
                try {
                    mService.releaseWakeLock(mToken, 0);
                } catch (RemoteException e) {
                }
            }
        }
    }

好的,如果我不清楚,很抱歉,谢谢你的回复。我的问题是如何在手机上运行wakelock,以便在屏幕仍处于关闭状态时运行我的应用程序,因为我上面使用的代码不起作用。我宁愿不打开屏幕,这样它就不会浪费那么多电池,也不必在我决定将小部件投放市场时使用它(那么其他用户将不得不使用该小部件)@bobby123:一个活动不能在逻辑上需要部分
唤醒锁。一个服务可能需要一个部分的WakeLock,但不是一个活动,它存在的唯一目的就是在屏幕上显示内容。因此,要么让您的
WakeLock
退出活动,进入服务(调整您的业务逻辑以匹配),要么使用
android:keepScreenOn
。在服务的
onCreate()
中获取您的
WakeLock
,并在
onDestroy()中释放它。使用
startForeground()
,这样您的服务就不会被屏蔽,并为用户提供了一种简单的方式,让他们可以进入某个活动来停止服务。这就是我想知道的,谢谢。我会将唤醒锁移动到服务,因为这正是我真正需要它的原因。我有一个菜单按钮,用户可以随时结束服务。最后一个问题,你知道加速度计的onSensorChanged()方法在部分唤醒锁定下是否仍然有效,或者这仍然是谷歌的问题吗?@bobby123:“你知道加速度计的onSensorChanged()方法在部分唤醒锁定下是否仍然有效,或者这仍然是谷歌的问题吗?”--我不知道WakeLocks下的传感器行为记录在案,这意味着它可能因设备而异。然而,我没有对这个问题给予太多的关注,因为它不在我感兴趣的领域,所以我对这个话题还远远不是专家,对不起。从我所读到的所有内容来看,我认为它可能是特定于设备的,好吧,我想我无论如何都会问。好的,我会再次感谢你的建议。
  @Override
    protected void finalize() throws Throwable {
        synchronized (mToken) {
            if (mHeld) {
                Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
                Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
                try {
                    mService.releaseWakeLock(mToken, 0);
                } catch (RemoteException e) {
                }
            }
        }
    }