CONNECTIVITY_CHANGE устарел в целях Android N
Я получаю предупреждение об устаревшем объявлении широковещательного приемника.
<!-- 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 устарел для приложений с таргетингом N и выше. В общем, приложения должны не полагайтесь на эту трансляцию и вместо этого используйте JobScheduler или GCMNetworkManager.
Есть ли другой способ использовать его без устаревших методов?
Ответы
Ответ 1
У меня была такая же проблема, я сделал что-то подобное. Это сработало для меня, я надеюсь, что это поможет.
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();
}
}
}
}
}
Не добавляйте приемник в манифест, чтобы он работал только в этом действии.
Ответ 2
Официальным советом Google является переход на JobScheduler
. Так как этот доступ доступен только с уровня API 21 и выше, это не работает для старых устройств.
К счастью, люди Evernote создают версию обратной совместимости: https://github.com/evernote/android-job
Ответ 3
Предупреждение, похоже, содержит ключ, который нужно использовать планировщику заданий. Цель здесь заключается в том, что приложения не сообщают о намерениях системы относительно действий, которые они хотят делать, когда приложение получает подключение. Планировщик заданий явно избегает этих проблем и позволяет Android выполнять пакетные запросы, откладывать их и т.д.
Предостережение заключается в том, что вам придется выполнять работу в обоих направлениях, поскольку планировщик заданий доступен только с Android 5.0. Возможно, вы можете использовать библиотеки, которые будут переключаться на собственную реализацию планировщика заданий, другой ответ, который перечисляет один из них.
Ответ 4
На самом деле, самый простой и правильный способ решить эту проблему - просто зарегистрировать получателя в своей основной деятельности и удалить код <receiver/>
в файле манифеста.
Зарегистрироваться в основной деятельности:
IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(new YourConnectionReceiverClass(), intentFilter);
Ответ 5
нам нужно обработать старые и новые методы менеджера соединений, как это:
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);
}