2016-04-05 30 views
35

Trong Android N, nó được đề cập trên trang web chính thức rằng "Ứng dụng nhắm mục tiêu Android N không nhận được CONNECTIVITY_ACTION chương trình phát sóng". Và nó cũng được đề cập rằng JobScheduler có thể được sử dụng thay thế. Tuy nhiên, JobScheduler không cung cấp chính xác cùng một hành vi như phát sóng CONNECTIVITY_ACTION.ConnectivityManager.CONNECTIVITY_ACTION không được chấp nhận

Trong ứng dụng Android của tôi, tôi đã sử dụng chương trình phát này để biết trạng thái mạng của thiết bị. Tôi muốn biết nếu trạng thái này là CONNECTING hoặc CONNECTED với sự trợ giúp của phát sóng CONNECTIVITY_ACTION và nó phù hợp nhất với yêu cầu của tôi.

Bây giờ nó không còn được dùng nữa, bất kỳ ai có thể gợi ý cho tôi cách tiếp cận thay thế để có trạng thái mạng hiện tại không?

+9

Và những gì nếu một ngày nào đó OP muốn một số hành vi mà đòi hỏi phải nâng tỉ số 'targetSdkVersion' đến N hay muộn? – Michael

+0

Vâng, tôi cũng biết rằng nếu tôi không nhắm mục tiêu ứng dụng của mình tới Android N, tôi sẽ nhận được chương trình phát sóng. Nhưng ứng dụng của tôi cần hỗ trợ Android N. Tôi có thể nhận được cùng một hành vi phát sóng trong Android N như thế nào? Có cách tiếp cận nào khác mà tôi có thể thử không? @DavidWasser –

+0

Đôi khi tôi nghĩ điều đó có ý nghĩa hơn về tương lai trong tương lai. Đây hoàn toàn là một cách tiếp cận thực dụng để lập trình. Tất nhiên, bạn luôn có thể cố gắng đảm bảo rằng mã của bạn không sử dụng bất kỳ tính năng không được chấp nhận nào.Mặt khác, các tính năng không dùng nữa thường ở lại trong một thời gian dài và có thể ứng dụng của bạn sẽ hết hạn trước khi các tính năng không dùng nữa biến mất. Android N thật mới mẻ đến mức tôi sẽ không mất nhiều thời gian để lo lắng về nó. Chưa. Chỉ cần 2 xu của tôi. Xin lưu ý rằng tôi đã viết nhận xét cho câu hỏi và không đề xuất rằng "không làm điều đó" là câu trả lời hợp lệ. –

Trả lời

35

Điều gì sẽ không được chấp nhận là khả năng cho ứng dụng chạy nền nhận được thay đổi trạng thái kết nối mạng.

David Wasser cho biết bạn vẫn có thể nhận được thông báo về các thay đổi kết nối nếu thành phần ứng dụng được khởi tạo (không bị hủy) và bạn có registered your receiver programmatically với ngữ cảnh của nó thay vì thực hiện trong tệp kê khai.

Hoặc bạn có thể sử dụng NetworkCallback để thay thế. Cụ thể, bạn sẽ cần ghi đè onAvailable để thay đổi trạng thái được kết nối.

Hãy để tôi soạn thảo một đoạn một cách nhanh chóng:

public class ConnectionStateMonitor extends NetworkCallback { 

    final NetworkRequest networkRequest; 

    public ConnectionStateMonitor() { 
     networkRequest = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(); 
    } 

    public void enable(Context context) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     connectivityManager.registerNetworkCallback(networkRequest , this); 
    } 

    // Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too. 

    @Override 
    public void onAvailable(Network network) { 
     // Do what you need to do here 
    } 
} 
+1

Vì kỹ thuật này sẽ chỉ có thể làm việc, nếu ứng dụng đang chạy ở nền trước. Điều đó có nghĩa là, chúng tôi không còn có khả năng nghe sự kiện kết nối, khi ứng dụng không chạy ở nền trước? Có trong manifest.xml không còn bất kỳ hiệu ứng nào trong Android N. –

+1

@CheokYanCheng AFAIK đúng vậy. Bạn cần có một quy trình chạy ở nền trước để nghe các sự kiện kết nối. Dường như giả thiết đã được thực hiện bởi các kỹ sư khung Android là nghe các sự kiện kết nối chủ yếu được thực hiện để biết khi nào bắt đầu đồng bộ hóa dữ liệu giữa máy khách và máy chủ. Do đó, JobScheduler là cách được khuyến nghị cho trường hợp sử dụng đó. –

+7

NetworkCallback chỉ dành cho cấp API 21+ – GeneralKimi

12

Các tài liệu dành cho Android N khẳng định:

Apps nhắm mục tiêu Android N không nhận CONNECTIVITY_ACTION chương trình phát sóng, ngay cả khi họ có mục manifest để yêu cầu thông báo trong số các sự kiện này. Các ứng dụng chạy trên nền trước vẫn có thể nghe theo số CONNECTIVITY_CHANGE trên chuỗi chính của chúng nếu chúng yêu cầu thông báo bằng BroadcastReceiver.

Điều này có nghĩa là bạn vẫn có thể đăng ký BroadcastReceiver nếu ứng dụng của bạn đang chạy ở nền trước, để phát hiện các thay đổi trong kết nối mạng.

+0

Bắt thú vị tinh tế :) –

+0

điều này có nghĩa là ứng dụng sẽ ngừng nhận chương trình phát sóng khi ứng dụng không ở nền trước? (vì vậy tôi không thể nghe nó trong một dịch vụ chẳng hạn?) – sundie

+0

Tôi không biết chắc chắn, tôi sẽ cần phải kiểm tra nó để chắc chắn. Tuy nhiên, đọc tài liệu sẽ xuất hiện nếu ứng dụng của bạn không ở nền trước, sau đó bạn sẽ không nhận được chương trình phát sóng 'Intent'. –

5

Tôi chạy vào cùng một vấn đề vài ngày trở lại và tôi quyết định sử dụng thư viện này Android-Job

thư viện này sử dụng JobSchedular, GcmNetworkManagerBroadcastReceiver tùy thuộc vào phiên bản Android ứng dụng đang chạy trên.

Bắt đầu một công việc là khá dễ dàng

new JobRequest.Builder(DemoSyncJob.TAG) 
      .setRequiresCharging(true) 
      .setRequiresDeviceIdle(false) 
      .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) // this is what gets the job done 
      .build() 
      .schedule(); 
+1

tôi đã thử cùng một lịch trình và nhận ngoại lệ như thế này Bạn đang cố gắng xây dựng một công việc không có ràng buộc, điều này là không được phép. bạn có thể giúp chúng tôi giải quyết vấn đề này không ?? –

+0

Sử dụng Android-Job cho mục đích này thực sự không phải là một giải pháp tốt. Nó có nghĩa là để chạy những thứ tại một thời gian nhất định, một lần hoặc định kỳ. Nó có nghĩa là để mang lại hỗ trợ tương thích retro cho báo động và như vậy. Điều này đi ngược lại toàn bộ ý tưởng về lý do tại sao API thay đổi và đọc: https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html Bạn có thể nhanh chóng hiểu được với lý do tại sao. – pedronveloso

+0

chỉ có vấn đề là trong Android N nó chỉ có thể được lên kế hoạch cho tối thiểu là 15 phút trong tương lai –

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