[英]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.