CONNECTIVITY_CHANGE在Android N的目标中已弃用

Pra*_*ani 16 android deprecated intentfilter broadcastreceiver android-networking

我收到广播接收器的弃用声明的警告.

<!-- NETWORK RECEIVER... -->
<receiver android:name=".utils.NetworkUtils" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

警告:

对于面向N及更高版本的应用,不推荐为android.net.conn.CONNECTIVITY_CHANGE声明广播接收器.通常,应用程序不应该依赖此广播,而应使用JobScheduler或GCMNetworkManager.

没有弃用的方法有没有其他方法可以使用它?

Tah*_*rli 12

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

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();
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.`final.net String CONNECTIVITY_ACTION`已存在于`android.net.ConnectivityManager`类中.在`onCreate()`中你也不能写`if(checkForInternet()){loadData(); ...`,因为它会立即从BroadcastReceiver调用. (2认同)

Dmi*_*sev 1

Google 的官方建议是切换到JobScheduler. 由于此功能仅适用于 API 级别 21 及更高版本,因此对于较旧的设备来说这是不行的。

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