【问题标题】:How to reduce the time delay between Activity Pause and Re-Start(by a Service)?如何减少活动暂停和重新启动(通过服务)之间的时间延迟?
【发布时间】:2013-05-05 15:03:36
【问题描述】:

我正在实现一个始终处于顶部的活动(通常实现锁定屏幕), 算法很简单:

  1. 开始活动
  2. 禁用所有硬件按钮,禁用后按、相机锁定、音量按钮等。
  3. 每当活动暂停时,调用服务检查并重新启动活动。

请参阅这些答案以了解逻辑:Answer 1Answer 2 每当 Activity 暂停并由服务重新启动时,都会有 6-7 秒的延迟。如何减少我的 Activity 暂停和重新启动之间的时间延迟。

暂停和恢复代码:

protected void onPause() {
    isFront = false;
    Intent lockHelper = new Intent( this, LockHelper.class);
    startService( lockHelper );
    super.onPause();
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
    if(keyCode==KeyEvent.KEYCODE_CAMERA)
        return true;
    else if(keyCode==KeyEvent.KEYCODE_VOLUME_DOWN)
        return true;
    else if(keyCode==KeyEvent.KEYCODE_VOLUME_UP)
        return true;
    else if(keyCode==KeyEvent.KEYCODE_HOME)
        return true;
    else if(keyCode==KeyEvent.KEYCODE_POWER)
        return true;
    else 
        return true;
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent keyEvent) {
    if(keyCode==KeyEvent.KEYCODE_HOME)
        return true;
    else if(keyCode==KeyEvent.KEYCODE_POWER)
        return true;
    else 
        return true;
}

@Override
public void onBackPressed() {
}

@Override
protected void onResume() {
    isFront = true;
    Intent lockHelper = new Intent( this, LockHelper.class);
    startService( lockHelper );
    super.onResume();
}

}

服务是:

public class LockHelper extends Service {
@Override
public void onStart(Intent intent, int startId) {
    if(Locker.isFront == false){
        Intent locker = new Intent( this, Locker.class);
        locker.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity( locker );
        stopSelf();
    }
}

public LockHelper() {
}

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}
}

【问题讨论】:

  • 我建议你做一个更详细的时间戳调试,6-7 seconds是根据你的直觉计算出来的吗?您可以在 Activity.onPause()、Service.onStart()、Activity.onCreate() 和 Activity.onResume() 上记录消息。这样您就可以根据日志时间戳知道哪个部分花费了很多时间。并删除 stopSelf,将您的代码放在 onStartCommand 上,重新创建服务可能需要大量时间,我相信这就是您的延迟发生的地方。
  • @ChorWaiChun 不是基于直觉,实际上 Activity 在其布局中有一个时钟,我通过时钟检查时间,即隐藏 Activity 的秒数。
  • 那么我建议您根据我以前的 cmets 对您的服务进行一些更改。
  • @RachitMishra 我面临同样的问题。你找到解决方案了吗?
  • @AnkurRaiyani 不!我现在采用了不同的方法。

标签: android


【解决方案1】:

onPause、onStop 和 onDestroy 中的代码应该尽可能快地执行。也就是说,不要在这里放很多代码来阻塞这些方法。但同样,这取决于你在这里做什么。如果这些事情真的很重要,我不确定如何减少时间延迟。

【讨论】:

  • 这些方法中的代码只是简单的启动一个服务,检查Activity是否在后台,然后重启Activity。
  • 我同意@Kumar Bibek 的观点,它在 onPause、onStop 和 onDestroy 中的代码效率很重要。仅对真正需要的那些使用禁用代码。
  • 我得到了 6 秒的延迟。 :|
【解决方案2】:

“我该如何减少我的 Activity 暂停和重新启动之间的时间延迟。”

您是否测量了这两个间隔发生的时间成本?

基本上,两种类型的任务:一种是系统任务和您的应用程序任务。

adb logcat -b system -v threadtime 应该打印出所有与活动/服务启动/停止相关的系统信息,以及时间戳。

您应该/可以尽可能减少花在应用上的时间,但没有办法减少系统行为的时间成本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2016-07-25
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多