0

これが人気のあるトピックであることは知っていますが、自分に合ったケースは見つかりませんでした。設計にモジュール性を持たせるために、ネットワーク状態の変化をリッスンし、アプリへの(今のところ接続性)ブロードキャストの汎用ゲートウェイとして機能する単一のブロードキャストレシーバーを作成しました。このクラスは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";
4

2 に答える 2

0

わかりました、BroadcastReceiver を拡張する非匿名の内部クラスを作成するだけで、これを回避できました。ただし、他の方法が機能しなかった理由はわかりません。変更されたコードは基本的に 2 番目のボックスで、現在は次のようになっています。

class LocalBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"got connection info!");
    }
};

前と同じように、Fragment のスコープでこの内部クラスのグローバル インスタンスを作成し、前と同じように onCreate に登録し、onDestroy で登録解除します。

于 2012-04-14T20:35:35.300 に答える
0

だろう:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // connectivityReceiver = new ConnectivityReceiver(); // why did you do this?
    Log.d(TAG,"onCreate");
    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());
}

仕事 ?

于 2013-04-27T16:07:21.047 に答える