gpt4 book ai didi

android - 如果应用仍在运行onCreate方法,为什么onResume方法将被执行两次?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:01:00 25 4
gpt4 key购买 nike

我正在开发一个Android应用程序,并且在其中一项 Activity 中,我正在使用MapsActivity来显示 map 。
我所看到的是,在2.2(API8)模拟器上需要花费一些时间来加载 map ,并且我有时间按菜单按钮,然后返回到应用程序,并且它仍在setContentView()上加载,这是问题所在当它进入onResume()时,它将被调用两次。
根据Android Activity 的生命周期,在onPause()-> [onRestart()-> onStart()]-> onResume()之后,如果应用再次出现在前台,则会调用onResume()在启动时onCreate()-> [onStart()]之后调用。
但是,如果仍在onCreate()中的setContentView上加载它,为什么不调用一次呢?
这是我感兴趣的事情,因为我不想每次使用map都认为 bool 数可以执行两次以避免出现问题(即计数器的两倍递增)时不希望使用 bool 值。
我不知道这是否是模拟器的问题,因为我已经看到了有关横向肖像朝向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;
}
}
activity_location.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()处设置另一个断点。
  • 执行并在调试 View 时。
  • 发送到后台应用程序,然后再次运行。
  • 完成执行后,您将看到一个对话框,显示一个值:2。

  • 阅读Geobits和G. Blake Meike所做的评论,这部分只是一个答案,目的是澄清我是否错了。
    由于 map 的异步加载,也许 map 的示例是一个不好的例子。
    我将MapsActivity更改为Activity,我们假设手机过载,因此onCreate将执行8秒的循环(对于Android Not Responding,这不是特别的时间)。
    这是使用轻便的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): sleep ...
  • 02-28 20:02:49.655:W/LocationActivity(651): sleep ...
  • 02-28 20:02:50.678:W/LocationActivity(651): sleep ...
  • 02-28 20:02:51.673:W/LocationActivity(651): sleep ...
  • 02-28 20:02:52.674:W/LocationActivity(651): sleep ...
  • 02-28 20:02:53.738:W/LocationActivity(651): sleep ...
  • 02-28 20:02:54.773:W/LocationActivity(651): sleep ...
  • 02-28 20:02:55.795:W/LocationActivity(651): sleep ...
  • 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):正在显示Toast
  • 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):正在显示Toast

  • toast 将显示两次消息。
    查看logCat的生命周期是正确的,但我只想考虑到有时onCreate可能由于系统重载而延迟,并且如果onResume执行两次,那么我必须注意一些初始化,因此我必须使用 bool 值我认为我不应该使用它,因为onCreate仍在运行。
    如果不是Toast而是对话框,那么从用户的POV来看,不欢迎使用两个对话框。
    请以与我相同的方式执行代码,我很固执,不会放弃:P

    最佳答案

    这是设计使然。如果将 Activity 发送到后台,则在返回时必须调用onResume()

    the documentation:

    Be aware that the system calls this method every time your activity comes into the foreground, including when it's created for the first time. As such, you should implement onResume() to initialize components that you release during onPause() and perform any other initializations that must occur each time the activity enters the Resumed state (such as begin animations and initialize components only used while the activity has user focus).



    另请注意, setContentView()可能已经返回。不需要很长时间,即使是 MapView。该 map 可能是异步加载的,因此它不会占用UI线程。

    关于android - 如果应用仍在运行onCreate方法,为什么onResume方法将被执行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139820/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com