我一直面临着一些问题,试图通过意图和待处理的意图将数据传递给BroadcastReceiver,涉及接近警报。更具体地说,我试图传递一个对象,其中包括用户不断变化的位置。我已经尝试过在这里提出的各种策略(并且不仅仅是),但是当在BroadcastReceiver端检索intent时,导致无效值或者为首次创建的意图相同。使用的战术:
调用方法的代码(从任何试验中剥离/产生空值):
private void setProximityAlert(MyCar myCar) {
String locService = Context.LOCATION_SERVICE;
LocationManager locationManager;
locationManager = (LocationManager)getSystemService(locService);
float radius = myCar.getMyCarRadius();
long expiration = myCar.getMyCarExpiration();
myService.setMyDriverLat(userLat);//setting user's position
myService.setMyDriverLng(userLng);//setting user's position
Intent intent = new Intent(myCar.getMyCarName());
intent.putExtra("myCar",myCar);
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);
}
设置intent过滤器并注册BroadcastReceiver的调用方法的代码:
public void addNewCarPoint (MyCar myCar){
IntentFilter filter = new IntentFilter(myCar.getMyCarName());
registerReceiver(new ProximityAlertReceiver(), filter);
setProximityAlert(myCar);
}
BroadcastReceiver方面的代码:
public class ProximityAlertReceiver extends BroadcastReceiver {
@Override
public void onReceive (Context context, Intent intent) {
MyCar myCar=(MyCar)intent.getParcelableExtra("myCar");
driverLoc=(String)Double.toString(myCar.getMyDriverLat());
Toast.makeText(context, userLoc, Toast.LENGTH_SHORT).show();
Intent i = new Intent(context, MyCarDiscoveryPrompt.class);
context.startActivity(i);//firing intent
}
public void intentDataLoader(){
}
}
任何想法都会受到欢迎。 提前谢谢。
答案 0 :(得分:1)
嗯,我觉得我找到了一些东西:
我放置了BroadcastReceiver(ProximityAlerReceiver),用于检测LocationListener.class所在的同一类(MyCarTracking.class)中的邻近警报。这个, 提供对新的位置更新的即时访问,创建包含在要向BroadcastReceiver触发的新pendingIntent中的新意图(仅当满足接近标准时)。 标志:在intent和pendingIntent上分别保存FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP和FLAG_CANCEL_CURRENT。更具体地说:
LocationListener的代码:
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateWithNewLocation(location);//update application based on new location
}
public void onProviderDisabled(String provider){
updateWithNewLocation(null);//update application if provider disabled
}
public void onProviderEnabled(String provider){
// Update application if provider enabled
}
public void onStatusChanged(String provider, int status, Bundle extras){
//update application if provider hardware status changed
}
};
setProximityAlert()方法的代码:
private void setProximityAlert() {
String locService = Context.LOCATION_SERVICE;
Context context =getApplicationContext();
LocationManager locationManager;
locationManager = (LocationManager)getSystemService(locService);
float radius = myCar.getMyCarRadius();
long expiration = myCar.getMyCarExpiration();
Intent intent = new Intent(CAR_DISCOVERED);
intent.putExtra("myCar",myCar);
locationManager.getLastKnownLocation(provider);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//flagging intent
PendingIntent proximityIntent = PendingIntent.getBroadcast(context, -1, intent, PendingIntent.FLAG_CANCEL_CURRENT);//flagging pendingIntent
locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);//setting proximity alert
}
此解决方案可以生成具有全新位置更新的新鲜意图。 谢谢大家的帮助和兴趣:)
答案 1 :(得分:0)
尝试添加 intent.setData(URI); 其中uri是每个未决意图的一些唯一值
答案 2 :(得分:0)
我也一直在努力解决这个问题。我花了整整一夜才发现我遇到的一个奇怪的错误与这个问题有关。
以下是关于该主题的Google代码的良好讨论:http://groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921
我通过(ab)使用SetData中的uri和PendingEvent.GetWhatever中的(保留)请求代码解决了我的所有问题。
我也在我的意图上使用FLAG_CANCEL_CURRENT,并确保只有具有相同目的的待处理用户获得相同的数据,操作和uri。
希望它有所帮助。