20

WebViewを使用してアクティビティ内のFlashコンテンツを表示することを試みています。すべてがうまく機能していますが、ユーザーがホームキーを押してアクティビティをバックグラウンドに置くと、Flashコンテンツが実行され続けます(サウンドが再生され続けるなど)。

標準のAndroidブラウザとDolphinブラウザの両方がこの問題を回避しているように見え、ブラウジングアクティビティがバックグラウンドに置かれたときにFlashコンテンツを適切に一時停止していることに気付きました。

理想的には、アクティビティが終了している場合はWebViewを完全に強制終了し、それ以外の場合は一時停止するソリューションが必要です(基本的にブラウザーのデフォルトの動作をコピーします)

これが私がまとめた簡単なテストで、バックグラウンドミュージックがあるKongregateにゲームをロードします。

    public class BrowserTest extends Activity {
    private WebView mWebView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            mWebView = new WebView(this);
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.getSettings().setPluginsEnabled(true);

            mWebView.loadUrl("http://m.kongregate.com/games/Jiggmin/the-game-of-disorientation-mobile");
            setContentView(mWebView);
        }

        @Override
        protected void onPause(){
            super.onPause();

            mWebView.pauseTimers();
            if(isFinishing()){
                mWebView.loadUrl("about:blank");
                setContentView(new FrameLayout(this));
            }
        }

        @Override
        protected void onResume(){
            super.onResume();
            mWebView.resumeTimers();
        }
    }

ストックブラウザの最新のソースを調べたところ、似たようなことをしているようです(pauseTimers / resumeTimersを呼び出しています)が、私が見ているコードは古くなっているのではないかと心配しています。もう存在しないようです。

カウンターを更新する単純なJavaScriptsetIntervalを使用してテストすることにより、pauseTimersの呼び出しが機能していることを確認しました。ウィンドウまたはビューの管理に関して、他に明らかなことはありますか?

モバイルFlashプレーヤーのドキュメントには次のように書かれています。

Flash Playerは、CPU使用率、バッテリー使用量、メモリ使用量を削減するために、表示されていないSWF再生またはフォアグラウンドアプリケーションを自動的に一時停止します。

これは、ストックブラウザとドルフィンブラウザの両方で完全に機能しているようですが、私のアプリでは機能していません。任意のアイデア/ソリューションをいただければ幸いです。

更新:これを機能させるためにアクティビティに追加した関数は次のとおりです。アクティビティのonPause関数では「onPause」、アクティビティのonResume関数では「onResume」と呼びます。

private void callHiddenWebViewMethod(String name){
    if( mWebView != null ){
        try {
            Method method = WebView.class.getMethod(name);
            method.invoke(mWebView);
        } catch (NoSuchMethodException e) {
            Log.error("No such method: " + name, e);
        } catch (IllegalAccessException e) {
            Log.error("Illegal Access: " + name, e);
        } catch (InvocationTargetException e) {
            Log.error("Invocation Target Exception: " + name, e);
        }
    }
}
4

2 に答える 2

8

あなたがそれをどこで見ているBrowserActivityのか、何かが呼んでいるのかわかりませんpauseTimers()onPause()BrowserActivity最終的なルートonPause()がどこにあるかはわかりますWebView。ただし、onPause()ofWebViewには@hide注釈が付いているため、SDKの一部ではありません。コメントを考えると、カフから離れると、onPause()が必要なように見えます。

これを呼び出すと、このビューとそれに関連するDOM / plugins / javascript/etcに関連付けられている追加の処理が一時停止されます。たとえば、ビューが画面外に表示される場合、これを呼び出して、不要なCPUやネットワークトラフィックを減らすことができます。ビューが再び「アクティブ」になったら、onResume()を呼び出します。

pauseTimers()ドキュメントに記載されていない「プラグイン」への参照に注意してください。

リフレクションを使用して、onPause()(後でonResume()、何かを再起動したいときに)必要なことを実行できるかどうかを確認してみます。もしそうなら、これについてb.android.comに問題を投稿し、これらのメソッド(または同等のもの)をSDKに追加するように依頼してください。要件は一般的なもののようであり、SDKを超えるソリューションは適切なソリューションではありません。

于 2010-08-07T19:53:30.697 に答える
7
@Override
protected void onPause() {
    super.onPause();
    this.callHiddenWebViewMethod("onPause");
}

@Override
protected void onResume() {
    super.onResume();
    this.callHiddenWebViewMethod("onResume");
}

これはあなたがあなたの活動でそれを呼ぶ方法です...魅力のように機能します。

于 2012-01-10T17:11:19.440 に答える