7

Tôi nhận được cảnh báo về tuyên bố không được chấp nhận của Broadcast Receiver.CONNECTIVITY_CHANGE không được chấp nhận trong mục tiêu của Android N

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

CẢNH BÁO:

Khai báo một broadcastreceiver cho android.net.conn.CONNECTIVITY_CHANGE không được dùng cho các ứng dụng nhắm mục tiêu N và cao hơn. Nói chung, các ứng dụng nên không dựa vào chương trình phát sóng này và thay vào đó hãy sử dụng JobScheduler hoặc GCMNetworkManager.

Có cách nào khác để sử dụng nó mà không có phương pháp không được chấp nhận không?

Trả lời

1

Lời khuyên chính thức từ Google là chuyển sang JobScheduler. Vì tính năng này chỉ khả dụng từ cấp API 21 trở lên nên không cần thiết cho các thiết bị cũ hơn.

May mắn, folks từ Evernote tạo ra một phiên bản tương thích ngược của rằng: https://github.com/evernote/android-job

0

Cảnh báo dường như chứa manh mối mà bạn cần phải sử dụng lập lịch công việc. Mục đích ở đây là các ứng dụng không truyền đạt ý định tới hệ thống liên quan đến các hành động mà chúng muốn thực hiện khi ứng dụng nhận được kết nối. Trình lên lịch công việc rõ ràng tránh được những vấn đề này và cho phép Android thực hiện các yêu cầu, trì hoãn chúng, v.v.

Thông báo trước là bạn sẽ phải triển khai thực hiện công việc theo cả hai cách vì trình lên lịch công việc chỉ khả dụng kể từ Android 5.0. Có lẽ bạn có thể sử dụng các thư viện sẽ chuyển sang việc triển khai thực hiện gốc của công cụ lên lịch biểu, another answer liệt kê một trong số chúng.

7

Tôi đã có cùng một vấn đề, tôi đã làm một cái gì đó như thế. Nó làm việc cho tôi, tôi hy vọng nó sẽ giúp.

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(); 
       } 
      } 
     } 
    } 
} 

Không thêm người nhận vào tệp kê khai để chỉ hiển thị trong hoạt động này.

+2

Cảm ơn. 'chuỗi tĩnh cuối cùng CONNECTIVITY_ACTION' đã tồn tại trong lớp' android.net.ConnectivityManager'. Trong 'onCreate()' bạn cũng không thể viết 'if (checkForInternet()) {loadData(); ... ', bởi vì nó sẽ được gọi ngay từ BroadcastReceiver. – CoolMind

+0

Cảm ơn sự đóng góp. –

+0

sẽ hoạt động khi ứng dụng bị đóng không? – Priya

Các vấn đề liên quan