我在我的清单中设置了广播来监控连接活动:
<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()方法?我不完全理解接收器如何从清单中绑定到应用程序的内部。
答案 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
}
}