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を使用する必要があります。
非推奨のメソッドなしで使用する他の方法はありますか?
私は同じ問題を抱えていました、私はそのようなことをしました。それは私のために働いた、私はそれが役立つことを願っています。
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();
}
}
}
}
}
このアクティビティでのみ有効になるように、マニフェストにレシーバーを追加しないでください。
実際、この問題を解決する最も簡単なrightの方法は、メインアクティビティでレシーバーを登録し、<receiver/>
マニフェストファイルのコード。
メインアクティビティに登録:
IntentFilter intentFilter = new IntentFilter("Android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(new YourConnectionReceiverClass(), intentFilter);
Googleからの公式アドバイスは、JobScheduler
に切り替えることです。これは、APIレベル21以降でのみ使用できるため、古いデバイスでは使用できません。
幸いなことに、Evernoteの人々は、その下位互換バージョンを作成します。 https://github.com/evernote/Android-job
このような接続マネージャーの古いメソッドと新しいメソッドを処理する必要があります。
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 5.0以降でのみ使用可能です。ジョブのネイティブ実装に切り替わるライブラリを使用できる可能性があります。スケジューラ、 別の回答 そのうちの1つがリストされています。