我正在开发一个 Android 应用程序,并在其中一个活动中使用 MapsActivity 来显示地图。我所看到的是,在 2.2 (API8) 模拟器上加载地图需要一些时间,我有时间按下菜单按钮然后返回应用程序,它仍在 setContentView() 上加载,问题当它进入将被调用两次的 onResume() 时就会出现。
根据 Android Activity 的生命周期,在应用程序再次进入前台时会调用 onPause()->[onRestart()-->onStart()]-->onResume() 和 onResume()在启动时在 onCreate()->[onStart()] 之后调用。
但是,如果它仍在 onCreate() 中的 setContentView 上加载,为什么不调用一次?
这是我感兴趣的事情,因为我不想每次使用映射时都使用布尔值,因为我认为它可以执行两次以避免出现问题,即计数器的双倍递增。
我不知道这是否是模拟器的问题,因为我看到的关于横向纵向方向的问题http://code.google.com/p/android/issues/detail?id=2423。
请看一下:
public class LocationActivity extends MapActivity {
private static final String TAG = "LocationActivity";
private static int i;
protected void onCreate(Bundle savedInstanceState) {
i = 0;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
}
protected void onResume(){
super.onResume();
i++;
Log.w(TAG,String.valueOf(i));
showDialogSettings();
}
private void showDialogSettings() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
String title = "I-Value:" + String.valueOf(i);
String positiveButton = "OK";
final Intent intent = new Intent(Settings.ACTION_SETTINGS);
dialog.setTitle(title);
dialog.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent settingsIntent = intent;
startActivity(settingsIntent);
}
});
dialog.show();
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
活动位置.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.google.android.maps.MapView
android:id="@+id/locationactivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:apiKey="XXXXXXXXXXXXXXX"
android:clickable="false"
android:enabled="true" />
</LinearLayout>
您可以重新创建问题:
- 如果您在 setContentView 处设置断点,则在 super.OnResume() 处设置另一个断点。
- 执行和当调试视图。
- 将应用程序发送到后台并再次重新运行。
- 完成执行,您应该会看到一个显示值的对话框:2。
阅读 Geobits 和 G. Blake Meike 的评论,这部分只是为了澄清我是否错了。
由于地图的异步加载,地图的示例可能很糟糕。我将 MapsActivity 更改为 Activity,假设手机超载,因此 onCreate 将执行 8 秒的循环(对于 Android 无响应时间来说还不够)。
这里是使用轻量级 android 布局的新代码:
public class LocationActivity extends Activity {
private static final String TAG = "LocationActivity";
private static int i;
protected void onCreate(Bundle savedInstanceState) {
i = 0;
Log.w(TAG,"onCreate");
super.onCreate(savedInstanceState);
setContentView(android.R.layout.simple_spinner_item);
Log.w(TAG,"beforeLoop");
try {
for(int j = 0; j < 8; j++){
Log.w(TAG,"Sleeping...");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
}
Log.w(TAG,"afterLoop");
}
protected void onResume(){
super.onResume();
Log.w(TAG,"onResume" + String.valueOf(i));
i++;
Log.w(TAG,"check Mobile Connectivity");
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE && networkInfo.isAvailable()){
Toast.makeText(this, "Network available!", Toast.LENGTH_LONG).show();
Log.w(TAG,"showingToast");
}
}
protected void onPause(){
super.onPause();
Log.w(TAG,"onPause:" + String.valueOf(i));
}
protected void onStop(){
super.onResume();
Log.w(TAG,"onStop:" + String.valueOf(i));
}
}
如果我在日志仍在打印“Sleeping...”时最小化应用程序并快速重新运行应用程序我可以看到“Sleeping...”,onResume 将检查两次连接(这是正确的方法检查网络连接)。
这里是 logCat:
- 2-28 20:02:48.643: W/LocationActivity(651): onCreate
- 2-28 20:02:48.646: W/LocationActivity(651): beforeLoop
- 02-28 20:02:48.646: W/LocationActivity(651): 睡觉...
- 02-28 20:02:49.655: W/LocationActivity(651): 睡觉...
- 02-28 20:02:50.678: W/LocationActivity(651): 睡觉...
- 02-28 20:02:51.673: W/LocationActivity(651): 睡觉...
- 02-28 20:02:52.674: W/LocationActivity(651): 睡觉...
- 02-28 20:02:53.738: W/LocationActivity(651): 睡觉...
- 02-28 20:02:54.773: W/LocationActivity(651): 睡觉...
- 02-28 20:02:55.795: W/LocationActivity(651): 睡觉...
- 02-28 20:02:56.816: W/LocationActivity(651): afterLoop
- 02-28 20:02:56.824: W/LocationActivity(651): onResume0
- 02-28 20:02:56.824: W/LocationActivity(651): 检查移动连接
- 02-28 20:02:57.134:W/LocationActivity(651):showingToast
- 02-28 20:02:57.234: W/LocationActivity(651): onPause:1
- 02-28 20:02:57.253: W/LocationActivity(651): onStop:1
- 02-28 20:02:57.264: W/LocationActivity(651): onResume1
- 02-28 20:02:57.264: W/LocationActivity(651): 检查移动连接
- 02-28 20:02:57.324:W/LocationActivity(651):showingToast
Toast 将显示两次消息。
查看 logCat 生命周期是正确的,但我只想考虑到有时 onCreate 可能会因为系统过载而延迟,如果 onResume 执行两次,那么我必须处理一些初始化,所以我必须使用布尔值我认为我不应该使用它,因为 onCreate 仍在运行。
如果不是 Toast 而是对话,则从用户的 POV 来看,不欢迎两个对话。
请以和我一样的方式执行代码,我固执地不放弃:P