これが人気のあるトピックであることは知っていますが、自分に合ったケースは見つかりませんでした。設計にモジュール性を持たせるために、ネットワーク状態の変化をリッスンし、アプリへの(今のところ接続性)ブロードキャストの汎用ゲートウェイとして機能する単一のブロードキャストレシーバーを作成しました。このクラスはConnectivityReceiverと呼ばれ、基本的には次のとおりです。
public class ConnectivityReceiver extends BroadcastReceiver {
private static final String TAG = "ConnectivityReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"onReceive called");
Log.d(TAG,"Intent.getAction() is "+intent.getAction());
if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){
Intent out = new Intent(MapFragment.ACTION_LOCAL_CONNECTIVITY_CHANGE);
Log.d(TAG,"Sending broadcast");
context.sendBroadcast(out);
}
}
}
マニフェストに登録しましたが、かなりうまく機能しています。次に、この種の接続の変更について知りたいフラグメントがあるので、次のような単純な内部BroadcastReceiverを作成しました。
public BroadcastReceiver connectivityReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"got connection info!");
}
};
これはマニフェストに登録されていませんが、フラグメントのonCreateメソッドとonDestroyメソッドでそれぞれ登録と登録解除を行うように十分注意しました。このようなもの:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate");
connectivityReceiver = new ConnectivityReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MapFragment.ACTION_LOCAL_CONNECTIVITY_CHANGE);
this.getActivity().registerReceiver(connectivityReceiver, intentFilter);
/* Creating a ParseHandler, this will be needed for the PathParser */
mParserHandler = new ParserHandler(getActivity());
}
と
@Override
public void onDestroy(){
Log.d(TAG,"onDestroy");
this.getActivity().unregisterReceiver(connectivityReceiver);
}
しかし、なんらかの理由で、チェーンの2番目のブロードキャストレシーバーがブロードキャストを取得していません。最初のもの(マニフェストに登録されているもの)がそれを取得しているので、それは発行されています。
何か案は?カスタムアクション名は次のようになります。
public static final String ACTION_LOCAL_CONNECTIVITY_CHANGE = "com.spiral.android.transito.CONNECTIVITY_CHANGE";