アクティビティが表示されないときに、Android WebViewでフラッシュコンテンツを一時停止するにはどうすればよいですか?
-
26-09-2019 - |
質問
WebViewを使用してアクティビティ内にフラッシュコンテンツを表示することを実験しています。すべてが非常にうまく機能していますが、ユーザーがアクティビティをバックグラウンドに入れるためにホームキーにヒットすると、フラッシュコンテンツが実行され続けます(サウンドが再生され続けるなど)
ストックAndroidブラウザとDolphinブラウザの両方がこの問題を回避し、ブラウジングアクティビティがバックグラウンドに入れられたときにフラッシュコンテンツを適切に一時停止するように見えることに気付きました。
理想的には、アクティビティが終了している場合は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を呼び出します)。 'Tはもう存在しているようです。
Pausetimersへの呼び出しが、カウンターを更新する単純なJavaScript SetIntervalでテストすることで機能していることを確認しました。ウィンドウまたはビュー管理に関して私が試みるべきであるという明らかなことはありますか?
モバイルフラッシュプレーヤーのドキュメントは次のように述べています。
また、FlashプレーヤーはSWFの再生を自動的に一時停止します。たとえば、通話を受信したりアラームが消えたりする場合、CPUの使用率、バッテリーの使用、メモリの使用量を削減するなど、前景アプリケーションはありません。
これは、ストックブラウザとDolphinブラウザーの両方で完全に機能しているようですが、アプリでは完全に機能していません。どんなアイデア/ソリューションも大歓迎です!
アップデート: これが私たちのアクティビティに追加して、これを機能させる機能です。アクティビティのオンパウス関数の「オンポーズ」とアクティビティのオンレスメー関数の「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);
}
}
}
解決
あなたがそれを見る場所がわかりません BrowserActivity
または何でも呼んでいます pauseTimers()
. 。どこにあるのか onPause()
為に BrowserActivity
最終的には onPause()
の WebView
. 。でも、 onPause()
の WebView
持っています @hide
注釈などはSDKの一部ではありません。カフから、コメントを与えられて、onpause()があなたが望むもののように思われます:
これを呼び出して、このビューとそれに関連するDOM/プラグイン/JavaScript/などに関連する追加の処理を一時停止します。たとえば、ビューが画面から外れている場合、これは不必要なCPUおよび/またはネットワークトラフィックを減らすために呼び出されます。ビューが再び「アクティブ」になったら、onResume()を呼び出します。
で言及されていない「プラグイン」への参照に注意してください pauseTimers()
ドキュメンテーション。
リフレクションを使用して使用してみてください onPause()
(以降 onResume()
, 、ものをもう一度起動したいとき)あなたが必要とすることをします。もしそうなら、問題を投稿してください b.android.com これについて、これらの方法(または同等物)をSDKに追加するように依頼します。あなたの要件はそれが一般的なものであるように思われ、SDKを通過するソリューションは良い解決策ではありません。
他のヒント
@Override
protected void onPause() {
super.onPause();
this.callHiddenWebViewMethod("onPause");
}
@Override
protected void onResume() {
super.onResume();
this.callHiddenWebViewMethod("onResume");
}
これはあなたがあなたのアクティビティでそれを呼ぶ方法です...魅力のように機能します。