接收尚未开始的活动的广播?

时间:2016-09-21 03:02:20

标签: android android-intent broadcastreceiver android-broadcast

我希望有一个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正确的想法?

3 个答案:

答案 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