我希望有一个Broadcast Receiver
来获取尚未启动的活动的位置信息。基本上我有一些我在一个活动中获得的位置。当我单击我的FAB按钮时,我想获取我在第一个活动中获得的位置,并将其发送到FAB按钮导航到的活动,以便我可以使用该活动中的位置。这是我的尝试:
LocationServices.java:这是我收到location
广播的地方。
@Override
public void onLocationChanged(Location location) {
if (location.hasAccuracy()) {
if (location.getAccuracy() < 30) {
locationUpdateListener.updateLocation(location);
Intent broadcastIntent = new Intent(LocationService.ACTION_LOCATION);
broadcastIntent.putExtra("latitude", location.getLatitude());
broadcastIntent.putExtra("longitude", location.getLongitude());
activity.sendBroadcast(broadcastIntent);
}
}
}
CreatePost.java:我想在这里理想地抓取广播的位置并在此文件中使用它,但永远不会调用onReceive
。当用户单击FAB按钮时,将实例化活动。
@Override
public void onResume() {
super.onResume();
locationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
if(location == null) {
location = new Location("Provider");
}
location.setLatitude(intent.getDoubleExtra("latitude", 0.0));
location.setLongitude(intent.getDoubleExtra("longitude", 0.0));
} catch (Exception e) {
e.printStackTrace();
}
}
};
registerReceiver(locationReceiver, new IntentFilter(LocationService.ACTION_LOCATION));
}
有没有办法在实例化活动时发送location
?或者我不理解Broadcast Receiver
正确的想法?
答案 0 :(得分:2)
只需将数据放入启动第二个活动的Intent中。然后在第二个活动中,通过调用getIntent()获取intent,并从中检索数据。像这样:
通过
传递位置详细信息private void startActivityWithData() {
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("latitude", location.getLatitude());
intent.putExtra("longitude", location.getLongitude());
startActivity(intent);
}
并通过
收到SecondActivity
上的位置详细信息
class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
float latitude = intent.getFloatExtra("latitude", 0);
float longitude = intent.getFloatExtra("longitude", 0);
}
}
答案 1 :(得分:0)
无需在onResume上调用注册接收器。您也可以这样使用。
如果您需要使用Receiver onResume,则需要取消注册onPause。
请检查您的位置是否正常工作。
public class YourActivity extends AppCompatActivity {
private Location newLocation;
private BroadcastReceiver coordinateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
newLocation.setLatitude(intent.getDoubleExtra("latitude", 0.0));
newLocation.setLongitude(intent.getDoubleExtra("longitude", 0.0));
} catch (Exception e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity);
registerReceiver(coordinateReceiver, new IntentFilter(LocationService.ACTION_LOCATION));
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
unregisterReceiver(coordinateReceiver);
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
我不确定我是否正确了解您的情况,因为我无法看到整个结构。
首先,您只能在正确注册接收器时收到广播意图。为此,您有两种选择:静态和动态方式。
您在onResume()
方法中正确执行了此操作。只要应用程序正在运行,它就会起作用,它会调用/注册接收器。
如果您想要更持久的解决方案,则应在 AndroidManifest.xml 中以静态方式注册。通过这样做,Android系统知道您的应用程序包含位置数据的广播接收器,并可以传递意图。因此,即使重启设备后,接收器仍在工作。唯一需要的是,你已经启动了包含广播接收器的应用程序至少一次。
这是您必须放入<application>
元素内的AndroidManifest.xml中的内容(当然,您必须相应地将com.your.example.ACTION_LOCATION
替换为您的字符串。)
<receiver android:name=".LocationBroadcastReceiver">
<intent-filter>
<action android:name="com.your.example.ACTION_LOCATION" />
</intent-filter>
</receiver>
由于您在清单中明确指定了LocationBroadcastReceiver
,因此您还必须创建相应的类:
public class LocationBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// your code when intent is received
}
}
如果您这样做,您不再需要在代码中注册接收器,也不必手动创建LocationBroadcastReceiver
实例。
有关详细信息,请参阅here。