当屏幕休眠时保持活动运行

7
所以,我构建了一个功能作为锁屏替代品的应用程序。我使用广播接收器和服务在Intent.ACTION_SCREEN_OFF之后启动我的活动。这样每次用户锁定屏幕时我的活动都会启动,然后当他们按下解锁按钮时,我的活动已经在锁屏界面上运行。但是,如果用户等待太长时间,这只适用于他们尝试唤醒/解锁手机的短时间。如果他们等待太久,活动就消失了。我不确定为什么会发生这种情况,以及我该如何保持活动无论用户等待多长时间都存在于手机上。
我考虑并尝试监听Intent.ACTION_SCREEN_ON,但是这样会出现问题,即从用户按下手机电源键唤醒它到应用程序加载并显示在屏幕上有一定延迟的时候,期间用户可以看到Android操作系统。
2个回答

4
如果您使用 wakelock,会发生什么呢?例如:
@Override
public void onCreate(Bundle savedInstanceState) { 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
    wl.acquire();
    // do your things, even when screen is off
}


@Override
protected void onDestroy() {
    wl.release();
}

你还需要在 AndroidManifest.xml 中拥有一个唤醒锁权限。
uses-permission android:name="android.permission.WAKE_LOCK"

我应该把 acquire()release() 放在哪里?我假设在我的 onCreate() 中放置 acquire() - Peter

1
你可以尝试的一种方法是确保你的应用程序从不休眠。在短暂的休眠期间,它将保持运行状态。在长时间的休眠期间,你的应用程序本身处于睡眠状态。我自己使用PowerManager.Wakelock解决了这个问题。唯一的问题是,如果你的应用程序正在使用CPU周期,这将消耗更多的电池电量。
/** wake lock on the app so it continues to run in background if phone tries to sleep.*/
PowerManager.WakeLock wakeLock;

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

    // keep the program running even if phone screen and keyboard go to sleep
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);

    ...
}

// use this when screen sleeps
wakeLock.acquire();

// use this once when phone stops sleeping
wakeLock.release();

1
我尝试了这个,但是经过一段时间(大约30秒),活动仍然暂停、停止,然后销毁。 - Peter
使用这个方法并在清单文件中设置android:persistent="true"可能是关键。 - JPM
你看过这个问题/答案吗?https://dev59.com/kXA65IYBdhLWcg3wyh57 - JPM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接