android中的putExtra()和getBooleanExtra()

时间:2016-04-05 15:10:25

标签: java android android-intent

我正在开发一个实现mapsView的应用程序。我有两个活动导致mapsView活动。 activity_A将导致mapsView活动,而mapsView活动将导致activity_B。我在我的代码中实施了putExtra()getBooleanExtra()

这是我在activity_A

中的代码
case R.id.buttonMaps:
    Intent i = new Intent(MainActivity.this, MapsActivity.class);
    i.putExtra("maps", false);
    startActivity(i);
break;

这是我在activity_B中的代码

buttonNavigasi.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(DetailActivity.this,MapsActivity.class);
        i.putExtra("nama", daftarNama);
        i.putExtra("deskripsi", daftarDeskripsi);
        i.putExtra("foto", daftarFoto);
        i.putExtra("marker", daftarMarker);
        i.putExtra("lat", daftarLat);
        i.putExtra("lng", daftarLng);
        i.putExtra("maps", true);
        startActivity(i);
     }
});

这是我在mapsView活动中的代码

case R.id.action_refresh:
     removeAllMarkers();
     if(i.getBooleanExtra("maps", true)) {
         mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng"))));
         UI_HANDLER.postDelayed(UI_UPDATE_RUNNABLE, 500);
     }
     else {
         registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
     }
     getCurrentLocation();
     return true;

问题是当mapsView转到activity_B并且在activity_B中我按下后退按钮(返回到mapsView活动)然后我按下了mapsView中的刷新图标,mapsView将转到此代码

if(i.getBooleanExtra("maps", true)) {
     mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng"))));
     UI_HANDLER.postDelayed(UI_UPDATE_RUNNABLE, 500);
}

为什么它没有转到mapsView活动中的else语句?我没有在activity_B中按buttonNavigasi,但我只需按后退按钮。我的代码出了什么问题?

任何答案都将不胜感激。

提前致谢。

4 个答案:

答案 0 :(得分:1)

因为当你没有指定他默认获得的任何值时,i.getBooleanExtra("maps", true)尝试使用i.getBooleanExtra("maps", false)

case R.id.action_refresh:
     removeAllMarkers();
     if(i.getBooleanExtra("maps", false)) {
         mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng"))));
         UI_HANDLER.postDelayed(UI_UPDATE_RUNNABLE, 500);
     }
     else {
         registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
     }
     getCurrentLocation();
     return true;

修改

按下按钮后的活动生命周期可能MapsActivity中的此解决方案可能对您更有用:

Intent i;
boolean refresh=false;
//YOUR CODE
 @Override
    protected void onCreate(Bundle savedInstanceState) {
    //YOUR CODE
    i = getIntent();
    //YOUR CODE
    }

    @Override
    protected void onResume() {
    //YOUR CODE
        if(i!=null){
                refresh = i.getBooleanExtra("maps", false);
        }
    //YOUR CODE 
    }

    @Override
    protected void onPause() {
        //YOUR CODE
        i=null;
       //YOUR CODE 
    }
    //YOUR CODE
    case R.id.action_refresh:
     removeAllMarkers();
     if(refresh) {
         mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng"))));
         UI_HANDLER.postDelayed(UI_UPDATE_RUNNABLE, 500);
     }
     else {
         registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
     }
     getCurrentLocation();
     return true;
     //YOUR CODE

希望帮助

答案 1 :(得分:1)

if(i.getBooleanExtra("maps", true)) {

在这里,你告诉它获得maps,如果它不存在,它就是真的。

如果您将其设置为false,您将得到正确的答案。

答案 2 :(得分:1)

当您按后退按钮时,您之前的活动才会恢复

private boolean registerRecr=false;

@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();

    registerRecr=true;


}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

}

 case R.id.action_refresh:
 removeAllMarkers();
 if(i.getBooleanExtra("maps", true)&& registerRecr==false) {
     mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng"))));
     UI_HANDLER.postDelayed(UI_UPDATE_RUNNABLE, 500);
 }
 else {
     registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
 }
 getCurrentLocation();
 return true;

答案 3 :(得分:0)

你可以覆盖你自己的onBackPressed

@Override
public void onBackPressed() {

}

强制用户浏览您的按钮或通过onBackPressed传递您想要的布尔值

或者你可以在使用finish()之后简单地startActivity()每个活动,这样你就不会在同一时间内使用太多的内存来避免那些只能通过意图启动地图的循环< / p>