Java 如何在调用意图时保持MainActivity运行?
我有一个代码,当我调用地图活动时,它会接收纬度和经度并显示在地图上,但当我在地图上时,Java 如何在调用意图时保持MainActivity运行?,java,android,google-maps,android-intent,google-maps-api-3,Java,Android,Google Maps,Android Intent,Google Maps Api 3,我有一个代码,当我调用地图活动时,它会接收纬度和经度并显示在地图上,但当我在地图上时,onLocationChange不会运行,因此它不会显示人只移动第一个心房时的位置,我如何更改它以使其不断发送心房 import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener;
onLocationChange
不会运行,因此它不会显示人只移动第一个心房时的位置,我如何更改它以使其不断发送心房
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.Intent;
import android.Manifest;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.model.LatLng;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, LocationListener, GpsStatus.Listener {
private LocationManager locManager; //Gerente de Localização
private LocationProvider locProvider; //Provedor de Localização
private static final int REQUEST_LOCATION = 2; //Utilizado nas requisições de localização
Intent map;
LatLng Local;
//Inicializado aqui para não dar crash caso o mapa seja chamado antes desses atributos serem inicializados.
double latitude = 0;
double longitude = 0;
//Pacote onde será armazenado o valor do LatLng.
Bundle args = new Bundle();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Instância dos buttons:
Button map = (Button)findViewById(R.id.button_map);
map.setOnClickListener(this);
Button gnss = (Button)findViewById(R.id.button_gnss);
gnss.setOnClickListener(this);
Button config = (Button)findViewById(R.id.button_config);
config.setOnClickListener(this);
Button credits = (Button)findViewById(R.id.button_credits);
credits.setOnClickListener(this);
//Fim Instância dos Buttons
//O Gerente recebe uma location
locManager = (LocationManager)getSystemService(LOCATION_SERVICE);
}
@Override
public void onClick(View view){
switch(view.getId()){
case R.id.button_map:
Local = new LatLng(latitude, longitude);
//Pacote inicializado com o LatLng
args.putParcelable("Latlng", Local);
//Criar tela relativa ao mapa
map = new Intent(this, MapsActivity.class);
//O pacote é passado para a Intent referente ao mapa
map.putExtra("bundle", args);
startActivity(map);
break;
case R.id.button_gnss:
/*Intent gnss = new Intent(this, GnssActivity.class);
startActivity(gnss);
*/
break;
case R.id.button_config:
Intent config = new Intent(this, SettingsActivity.class);
startActivity(config);
break;
case R.id.button_credits:
Intent credits = new Intent(this, CreditsActivity.class);
startActivity(credits);
break;
}
}
@Override
protected void onResume(){
super.onResume();
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
// A permissão foi dada
ativaGPS();
}
else {
// Solicite a permissão
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION);
}
}
@Override
protected void onPause() {
super.onPause();
desativaGPS();
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_LOCATION) {
if(grantResults.length == 1 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// O usuário acabou de dar a permissão
ativaGPS();
}
else {
// O usuário não deu a permissão solicitada
Toast.makeText(this, "Sua localização não será mostrada", Toast.LENGTH_SHORT).show();
finish();
}
}
}
//Ativa o GPS
public void ativaGPS() {
try {
locProvider = locManager.getProvider(LocationManager.GPS_PROVIDER);
locManager.requestLocationUpdates(locProvider.getName(), 30000, 1, this);
} catch (SecurityException e) {
e.printStackTrace();
}
}
//Desativa o GPS
public void desativaGPS() {
try {
locManager.removeUpdates(this);
} catch (SecurityException e) {
e.printStackTrace();
}
}
public void onGpsStatusChanged(int event) {
// Alguma mudança no sistema GPS
// A aplicação deverá chamar o método da classe LocationManager para obter informações sobre o status do distema GPS.
TextView coords=(TextView)findViewById(R.id.text_view_coords);
String satInfo="PRN;Azimute;Elevação;SNR;Used in Fix\n";
try {
GpsStatus gpsStatus=locManager.getGpsStatus(null);
} catch (SecurityException e) {
e.printStackTrace();
}
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
GpsStatus gpsStatus = locManager.getGpsStatus(null);
Iterable<GpsSatellite> sats=gpsStatus.getSatellites();
for (GpsSatellite sat:sats) {
// processe as informações de cada satélite
}
}
// Informações do sistema estão encapsuladas no objeto gpsStatus
// Alguma mudança no sistema GPS
// Informações do sistema estão encapsuladas no objeto gpsStatus
}
//Métodos criados automaticamente na implementação do Location Listener !
@Override
public void onLocationChanged(Location location) {
TextView coords=(TextView)findViewById(R.id.text_view_coords);
latitude=location.getLatitude();
longitude=location.getLongitude();
//Cordenadas em DD
coords.setText("Latitude"+latitude +"\n"+"Longitude:"+longitude);
/*coords.setText("Latitude:"+Location.convert(latitude,Location.FORMAT_SECONDS)
+"\n" +
"Longitude:"+Location.convert(longitude,Location.FORMAT_SECONDS)); */
//Passar o Bundle referente ao LatLng criado anteriormente.
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
// FIM dos Métodos criados automaticamente na implementação do Location Listener !
}
是的,您可以同时运行两个活动,甚至更多。您所要做的就是在后台运行它们,您可以使用服务在 虽然不是同时进行,但您也可以让活动与服务一起收听,您可以尝试启动结果意图并在中接收结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { /** you receive the result here**/}
由于大多数语音搜索应用程序、条形码扫描器和地图都使用此方法,因此在“活动结果”中接收意图是有效的。您是否想过将“地图活动”作为一个片段来实施,以覆盖您的主要活动,并可按需显示 然后,您可以在MapActivity中实现一个方法,从onLocationChanged()调用该方法,并使所有必要的内容显示片段上的当前位置 看看 在MapActivity中,您可以声明如下内容
public void locationChanged(double latitude, double longtitude){
this.latitude = latitude;
this.longtitude = longtitude
//All necessary code you need to update the location shown on the map
}
在您声明的主要活动中
public class MapFragment extends AppCompatActivity implements View.OnClickListener, LocationListener, GpsStatus.Listener {
private MapFragment mapFragment;
...
}
在onCreate()方法中,设置片段的视图
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
}
完成所有这些操作后,可以在onLocationChanged()方法中调用在MapFragment中声明的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
}
@Override
public void onLocationChanged(Location location) {
TextView coords=(TextView)findViewById(R.id.text_view_coords);
mapFragment.locationChanged(location.getLatitude(), location.getLongitude();
//Rest of your code as necessary
}