Android:注册其他活动的onstop

时间:2013-01-02 00:01:53

标签: android events broadcastreceiver android-activity

任何人都知道我是否可以在另一个类/对象中接收我的主要Activity的onStop,onPause和onResume回调?

我有一个广播接收器,它位于另一个类(WebView)中。我使用接收器来检测网络何时关闭并切换到我的页面的本地副本,其中包含一些有用的内容。我需要在调用onStop / onPause时取消注册广播接收器,并在onResume期间重新注册它。

我可以手动执行此操作(我向一个扩展WebView的类添加了一些公共方法来实现这一点),但让Android为我调用它会很好。

编辑:当然,这是类,我希望能够接收到来自Android的回调,当我的主要活动的onStop被调用时,无需调用startInternetMonitoring()/ stopInternetMonitoring():

    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

全部谢谢!

1 个答案:

答案 0 :(得分:1)

不要将您的BroadcastReceiver放入您的OfflineWebView中,而是将其作为一个静态类,您可以在基本Activity中注册,并让它保留对您的OfflineWebView的引用。调用onReceive后,您可以引用OfflineWebView来加载在线/离线内容。

file: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);
    }
}

file: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;
    }
}