有类似的帖子,但没有一个是我正在寻找的。我想更改特定活动的屏幕超时。我希望尽可能避免使用WakeLock,并且我不想更改设备的系统范围超时延迟设置。
有没有办法做到这一点,无法手动跟踪用户活动和使用唤醒锁?
= ---- =
澄清:例如,如何设置屏幕不活动超时(在没有输入后屏幕关闭所需的时间)为3分钟的某些值?
可以通过设置系统设置来执行此操作,但这会影响整个设备(即使应用程序关闭后也是如此),因此这不是一个好的解决方案。
谢谢!
答案 0 :(得分:4)
首先,关于更改系统设置以增加活动超时的说明。直觉上我不喜欢这种方法,因为您只是为了适应您的应用而进行系统范围的更改。此外,当以这种方式更改系统设置时,很难保证您能够将其设置回来(即您在设置之前忘记将其设置回/您的应用程序崩溃)。
解决方案的快速摘要:
现在,代码:
private ViewGroup mActivityTopLevelView;
private static final int DISABLE_KEEP_SCREEN_ON = 0;
private static final int SCREEN_ON_TIME_MS = 1000*60*3;
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
setScreenOn(true);
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
setScreenOn(false);
}
@Override
public void onUserInteraction() {
super.onUserInteraction();
Log.d(TAG, "onUserInteraction");
setScreenOn(true);
}
private void setScreenOn(boolean enabled)
{
// Remove any previous delayed messages
Log.d(TAG, "setScreenOn to " + enabled);
mHandler.removeMessages(DISABLE_KEEP_SCREEN_ON);
if( enabled )
{
// Send a new delayed message to disable the screen on
// NOTE: After we call setKeepScreenOn(false) the screen will still stay on for
// the system SCREEN_OFF_TIMEOUT. Thus, we subtract it out from our desired time.
int systemScreenTimeout = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 0);
int totalDelay = SCREEN_ON_TIME_MS - systemScreenTimeout;
if( totalDelay > 0 )
{
mActivityTopLevelView.setKeepScreenOn(true);
Log.d(TAG, "Send delayed msg DISABLE_KEEP_SCREEN_ON with delay " + totalDelay);
mHandler.sendEmptyMessageDelayed(DISABLE_KEEP_SCREEN_ON, totalDelay);
}
}
else
{
mActivityTopLevelView.setKeepScreenOn(false);
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == DISABLE_KEEP_SCREEN_ON)
{
setScreenOn(false);
}
}
};
在Android 5.1.0上测试。
答案 1 :(得分:0)
根据我的阅读,看起来你试图在一段时间后解雇活动。 (如果我误解了你的问题,请纠正我。)你可以尝试使用计时器在一定时间后解雇活动。例如:
String
任务指的是需要执行的方法(功能解除您的活动),超时表示执行任务之前的延迟。
答案 2 :(得分:0)
根据我的理解,你有2个要求,
1)更改特定活动屏幕超时
2)如果用户没有长时间锁定屏幕。
它可以这样做,
为了更改屏幕超时,因为你不想使用任何WAKE LOCK试试这个
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);
}
你可以在这里阅读https://developer.android.com/training/scheduling/wakelock.html
第二部分
一旦应用程序启动,就会在应用程序的共享首选项中启动计时器,如果计时器计数超过所需的时间限制,则重置标志以使屏幕锁定
答案 3 :(得分:0)
只需在您的应用被预见时暂时更改设置:
String originalTimeout;
int temporaryTimeout = 1 * 60 * 1000;
@Override
protected void onResume() {
super.onResume();
originalTimeout = Settings.System.getString(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT);
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, temporaryTimeout);
}
@Override
protected void onPause() {
super.onPause();
Settings.System.putString(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, originalTimeout);
}
这需要android.permission.WRITE_SETTINGS
权限。