1

在我的应用程序中,我有一个子类,它扩展了在leanback 支持库中调用的支持库类。我需要扩展这个类,但不幸的是父 ( ) 类有一个我不能使用的方法。SearchFragmentonPause()SearchFragment

每次我离开活动时,父类都会运行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 端口。Fire TV 没有语音识别器。

4

5 回答 5

0

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不会两次运行代码。

于 2016-08-17T03:06:20.933 回答
0

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

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

于 2016-08-17T03:43:23.917 回答
0

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

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

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


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

于 2016-08-17T05:19:17.443 回答
-1

正如android 文档中提到的,在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();
}
于 2016-08-17T03:42:48.397 回答
-1

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

于 2016-08-17T04:18:48.900 回答