4

我一直在面临一些问题,试图通过意图和未决意图传递数据到BroadcastReceiver,关于接近警报。更具体地说,我试图传递一个对象,其中包括用户不断变化的位置。我尝试过在这里提出的各种策略(而不仅仅是),但都没有工作,导致无论是空值还是与第一次创建的意图相同,当意图在BroadcastReceiver一侧检索时。战术使用:PendingIntents保持缓存相同的对象

  • 检举与承载对象的意图:FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP 结果:在BroadacastReceiver侧Null值
  • 检举使用初始意图,使用创建的未决意图:FLAG_UPDATE_CURRENT或FLAG_CANCEL_CURRENT 结果:在BroadacastReceiver一侧的空值
  • 使用System.currentTimeMillis()获取意图或等待意图的随机ID; 结果:内容不会被解雇或收到
  • 上面没有描述。结果:每次都检索相同的初始值。

代码调用方法(来自任何性实验剥离/产生空值):

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); 
} 

代码,用于设置意图过滤并注册的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(){  
} 

}

任何想法都会更受欢迎。 预先感谢您。

回答

1

嗯,我想我已经找到的东西:

我把广播接收器(ProximityAlerReceiver),用于检测在同一类(MyCarTracking.class),其中LocationListener.class位于接近警报。这 提供了立即访问新的位置更新,创建一个新的intent包裹在一个新的pendingIntent被发射到BroadcastReceiver(只有满足接近标准时)。 flags:FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP和FLAG_CANCEL_CURRENT在intent和pendingIntent上分别保存。更具体地:

代码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 
} 

该溶液可与新鲜的位置更新生产新鲜意图。 谢谢大家的帮助和你的兴趣:)

0

尝试添加 intent.setData(uri); 其中uri是每个待定意图的一些独特的价值

+0

我也试过,但它似乎也落在上面描述的第三种策略,没有意图被解雇或收到:/ – nifo 2010-12-05 23:49:16

0

我一直在努力解决这个问题。我花了整整一晚才发现我有一个奇怪的错误与这个问题有关。

下面是对谷歌代码关于这个问题的很好的讨论:同时使用在SetData的URI和在PendingEvent.GetWhatever的(保留)请求代码http://groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921

我已经(AB),解决了我的所有问题。

我对我的意图也使用FLAG_CANCEL_CURRENT,并确保只有共享相同目的的求助者才能获得相同的数据,操作和uri。

希望它有一点帮助。

+0

这是一个有趣的讨论,我也读过,但它似乎在这里有其他错误,因为我已经尝试了一切......谢谢你的信息,虽然:) – nifo 2010-12-06 10:48:55

相关问题