0

メインのアクティビティのonStop、onPause、onResumeコールバックを別のクラス/オブジェクト内で受信できるかどうか誰か知っていますか?

別のクラス(WebView)内にあるブロードキャストレシーバーがあります。私は受信機を使用してネットワークがダウンしたことを検出し、いくつかの有用なコンテンツを含む私のページのローカルコピーに切り替えます。onStop / onPauseが呼び出されたときにブロードキャストレシーバーの登録を解除し、onResume中に再登録する必要があります。

これは手動で行うことができます(WebViewを拡張するクラスにいくつかのパブリックメソッドを追加して、それを実行します)が、Androidに呼び出してもらうと便利です。

編集:確かに、これがクラスです。startInternetMonitoring()/ stopInternetMonitoring()を呼び出さなくても、メインアクティビティのonStopが呼び出されたときに、Androidからコールバックを受け取ることができるようにしたいと思います。

    package com.glimmersoft.spent;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.res.Resources;
    import android.net.ConnectivityManager;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.webkit.WebSettings;
    import android.webkit.WebView;

    /**
     * @author Jer
     *
     */
    public class OfflineWebView extends WebView {

        private BroadcastReceiver receiver;
        private IntentFilter filter;
        private Context myContext;

        public OfflineWebView(Context context,AttributeSet attrs) {
            super(context, attrs);
            WebSettings webSettings = this.getSettings();
            webSettings.setJavaScriptEnabled(true);
            myContext = context;

        }//END CLASS CONSTRUCTTOR

        /**
         * @param internetOn        The URL to display in this OfflineWebView when there is an active Internet connection.
         * @param internetOff       The URL to display in this OfflineWebView if there is no active Internet connection.
         */
        public void setPages(final String internetOn, final String internetOff){

            final OfflineWebView finalThisRef = this;

            filter = new IntentFilter();
            filter.addAction(SpendConstants.ANDROID_CONNECTIVITY_CHANGED);

            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                   ConnectivityManager cm=(ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);


                   if(cm.getActiveNetworkInfo()!=null&&cm.getActiveNetworkInfo().isConnected()){// TODO: THIS FAILES IF 

                            finalThisRef.loadUrl(internetOn);

                       }else{                      
                            finalThisRef.loadUrl(internetOff);
                       }
                   }//END IF/ELSE

              };

              myContext.registerReceiver(receiver, filter);

        }//END FUNCTION SETPAGES

        public void startInternetMonitoring(){      
            myContext.registerReceiver(receiver, filter);       
        }//END METHOD STARTINTERNETMONITORING

        public void stopInternetMonitoring(){
            myContext.unregisterReceiver(receiver);
        }//END METHOD STOPINTERNETMONITORING

    }//END CLASS OfflineWebView

皆さんありがとう!

4

1 に答える 1

1

BroadcastReceiver を OfflineWebView 内に配置する代わりに、おそらく基本アクティビティに登録する静的クラスにして、OfflineWebView への参照を保持します。onReceive が呼び出されると、OfflineWebView を参照してオンライン/オフライン コンテンツを読み込むことができます。

ファイル: MyBaseActivity.java

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.webkit.WebView;

public class MyBaseActivity extends Activity {

    private static final String ANDROID_CONNECTIVITY_CHANGED = "android.net.conn.CONNECTIVITY_CHANGE";
    protected static final ConnectivityBroadcastReceiver sReceiver = new ConnectivityBroadcastReceiver();
    private static final IntentFilter sFilter = new IntentFilter(ANDROID_CONNECTIVITY_CHANGED);

    static class ConnectivityBroadcastReceiver extends BroadcastReceiver {

        private String internetOnUrl = "your online url";
        private String internetOffUrl = "your offline url";
        WebView offlineWebView;

        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            // only do your online/offline loading if we have a webview set
            if (offlineWebView != null) {

                if (cm.getActiveNetworkInfo() != null
                        && cm.getActiveNetworkInfo().isConnected()) {
                    offlineWebView.loadUrl(internetOnUrl);
                } else {
                    offlineWebView.loadUrl(internetOffUrl);
                }
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        // register receiver
        registerReceiver(sReceiver, sFilter);
    }

    @Override
    public void onStop() {
        super.onStop();
        // unregister receiver
        unregisterReceiver(sReceiver);
    }
}

ファイル: MyActivity.java

import android.R;
import android.os.Bundle;
import android.webkit.WebView;


public class MyActivity extends MyBaseActivity {

    private WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // load your content root
        setContentView(R.layout.main_layout);

        // find your webview
        mWebView = (WebView)findViewById(R.id.webView);
    }

    @Override
    public void onStart() {
        super.onStart();
        // set your webview in the OfflineBroadcastReceiver
        sReceiver.offlineWebView = mWebView;
    }

    @Override
    public void onStop() {
        super.onStop();
        // clear your webview from the OfflineBroadcastReceiver
        sReceiver.offlineWebView = null;
    }
}
于 2013-01-02T02:38:24.810 に答える