繁体   English   中英

Android停止在父类中调用onPause

[英]Android stop onPause from being called in parent class

在我的应用程序中,我有一个子类,该子类扩展了leanback支持库中名为SearchFragment支持库类。 我需要扩展此类,但不幸的是,父类( SearchFragment )的onPause()具有无法使用的方法。

每次我离开活动时,父类都会运行onPause() ,该方法调用我不需要的方法。

有没有一种方法可以扩展SearchFragment类,但不允许其运行自己的onPause()

这是父类中无法更改的onPause()方法。

android.support.v17.leanback.app.SearchFragment

@Override
public void onPause() {
    releaseRecognizer(); //Need to stop this from calling
    super.onPause();
}

private void releaseRecognizer() {
    if (null != mSpeechRecognizer) {
        mSearchBar.setSpeechRecognizer(null);
        mSpeechRecognizer.destroy();
        mSpeechRecognizer = null;
    }
}

另外,我这样做的原因是因为这是Android TV> Fire TV端口。 消防电视没有语音识别器。

onPause是活动生命周期的一部分,不能忽略,但是您可以做一些修改。 它要求您修改releaseRecognizer()方法的行为。

可以如下更改代码:

boolean isReleased;

public void releaseRecognizer() {
   if(isReleased) {
      return;
   }
   ...
   //your code go here
   ...
   isReleased = true;
}

//Somewhere else where you acquire the recognizer again you just set it to false:

public void acquireRecognizer(){

   ...
   isReleased = false
}

这样,您可以确保releaseRecognizer不会两次运行代码。

由于onPause()在具有public可访问性的父SearchFragment类的方法之一中,因此您可以在子类中简单地覆盖它,而不用调用super.onPause() 这不会将方法传播到父类,因此不会调用臭名昭著的releaseRecognizer()

但是,您需要注意实现与SearchFragment其他生命周期方法正确捆绑的业务逻辑,以免滥用系统资源。 因此,您需要根据用例逻辑修改覆盖的代码,以便最终最终调用onPause()

使用Proguard assumenosideeffects选项可以消除SearchFragment中对releaseRecognizer()方法的调用。 这将要求您在启用Proguard的情况下编译代码,但是由于有问题的代码是在某些特定情况下调用的,因此您可能只能在发行版本中使用Proguard。

请注意,您必须启用优化( 不得设置dontoptimize选项),因为从技术上说,通过assumenosideeffects剥离对方法的调用是“优化”。

确保在此答案中使用建议,以将Proguard操作限制为您要“优化”的特定类(在您的情况下为android.support.v17.leanback.app.SearchFragment)。


这是解决您的问题而不修改SearchFragment源代码的唯一方法。 再三考虑,您可能会简单地将必要的类复制到项目中,或者在最坏的情况下更好–将整个leanback支持库作为Gradle子模块插入并直接修改必要的方法(很有可能,Fire TV还有其他问题)除了这个)。

android文档中提到的,在onpause()释放系统资源是onpause()很好的做法。
我认为您应该在onResume()再次获取它。

@Override
public void onResume() {
super.onResume();
acquireRecognizer();
}

@Override
public void onPause() {
super.onPause();
releaseRecognizer();
}

或者,您应该在onStop()onDestroy()释放识别器。 这样,它将使识别器保持活动状态。

@Override
protected void onStop() {
super.onStop();
releaseRecognizer();
}

在我看来,您可以按照其他答案中此处建议的方法覆盖SearchFragment onPause,但是通过删除super.onPause()会遇到一些问题。 因此,一种安全的解决方案是编写您自己的SearchFragment类(复制该类中的所有代码并创建您自己的类),现在在该类中删除您不想在onPause()方法中调用的方法。 这样,您就不会删除超级呼叫,因此这种方法将是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM