CONNECTIVITY_CHANGE在Android N的目标中已弃用

时间:2016-11-11 09:56:14

标签: android broadcastreceiver deprecated intentfilter android-networking

我收到广播接收者弃用声明的警告。

<cfset qpxFields = {
  "request": {
    "passengers": {
      "adultCount": "1"
    },
    "slice": [
      {
        "origin": "SFO",
        "destination": "LAX",
        "date": "2014-09-19"
      }
    ],
    "solutions": "1"
  }
} />



<cfhttp url="https://www.googleapis.com/qpxExpress/v1/trips/search?key=YOUR_KEY" method="post" result="httpResp" timeout="60">
    <cfhttpparam type="header" name="Content-Type" value="application/json" />
    <cfhttpparam type="body" value="#serializeJSON(qpxFields)#">
</cfhttp>

<cfoutput>
#httpResp.FileContent#
</cfoutput>

警告:

  

为android.net.conn.CONNECTIVITY_CHANGE声明一个broadcastreceiver   已弃用针对N及更高版本的应用。通常,应用程序应该   不依赖于此广播,而是使用JobScheduler或   GCMNetworkManager。

有没有其他方法可以在没有弃用方法的情况下使用它?

6 个答案:

答案 0 :(得分:11)

我有同样的问题,我做了类似的事情。它对我有用,我希望它有所帮助。

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

不要在清单中添加接收器,以便它只存在于此活动中。

答案 1 :(得分:1)

Google的官方建议是切换到JobScheduler。由于此版本仅适用于21级及更高级别的API,因此旧版设备无法使用。

幸运的是,来自Evernote的人们创建了一个向后兼容版本:https://github.com/evernote/android-job

答案 2 :(得分:0)

警告似乎包含您使用作业调度程序所需的线索。这里的意图是应用程序不会将关于他们想要在应用程序接收连接时要执行的操作的意图传达给系统。作业调度程序显然避免了这些问题,并允许Android批处理请求,推迟它们等等。

需要注意的是,您必须实现双向工作,因为作业调度程序仅在Android 5.0之后才可用。也许您可以使用将切换到作业调度程序的本机实现的库,another answer列出其中一个。

答案 3 :(得分:0)

实际上,解决此问题的最简单且正确方法是在主活动中注册接收器并删除清单文件中的<receiver/>代码。

在主要活动中注册:

IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(new YourConnectionReceiverClass(), intentFilter);

答案 4 :(得分:0)

我们需要像这样处理新旧的连接管理器方法:

if (SDK_INT >= LOLLIPOP) {

        NetworkRequest.Builder builder = new NetworkRequest.Builder();
        builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        builder.addTransportType(NetworkCapabilities.TRANSPORT_VPN);

        ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                publishSubject.onNext(isOnline());
            }

            @Override
            public void onLost(Network network) {
                super.onLost(network);
                publishSubject.onNext(isOnline());
            }

        };
        connectivityManager.registerNetworkCallback(builder.build(), callback);

    } else {

        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                publishSubject.onNext(isOnline());
            }
        };
        application.registerReceiver(receiver, filter);

    }

答案 5 :(得分:0)

我创建了一个非常简单的解决方案,该解决方案可以处理到目前为止的所有OS版本。在此处查看详细答案-> https://stackoverflow.com/a/61082387/8240915

NetworkConnectionLiveData类将返回LiveData,因此我们可以轻松使用