特定Android活动的屏幕超时时间更长?

时间:2014-02-13 23:08:05

标签: android

有类似的帖子,但没有一个是我正在寻找的。我想更改特定活动的屏幕超时。我希望尽可能避免使用WakeLock,并且我不想更改设备的系统范围超时延迟设置。

有没有办法做到这一点,无法手动跟踪用户活动和使用唤醒锁?

= ---- =

澄清:例如,如何设置屏幕不活动超时(在没有输入后屏幕关闭所需的时间)为3分钟的某些值?

可以通过设置系统设置来执行此操作,但这会影响整个设备(即使应用程序关闭后也是如此),因此这不是一个好的解决方案。

谢谢!

4 个答案:

答案 0 :(得分:4)

首先,关于更改系统设置以增加活动超时的说明。直觉上我不喜欢这种方法,因为您只是为了适应您的应用而进行系统范围的更改。此外,当以这种方式更改系统设置时,很难保证您能够将其设置回来(即您在设置之前忘记将其设置回/您的应用程序崩溃)。

解决方案的快速摘要:

  • 在为key,touch,trackball事件调用的Activity上使用Activity.onUserInteraction()方法。
  • 如果您的活动的根视图上有用户互动调用View.setKeepScreenOn()(或您的活动中的某些视图是持久的)。
  • 使用简单的Handler发布延迟消息,以便在一段时间后禁用屏幕。

现在,代码:

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权限。