愿君学长松,慎勿作桃李。这篇文章主要讲述CONNECTIVITY_CHANGE在Android N的目标中已弃用相关的知识,希望能为你提供帮助。
【CONNECTIVITY_CHANGE在Android N的目标中已弃用】我收到广播接收器的弃用声明的警告。
<
!-- NETWORK RECEIVER... -->
<
receiver android:name=".utils.NetworkUtils" >
<
intent-filter>
<
action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<
/intent-filter>
<
/receiver>
警告:
对于面向N及更高版本的应用,不推荐为android.net.conn.CONNECTIVITY_CHANGE声明广播接收器。通常,应用程序不应该依赖此广播,而应使用JobScheduler或GCMNetworkManager。没有弃用的方法有没有其他方法可以使用它?
答案我有同样的问题,我做了类似的事情。它对我有用,我希望它有所帮助。
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();
}
}
}
}
}
不要在清单中添加接收器,以便它只存在于此活动中。
另一答案谷歌的官方建议是切换到
JobScheduler
。由于此版本仅适用于21级及更高级别的API,因此旧设备无法使用。幸运的是,来自Evernote的人们创建了一个向后兼容版本:https://github.com/evernote/android-job
另一答案警告似乎包含您使用作业调度程序所需的线索。这里的意图是应用程序不会将关于他们想要在应用程序接收连接时要执行的操作的意图传达给系统。作业调度程序显然避免了这些问题,并允许Android批处理请求,推迟它们等等。
需要注意的是,您必须实现双向工作,因为作业调度程序仅在Android 5.0之后才可用。也许您可以使用将切换到作业调度程序的本机实现的库,another answer列出其中一个。
另一答案实际上,解决此问题的最简单方法是在主活动中注册接收器并删除Manifest文件中的
<
receiver/>
代码。在主要活动中注册:
IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(new YourConnectionReceiverClass(), intentFilter);
另一答案我们需要像这样处理连接管理器的新旧方法:
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);
}
推荐阅读
- 即使屏幕在Android中被锁定,也会启动活动屏幕
- Android - 启动时启动服务
- Android O中不会调用具有签名权限的Android隐式BroadcastReceiver
- android BroadcastReceiver有时会在onReceive上抛出NullPointerException
- Swift - 从AppDelegate向View Controller添加子视图
- 使用flask-jwt-extended回调与flask-restful和create_app
- 将Angular App发布为facebook Instant Article
- Apple ITunes AppStore客户评论rss端点无法正常工作
- 如何测试和修复电子邮件欺骗/缺少SPF记录漏洞()