Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义广播接收器不工作_Android_Broadcastreceiver - Fatal编程技术网

Android 自定义广播接收器不工作

Android 自定义广播接收器不工作,android,broadcastreceiver,Android,Broadcastreceiver,我知道这是一个热门话题,但我找不到一个适合我的案例。为了在我的设计中获得一些模块化,我创建了一个单一的广播接收器,它可以监听任何网络状态的变化,并充当连接now广播到我的应用程序的通用网关。该类称为ConnectivityReceiver,基本上是这样的: public class ConnectivityReceiver extends BroadcastReceiver { private static final String TAG = "ConnectivityReceiver

我知道这是一个热门话题,但我找不到一个适合我的案例。为了在我的设计中获得一些模块化,我创建了一个单一的广播接收器,它可以监听任何网络状态的变化,并充当连接now广播到我的应用程序的通用网关。该类称为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!");
        }
};
@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());
}
public static final String ACTION_LOCAL_CONNECTIVITY_CHANGE = "com.spiral.android.transito.CONNECTIVITY_CHANGE";
class LocalBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"got connection info!");
    }
};
这一个并没有在清单中注册,但我非常小心地分别在片段的onCreate和onDestroy方法中注册和注销了它。大概是这样的:

public BroadcastReceiver connectivityReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG,"got connection info!");
        }
};
@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());
}
public static final String ACTION_LOCAL_CONNECTIVITY_CHANGE = "com.spiral.android.transito.CONNECTIVITY_CHANGE";
class LocalBroadcastReceiver extends BroadcastReceiver{

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

但是由于某种未知的原因,链中的第二个广播接收器无法接收广播!它正在被发布,因为在清单中注册的第一个正在获得它

有什么想法吗?自定义操作名称如下所示:

public BroadcastReceiver connectivityReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG,"got connection info!");
        }
};
@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());
}
public static final String ACTION_LOCAL_CONNECTIVITY_CHANGE = "com.spiral.android.transito.CONNECTIVITY_CHANGE";
class LocalBroadcastReceiver extends BroadcastReceiver{

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

好的,我通过创建一个扩展BroadcastReceiver的非匿名内部类来解决这个问题。但我不知道为什么另一种方法不起作用。修改的代码基本上是第二个框,现在看起来如下:

public BroadcastReceiver connectivityReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG,"got connection info!");
        }
};
@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());
}
public static final String ACTION_LOCAL_CONNECTIVITY_CHANGE = "com.spiral.android.transito.CONNECTIVITY_CHANGE";
class LocalBroadcastReceiver extends 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);
    // 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());
}
工作