activity 的接收广播尚未开始?

Receive broadcast for activity not started yet?

我想要一个Broadcast Receiver来获取尚未启动的activity的位置信息。基本上我在一个 activity 中获得了一些位置。当我单击我的 FAB 按钮时,我想获取我在第一个 activity 中获得的位置并将其发送到 FAB 按钮导航到的 activity 以便我可以使用该位置 activity。这是我的尝试:

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。 activity 在用户单击 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));
}

有什么方法可以在 activity 实例化时发送 location 过来吗?还是我没有正确理解 Broadcast Receiver 的概念?

不需要调用注册接收器onResume.You也可以这样使用

如果您需要使用 Receiver onResume,则需要注销 onPause。

请检查您的 locationchanged 是否正常工作。

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

}

只需将数据放入启动第二个 activity 的 Intent 中即可。然后在第二个 activity 中,通过调用 getIntent() 获取意图,并从中检索数据。像这样:

通过

传递位置详细信息
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);
    }
}

我不确定我是否正确理解了你的场景,因为我看不到整个结构。

首先,只有正确注册了receiver,才能接收到broadcast intent。为此,您有两个选择:staticdynamic 方式。

您在 onResume() 方法中正确地做到了这一点。只要应用程序是 运行,接收方 called/registered,这就应该有效。

如果你想要一个更永久的解决方案,你应该在你的 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,因此您也必须创建相应的 class:

public class LocationBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
               // your code when intent is received
        }
}

如果你这样做,你不再需要在你的代码中注册接收器,你也不必手动创建 LocationBroadcastReceiver 的实例。

有关这方面的更多详细信息,请参阅 here