2017-05-05 4 views
-1

시나리오가 있습니다. 내 응용 프로그램이 오프라인 일 때, 서버에 보내야하는 데이터베이스의 일부 정보를 저장 중입니다. 그래서 네트워크를 사용할 수있을 때 나는 API 호출에 의해 그것들을 보내고 싶다. 네트워크를 사용할 수있을 때마다 메소드를 호출 할 수있는 방법이 있습니까 ??Android에서 네트워크를 사용할 수있을 때마다 메소드를 호출하는 방법은 무엇입니까?

+0

사용 방송 수신기 –

+0

public class InternetBroadcastReceiver extends BroadcastReceiver { static final String TAG = "InternetReceiver"; private static int networkType = -1; private static boolean connectedWithNetwork = false; public static void initNetworkStatus(Context context) { ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); networkType = -1; if (networkInfo != null) { Log.d(TAG, "Init: ACTIVE NetworkInfo: " + networkInfo.toString()); if (networkInfo.isConnected()) { networkType = networkInfo.getType(); } } Log.d(TAG, "initNetworkStatus -> " + networkType); } @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive " + intent.getAction()); try { if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { Log.d(TAG, "System shutdown, stopping yaxim."); } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); boolean isConnected = (networkInfo != null) && (networkInfo.isConnected() == true); boolean wasConnected = (networkType != -1); if (connectedWithNetwork && isConnected) return; connectedWithNetwork = isConnected; if (wasConnected && !isConnected) { Log.d(TAG, "we got disconnected"); networkType = -1; } else if (isConnected && (networkInfo.getType() != networkType)) { Log.d(TAG, "we got (re)connected: " + networkInfo.toString()); networkType = networkInfo.getType(); try { Intent bIntent = new Intent("custom-event-name"); bIntent.putExtra("subject", Utils.SUBJECT_INTERNET_CONNECTED); LocalBroadcastManager.getInstance(context).sendBroadcast(bIntent); } catch (Exception e) { e.printStackTrace(); } } else if (isConnected && (networkInfo.getType() == networkType)) { Log.d(TAG, "we stay connected, sending a ping"); try { Intent bIntent = new Intent("custom-event-name"); bIntent.putExtra("subject", Utils.SUBJECT_INTERNET_CONNECTED); LocalBroadcastManager.getInstance(context).sendBroadcast(bIntent); } catch (Exception e) { e.printStackTrace(); } } else return; } } catch (Exception e) { e.printStackTrace(); } } } 

및 매니페스트 파일에 등록 당신은 당신이 안드로이드 N 미리보기를 대상으로하는 경우 방송 수신기 –

+1

을 사용해야합니다. 리시버는 Google에서 제한적으로 제한적으로 작동하지 않습니다. 링크 : https://developer.android.com/preview/features/background-optimization.html#connectivity-action – crashOveride

답변

0

브로드 캐스트 리시버를 만듭니다

<receiver android:name=".packagename.InternetBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.ACTION_SHUTDOWN" /> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
     </intent-filter> 
    </receiver> 
0
/// BROADCAST RECEIVER CLASS 

    public class UpdateReceiver extends BroadcastReceiver 
    { 



     @Override 
     public void onReceive(Context context, Intent arg1) 
    { 

      boolean isConnected = arg1.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 
      if (isConnected) { 

      } else { 

       //FETCH YOUR DATA FROM SQLITE 

       //CALL API 

      } 
     } 
    } 



/// ANDROID MANIFEST CODE 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <receiver android:name="com.example.welcome.nkew.UiUtils.UpdateReceiver"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 
+0

답장을 보내 주셔서 감사합니다. 그것은 나를 많이 도왔다. –