2013-01-02 6 views
0

누구나 내가 다른 클래스/객체의 내부에 내 주요 활동의 중지시, onPause와 onResume 콜백을받을 수 있는지 알고 등록?안드로이드 : 다른 활동의 중지시

나는 다른 클래스 (웹보기)의 내부에 살고있는 방송 수신기를 가지고있다. 수신기를 사용하여 네트워크가 다운 된 때를 감지하고 유용한 콘텐트로 내 페이지의 로컬 복사본으로 전환합니다. onStop/onPause가 호출 될 때 브로드 캐스트 리시버의 등록을 해제하고 onResume 중에 다시 등록해야합니다. 나는 손으로이 작업을 수행 할 수 있습니다

는 (난 그냥 그렇게 웹보기를 확장하는 클래스에 몇 public 메소드를 추가)하지만 안드로이드 그냥 나를 위해 그것을 호출이 좋을 것입니다.

편집 : 물론, 여기에 클래스, 난 내 주요 활동의 중지시가 호출 될 때 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 

감사합니다.

+0

당신도이 순간에 쓴 코드를 게시하시기 바랍니다. –

+0

물론, 여기 수업이 있습니다 : –

답변

1

하는 대신 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; 
    } 
}