从活动中访问应用程序广播接收器?

时间:2014-11-11 20:41:28

标签: java android broadcastreceiver

我在我的清单中设置了广播来监控连接活动:

<application
    ... 
    <receiver
        android:name="com.blah.appname.NetworkChangeReceiver"
        android:label="NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>
    ...
</application>

NetworkChangeReceiver内部是onHandle()方法。这主要是为了显示Toast消息,并进行一些日志记录,并在整个应用程序中运行。

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        // do stuff
    }

}

但是,我还需要根据连接丢失在个别活动中做特殊事情。

如何从活动中访问现有广播接收器的onReceive()方法?我不完全理解接收器如何从清单中绑定到应用程序的内部。

3 个答案:

答案 0 :(得分:1)

您可以在应用中创建广播接收器,以便在应用中访问它。清单中的广播接收器必须在10秒内返回,因此通常广播接收器的清单版本只会以意图开始,然后返回。

以下是向您的应用添加广播接收器的代码示例。

 BroadcastReciver yourReceiver;


 public void onStart() {
    super.onStart();
    setupGPS();
 }


private void setupGPS() {
    if (yourReceiver == null) {
        // INTENT FILTER FOR GPS MONITORING
        final IntentFilter theFilter = new IntentFilter();
        theFilter.addAction(ACTION_GPS);
        yourReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent != null) {
                    String s = intent.getAction();
                    if (s != null) {
                        if (s.equals(ACTION_GPS)) {
                            gpsCheck();
                        }
                    }
                }
            }
        };
        getActivity().registerReceiver(yourReceiver, theFilter);
    }
    gpsCheck();
}


private void gpsCheck() {
    if (view != null) {
        LinearLayout llTrackerEnableGPS = (LinearLayout) view
                .findViewById(R.id.llTrackerEnableGPS);
        if (llTrackerEnableGPS != null) {
            LocationManager locationManager = (LocationManager) fragmentActivity
                    .getSystemService(Context.LOCATION_SERVICE);
            boolean isGPSAvailable = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
            llTrackerEnableGPS.setVisibility(isGPSAvailable ? View.GONE
                    : View.VISIBLE);
        }
    }
}



@Override
public void onPause() {
    super.onPause();
    if (yourReceiver != null) {
        final FragmentActivity a = getActivity();
        if (a != null) {
            a.unregisterReceiver(yourReceiver);
        }
    }
    yourReceiver = null;
}

答案 1 :(得分:0)

所以你想根据你在BroadcastReceiver的onReceive收到的内容在你的活动中做些什么?这是我以前做过的事情:

您可以使用LocalBroadcast。见LocalBroadcast Manager。 关于如何实现,how to use LocalBroadcastManager?有一个很好的例子。

  

LocalBroadcast Manager是一个帮助程序,用于注册和发送Intent广播到进程中的本地对象。您正在播放的数据不会离开您的应用,因此无需担心泄露私人数据。

您的活动会注册此本地广播。从NetworkChangeReceiver LocalBroadcast发送onReceive Activity(说嘿,我收到了一条消息。显示它的活动)。然后在Service内,您可以收听广播。这样,如果活动位于最前面/处于活动状态,它将接收广播,否则不会。因此,每当您收到本地广播时,如果活动开放,您可以执行所需的操作。

如果您想为整个应用程序做,那么您可以使所有活动扩展为抽象活动。在这个抽象活动类中,你可以为这个'LocalBroadcast'注册它。其他方式是在您的所有活动中注册LocalBroadcast(但是您必须管理如何仅显示消息一次)。此广播对您的应用是私有的。所以它的安全性也是如此。

希望它有所帮助。同样的事情也可以在{{1}}内完成。这只是其中一种方法。

答案 2 :(得分:0)

您需要所谓的动态广播接收器。您不需要在清单文件中注册它,但在您的活动中。

NetworkChangeReceiver mReceiver = new NetworkChangeReceiver();

@Override
protected void onStart() {
    super.onStart();
    registerReceiver(mReceiver, new IntentFilter(android.net.conn.CONNECTIVITY_CHANGE));
}

@Override
protected void onStop() {
    unregisterReceiver(mReceiver);
    super.onStop();
}

现在,您可以将逻辑添加到onReceive()分析连接状态并调整逻辑。

或者,如果您想使用某些库,那么您可能希望查看开源TinyBus。它使这一切变得更加简单。在您的活动中,您需要添加此内容。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    // wire connectivity events
    TinyBus.from(this).wire(new ConnectivityEvents());

}

@Subscribe
public void onConnectivityEvent(ConnectionChangedEvent event) {
    if (event.isConnected()) {
        // connected
    } else {
        // disconnected
    }
}