7

방송 수신 거부 신고가 경고됩니다. CONNECTIVITY_CHANGE이 (가) Android N 대상에서 사용되지 않음

<!-- NETWORK RECEIVER... --> 
<receiver android:name=".utils.NetworkUtils" > 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

경고

: android.net.conn.CONNECTIVITY_CHANGE 위한 브로드 캐스트 리시버를 선언

는 N 이상을 대상으로 애플리케이션을 위해 사용되지 않습니다. 일반적으로 앱은 이이 브로드 캐스트에 의존하지 않고 대신 JobScheduler 또는 GCMNetworkManager를 사용해야합니다.

더 이상 사용되지 않는 방법없이 다른 방법을 사용하고 있습니까?

답변

1

Google의 공식적인 조언은 JobScheduler으로 전환하는 것입니다. 이 API는 API 레벨이 21 이상에서만 사용할 수 있으므로 이전 기기에는 사용할 수 없습니다.

다행히, 에버 노트에서 사람들은 그의 이전 버전과의 호환성 버전을 만들 : https://github.com/evernote/android-job

0

경고는 사용자가 작업 스케줄러를 사용하는 데 필요한 단서를 포함 할 것으로 보인다. 여기서 의도는 응용 프로그램이 연결을 수신 할 때 수행하려는 작업과 관련하여 응용 프로그램이 시스템에 의도를 전달하지 않는다는 것입니다. 작업 스케줄러는 분명히 이러한 문제를 피하고 안드로이드가 요청을 일괄 처리하고 지연시키는 등의 작업을 할 수 있습니다.

작업 스케줄러는 Android 5.0에서만 사용 가능하므로 두 가지 방법으로 구현해야합니다. 어쩌면 작업 스케줄러의 기본 구현 인 another answer 중 하나가 나열된 라이브러리로 전환 할 수 있습니다.

7

나는 같은 문제가 있었는데, 나는 그렇게했다. 그것은 나를 위해 일했고, 나는 그것이 도움이되기를 바랍니다.

public class NewActivity extends AppCompatActivity { 
    final static String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; 
    IntentFilter intentFilter; 
    MyReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_new); 

     intentFilter = new IntentFilter(); 
     intentFilter.addAction(CONNECTIVITY_ACTION); 
     receiver = new MyReceiver(); 

     if(checkForInternet()){ 
      loadData(); 
     }else{ 
      updateUI(); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerReceiver(receiver, intentFilter); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(receiver); 
    } 

    // Self explanatory method 
    public boolean checkForInternet() { 
     ConnectivityManager cm = 
       (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     return activeNetwork != null && 
       activeNetwork.isConnectedOrConnecting(); 
    } 

    void loadData(){ 
     // do sth 
    } 

    void updateUI(){ 
     // No internet connection, update the ui and warn the user 
    } 


    private class MyReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String actionOfIntent = intent.getAction(); 
      boolean isConnected = checkForInternet(); 
      if(actionOfIntent.equals(CONNECTIVITY_ACTION)){ 
       if(isConnected){ 
        loadData(); 
       }else{ 
        updateUI(); 
       } 
      } 
     } 
    } 
} 

리시버를 매니페스트에 추가하면이 액티비티에만 저장됩니다.

+2

감사합니다. 'final static String CONNECTIVITY_ACTION'은 이미'android.net.ConnectivityManager' 클래스에 존재합니다. 'onCreate()'에서'if (checkForInternet()) {loadData(); ... ', 그것은 BroadcastReceiver에서 즉시 호출되기 때문입니다. – CoolMind

+0

기여해 주셔서 감사합니다. –

+0

앱이 강제 종료 될 때이 기능이 작동합니까? – Priya