J'ai écrit un petit programme ressemblant à ceci:
package com.example.lifecycle;
import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
public class LifeLogger extends Activity {
private String TAG = this.getClass().getName().toString();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life_logger);
Log.d(TAG,"onCreate event");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume event");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause event");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop event");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart event");
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
Log.d(TAG,"onCreateView event");
return super.onCreateView(name, context, attrs);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart event");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy event");
}
}
Quelle est l'activité principale.
Le LogCat c'est:
06-11 07: 07: 10.033: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.033: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.043: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.053: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.073: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.073: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.103: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): événement OnCreate 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): événement onStart 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): onResume événement 06-11 07: 07: 10.193: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.223: D/gralloc_goldfish (600): Émulateur sans émulation de GPU détecté. 06-11 07: 08: 19.633: D/com.example.lifecycle.LifeLogger (600): événement onPause 06-11 07: 08: 20.213: D/com.example.lifecycle.LifeLogger (600): événement onStop 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): onRestart événement 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): Événement onStart 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): événement onResume 06-11 07: 08: 51.073: D/com.example.lifecycle.LifeLogger (600): événement onPause 06-11 07: 08: 52.963: D/com.example.lifecycle.LifeLogger (600): onStop événement 06-11 07: 08: 54.043: D/com.example.lifecycle.LifeLogger (600): événement onDestroy
Que s'est-il passé ici? pourquoi onCreateView s'appelle-t-il tant de fois?
Quel est le timing de onCreateView?
Merci.
mettre à jour:
le xml gonflé:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/hello_world" />
</RelativeLayout>
le manifast:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.lifecycle"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk
Android:minSdkVersion="15"
Android:targetSdkVersion="17" />
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name="com.example.lifecycle.LifeLogger"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
courir sur Android api niveau 16
Vous avez étendu votre classe avec Activity
. Cela signifie que le cycle de vie de votre classe serait comme ci-dessous.
Ainsi, onCreateView n'est pas une méthode de cycle de vie pour une activité. C'est juste une méthode membre qui sera utilisée pour des tâches spécifiques, comme indiqué dans la doc.
Mise en œuvre standard de Android.view.LayoutInflater.Factory.onCreateView utilisé lors du gonflage avec LayoutInflater renvoyé par getSystemService. Ce la mise en œuvre ne fait rien et est pour versions antérieures à Android.os.Build.VERSION_CODES.HONEYCOMB. Les nouvelles applications devraient utilisez onCreateView (View, String, Context, AttributeSet).
Compter sur l'appel de onCreateView () dans une activité est une mauvaise programmation.
Si vous utilisiez Fragment
étendu à votre classe et avez écrit la méthode onCreateView (), elle n'aurait été appelée que deux fois après votre onAttach () et votre onDestroyView () si vous êtes toujours sur le même fragment.
Voir ce diagramme.
Ici, c'est une méthode de cycle de vie pour Fragment.
Donc, vous testez avec de fausses hypothèses. C'est tout!
Android Framework utilise le mécanisme d'injection de dépendances lorsque le fichier de présentation est gonflé.Je pense qu'en raison de cela onCreateView est appelé plusieurs fois.La formule pour cela pourrait être comme ci-dessous
Essayez de supprimer setContentView et voyez combien de fois onCreateView est appelé. Vous pourriez en obtenir un aperçu.
Vous pouvez surveiller la raison pour laquelle onCreateView est appelé à partir d'un fichier journal:
ajoutez dans votre méthode onCreateView ceci:
Log.d("TAG", "onCreateView event : " + name);
tel que mon logcat produit ceci;
onCreateView : LinearLayout
onCreateView : ViewStub
onCreateView : FrameLayout
onCreateView : Android.support.v7.widget.ActionBarOverlayLayout
onCreateView : Android.support.v7.widget.ContentFrameLayout
onCreateView : Android.support.v7.widget.ActionBarContainer
onCreateView : Android.support.v7.widget.Toolbar
onCreateView : Android.support.v7.widget.ActionBarContextView
onCreateView : LinearLayout
onCreateView
appels = nombre de vues dans la mise en page (créer chaque vue)