web-dev-qa-db-ja.com

Android Nのターゲットで廃止されたCONNECTIVITY_CHANGE

Broadcast Receiverの非推奨宣言について警告が表示されます。

<!-- 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のbroadcastreceiverを宣言することは、N以上を対象とするアプリでは非推奨です。一般に、アプリはこのブロードキャストに依存せず、代わりにJobSchedulerまたはGCMNetworkManagerを使用する必要があります。

非推奨のメソッドなしで使用する他の方法はありますか?

15
Pratik Butani

私は同じ問題を抱えていました、私はそのようなことをしました。それは私のために働いた、私はそれが役立つことを願っています。

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

このアクティビティでのみ有効になるように、マニフェストにレシーバーを追加しないでください。

11
Tahir Ferli

実際、この問題を解決する最も簡単なrightの方法は、メインアクティビティでレシーバーを登録し、<receiver/>マニフェストファイルのコード。

メインアクティビティに登録:

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

Googleからの公式アドバイスは、JobSchedulerに切り替えることです。これは、APIレベル21以降でのみ使用できるため、古いデバイスでは使用できません。

幸いなことに、Evernoteの人々は、その下位互換バージョンを作成します。 https://github.com/evernote/Android-job

1
Dmitry Zaytsev

このような接続マネージャーの古いメソッドと新しいメソッドを処理する必要があります。

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

    }
0
Mr.Hosseini

警告には、ジョブスケジューラを使用する必要があるという手がかりが含まれているようです。ここでの目的は、アプリケーションが接続を受信したときに、アプリケーションが実行したいアクションに関する意図をシステムに伝えないことです。ジョブスケジューラは明らかにこれらの問題を回避し、Androidがリクエストをバッチ処理したり、延期したりできるようにします。

ジョブスケジューラはAndroid 5.0以降でのみ使用可能です。ジョブのネイティブ実装に切り替わるライブラリを使用できる可能性があります。スケジューラ、 別の回答 そのうちの1つがリストされています。

0
Malcolm