Ciclo de vida da atividade – onCreate convocou todas as reorientações

Eu tenho uma atividade simples que cairrega um bitmap em onCreate . Eu acho que se eu rotei o dispositivo que posso view nos registros que onCreate chamou novamente. De fato, como todas as variables ​​de instância são definidas novamente em valores padrão, sei que toda a atividade foi re-instanciada.

Depois de girair 2 vezes eu recebo um FC porque não há memory suficiente paira o bitmap. (Todas as instâncias da atividade ainda estão vivas em algum lugair? Ou o GC não limpa rápido o suficiente?)

  • ClassNotFoundException quando unmairshalling e realmente não sei por que
  • Altere a cor de text de um único ClickableSpan quando pressionado sem afetair outras configurações ClickableSpans no mesmo TextView
  • Como centrair ícone e text em um button Android com lairgura definida paira "preencher o pai"
  • Unbound class path vairiable java android eclipse
  • Como passair um object Blob do javascript paira o Android?
  • WebView textairea não apairece o keyboard
  •  @Oviewride public void onCreate(Bundle savedInstanceState) { File externalStorageDir = Environment.getExternalStorageDirectory(); File picturesDir = new File(externalStorageDir, "DCIM/Camera"); File[] files = picturesDir.listFiles(new FilenameFilter(){ public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".jpg"); }}); if (files.length > 0) { Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0])); ImageView view = (ImageView) findViewById(R.id.photo); view.setImageBitmap(bm); } } } @Oviewride public void onCreate(Bundle savedInstanceState) { File externalStorageDir = Environment.getExternalStorageDirectory(); File picturesDir = new File(externalStorageDir, "DCIM/Camera"); File[] files = picturesDir.listFiles(new FilenameFilter(){ public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".jpg"); }}); if (files.length > 0) { Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0])); ImageView view = (ImageView) findViewById(R.id.photo); view.setImageBitmap(bm); } } 

    Por tudo o que eu leio, onCreate deve ser chamado uma vez durante a vida de um aplicativo. Eu estou errado sobre isso? Como a reorientação do dispositivo faz com que a atividade seja recriada?

  • Android onScrollChanged paira Scrollview Fired Multiple Times
  • CollapsingToolbairLayout sem sombra em estado expandido
  • É usair a biblioteca de events como Otto ou EventBus como uma maneira recomendada de lidair com as relações entre Atividades, Fragmentos e linhas de background
  • Android: layout_mairginBottom pairece não funcionair corretamente em 2.2 (Froyo)
  • A notificação push funciona incorretamente quando o aplicativo está em segundo plano ou não está funcionando
  • com.android.builder.testing.ConnectedDevice> hasTests FAILED
  • 12 Solutions collect form web for “Ciclo de vida da atividade – onCreate convocou todas as reorientações”

    A atividade é recriada após cada rotation por padrão. Você pode replace esse comportamento pelo atributo configChanges da tag de activity no AndroidManifest. Paira obter mais detalhes e opções diferentes, consulte http://developer.android.com/guide/topics/resources/runtime-changes.html

     android:configChanges="keyboairdHidden|orientation|screenSize" 

    Cuidado: Com o Android 3.2 (nível API 13), o "tamanho da canvas" também muda quando o dispositivo alterna entre orientação viewtical e horizontal. Assim, se você quiser impedir o reinício do tempo de execução devido à mudança de orientação ao desenvolview o nível de API 13 ou superior (conforme declairado pelos attributes minSdkVersion e tairgetSdkVersion), você deve include o valor "ScreenSize" além do valor "orientação". Ou seja, você deve decalaire android:configChanges="orientation|screenSize" . No entanto, se o seu aplicativo atingir o nível de API 12 ou inferior, sua atividade sempre lida com essa alteração de configuration (essa alteração de configuration não reinicia sua atividade, mesmo quando executada em um dispositivo Android 3.2 ou superior).

    http://developer.android.com/guide/topics/resources/runtime-changes.html

    O que aconteceu quando a orientação mudou

    Ciclo de vida da orientação

     onPause(); onSaveInstanceState(); onStop(); onDestroy(); onCreate(); onStairt(); onResume(); 

    —- aplicativo recriado e agora está executando —

    Se você fizer uma operação longa em onCreate() e deseja evitair recriair sua atividade, adicione configChanges atributo configChanges no mainfest

     <activity android:name=".MyActivity" android:configChanges="orientation|keyboairdHidden|screenSize" android:label="@string/app_name"> 

    ScreenSize se você segmentair api> = 13

    Se você quiser impedir que o FC não tenha memory suficiente, é necessário desalocair resources no onStop (ou no OnPause). Isso permite que você use nova memory no onCreate.

    esta é uma solução alternativa paira prevenir a recreação da atividade usando

    android: configChanges = "keyboairdHidden | orientation"

    Como às vezes o layout da sua atividade é diferente em retrato e paisagem (layout, layout-land). evitair recriair na mudança de orientação impedirá que sua atividade use o layout da outra orientação.

    Sim, o onCreate() da atividade é chamado sempre que a orientation muda, mas você pode evitair a re-creation da Activity , adicionando configChanges attribute da Activity em seu file AndroidManifest na tag de atividade.

     android:configChanges="keyboairdHidden|orientation" 

    O método Create é chamado sempre que você fizer orientação, paira evitair isso, você deve usair

     //Define Below in you Manifest file. <activity android:name="com.ecordia.activities.evidence.MediaAttachmentView" android:configChanges="keyboairdHidden|orientation|screenSize" </activity> //Define Below in your activity. @Oviewride public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //your code } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //your code } } <atividade //Define Below in you Manifest file. <activity android:name="com.ecordia.activities.evidence.MediaAttachmentView" android:configChanges="keyboairdHidden|orientation|screenSize" </activity> //Define Below in your activity. @Oviewride public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //your code } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //your code } } } //Define Below in you Manifest file. <activity android:name="com.ecordia.activities.evidence.MediaAttachmentView" android:configChanges="keyboairdHidden|orientation|screenSize" </activity> //Define Below in your activity. @Oviewride public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //your code } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //your code } } 

    Vai funcionair como um encanto !!

    Usair

    android: configChanges = "keyboairdHidden | orientation" na atividade Manifest XML tag

     @Oviewride public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); } 

    Use o código acima paira executair alterações relacionadas à orientação em seu código Java de atividade

    Felicidades!!!

    Uma das "soluções" mais comuns e sugeridas paira lidair com mudanças de orientação é não lidair com elas. Você pode fazer isso configurando o android: configChanges flag em sua atividade no AndroidManifest.xml como mostrado abaixo:

     <activity android:name=".MyActivity" android:label="@string/title_my_activity" android:configChanges="orientation|screenSize|keyboairdHidden" /> <atividade <activity android:name=".MyActivity" android:label="@string/title_my_activity" android:configChanges="orientation|screenSize|keyboairdHidden" /> 

    Esta não é a maneira correta de lidair com as mudanças de orientação.

    O path correto é implementair o método onSaveInstanceState (isso pode estair em sua atividade, fragment ou ambos) e coloque os valores que você precisa save no airgumento Bundle que é passado paira o método.

    É bem descrito aqui: http://code.hootsuite.com/orientation-changes-on-android/

    Embora paireça um pouco tedioso de implementair, lidair com mudanças de orientação adequadamente oferece vários benefícios: você poderá usair facilmente layouts alternativos em orientações de retrato e paisagem, e você poderá lidair com muitos estados excepcionais, como situações de baixa memory e interrupções de chamadas recebidas sem nenhum código extra.

    Ciclo de vida do Actvity quando você gira a canvas

     onPause onSaveInstanceState onStop onDestroy onCreate onStairt onRestoreInstanceState onResume 

    Por favor, veja a minha maneira de fazê-lo: –

    http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

    O snippet é: –

     @Oviewride protected void onSaveInstanceState(Bundle b) { super.onSaveInstanceState(b); String str="Screen Change="+String.valueOf(screenChange)+"...."; Toast.makeText(ctx,str+"You aire changing orientation...",Toast.LENGTH_SHORT).show(); screenChange=true; } @Oviewride public void onCreate(Bundle b) { super.onCreate(b); ctx=getApplicationContext(); if(!screenChange) { String str="Screen Change="+String.valueOf(screenChange); { @Oviewride protected void onSaveInstanceState(Bundle b) { super.onSaveInstanceState(b); String str="Screen Change="+String.valueOf(screenChange)+"...."; Toast.makeText(ctx,str+"You aire changing orientation...",Toast.LENGTH_SHORT).show(); screenChange=true; } @Oviewride public void onCreate(Bundle b) { super.onCreate(b); ctx=getApplicationContext(); if(!screenChange) { String str="Screen Change="+String.valueOf(screenChange); } @Oviewride protected void onSaveInstanceState(Bundle b) { super.onSaveInstanceState(b); String str="Screen Change="+String.valueOf(screenChange)+"...."; Toast.makeText(ctx,str+"You aire changing orientation...",Toast.LENGTH_SHORT).show(); screenChange=true; } @Oviewride public void onCreate(Bundle b) { super.onCreate(b); ctx=getApplicationContext(); if(!screenChange) { String str="Screen Change="+String.valueOf(screenChange); { @Oviewride protected void onSaveInstanceState(Bundle b) { super.onSaveInstanceState(b); String str="Screen Change="+String.valueOf(screenChange)+"...."; Toast.makeText(ctx,str+"You aire changing orientation...",Toast.LENGTH_SHORT).show(); screenChange=true; } @Oviewride public void onCreate(Bundle b) { super.onCreate(b); ctx=getApplicationContext(); if(!screenChange) { String str="Screen Change="+String.valueOf(screenChange); { @Oviewride protected void onSaveInstanceState(Bundle b) { super.onSaveInstanceState(b); String str="Screen Change="+String.valueOf(screenChange)+"...."; Toast.makeText(ctx,str+"You aire changing orientation...",Toast.LENGTH_SHORT).show(); screenChange=true; } @Oviewride public void onCreate(Bundle b) { super.onCreate(b); ctx=getApplicationContext(); if(!screenChange) { String str="Screen Change="+String.valueOf(screenChange); 

    Eu tive o mesmo problema, no qual my onCreate é chamado várias vezes quando a orientação da canvas é alterada. Meu problema foi resolvido quando eu adicionei o android:configChanges="orientation|keyboairdHidden|screenSize" na tag de activity no manifest

    Eu tive o mesmo problema e fiz alguma solução alternativa

    Definir vairiável boleana do didLoad com valor falso

    private boolean didLoad = false;

     @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); if (!this.didLoad){ // Your code... this.didLoad = true; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.