为什么广播接收器永远不会被调用?
Why does Broadcast Receiver never get called?
在我的 MainActivity 中,我正在创建接收器并发送广播:
GPSStartedReceiver receiver = new GPSStartedReceiver();
this.registerReceiver(receiver, new IntentFilter("android.location.GPS_ENABLED_CHANGE"));
Intent intent = new Intent();
intent.setAction("com.test.broadcastReceiver.GPSStartedReceiver()");
sendBroadcast(intent);
但是当我启用我的 GPS 时,没有调用广播接收器。
下面是Manifest中接收者的部分:
<receiver android:name="com.test.broadcastReceiver.GPSStartedReceiver">
<intent-filter>
<action android:name="android.location.GPS_ENABLED_CHANGE" />
</intent-filter>
</receiver>
和广播接收器:
public class GPSStartedReceiver extends BroadcastReceiver {
// Start service 5 seconds after GPS is enabled
private static final long WAIT_TIME = 1000 * 5;
// Restart service every 30 seconds
private static final long REPEAT_TIME = 1000 * 30;
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals("android.location.GPS_ENABLED_CHANGE")) {
final Handler handler = new Handler();
Toast.makeText(context,
context.getResources().getString(R.string.starting_in_5),
Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, GPSTracker.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
// Start 30 seconds after boot completed
cal.add(Calendar.SECOND, 30);
// Fetch every 30 seconds
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), REPEAT_TIME, pending);
}
}, WAIT_TIME);
}
}
}
为什么即使我启用了我的 GPS,接收器也永远不会被调用?
您是否尝试注册 BroadcastReceiver 以收听 Intent Action PROVIDERS_CHANGED_ACTION
?如果这不起作用,您可以获取 locationManager 的实例,然后按如下方式向其注册 GpsStatusListener mLocationManager.addGpsStatusListener(new android.location.GpsStatus.Listener())
并使用其内部方法。
希望对您有所帮助
使用 PROVIDERS_CHANGED_ACTION 添加到 API 级别 9 当配置的位置提供商更改时广播意图操作。与 isProviderEnabled(String) 一起使用。如果您正在与 LOCATION_MODE API 互动,请改用 MODE_CHANGED_ACTION。
常数值:"android.location.PROVIDERS_CHANGED"
您可以在 this SO post
上找到您的解决方案
在我的 MainActivity 中,我正在创建接收器并发送广播:
GPSStartedReceiver receiver = new GPSStartedReceiver();
this.registerReceiver(receiver, new IntentFilter("android.location.GPS_ENABLED_CHANGE"));
Intent intent = new Intent();
intent.setAction("com.test.broadcastReceiver.GPSStartedReceiver()");
sendBroadcast(intent);
但是当我启用我的 GPS 时,没有调用广播接收器。
下面是Manifest中接收者的部分:
<receiver android:name="com.test.broadcastReceiver.GPSStartedReceiver">
<intent-filter>
<action android:name="android.location.GPS_ENABLED_CHANGE" />
</intent-filter>
</receiver>
和广播接收器:
public class GPSStartedReceiver extends BroadcastReceiver {
// Start service 5 seconds after GPS is enabled
private static final long WAIT_TIME = 1000 * 5;
// Restart service every 30 seconds
private static final long REPEAT_TIME = 1000 * 30;
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals("android.location.GPS_ENABLED_CHANGE")) {
final Handler handler = new Handler();
Toast.makeText(context,
context.getResources().getString(R.string.starting_in_5),
Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, GPSTracker.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
// Start 30 seconds after boot completed
cal.add(Calendar.SECOND, 30);
// Fetch every 30 seconds
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), REPEAT_TIME, pending);
}
}, WAIT_TIME);
}
}
}
为什么即使我启用了我的 GPS,接收器也永远不会被调用?
您是否尝试注册 BroadcastReceiver 以收听 Intent Action PROVIDERS_CHANGED_ACTION
?如果这不起作用,您可以获取 locationManager 的实例,然后按如下方式向其注册 GpsStatusListener mLocationManager.addGpsStatusListener(new android.location.GpsStatus.Listener())
并使用其内部方法。
希望对您有所帮助
使用 PROVIDERS_CHANGED_ACTION 添加到 API 级别 9 当配置的位置提供商更改时广播意图操作。与 isProviderEnabled(String) 一起使用。如果您正在与 LOCATION_MODE API 互动,请改用 MODE_CHANGED_ACTION。
常数值:"android.location.PROVIDERS_CHANGED"
您可以在 this SO post
上找到您的解决方案