onCreate
にビットマップをロードする簡単なアクティビティがあります。デバイスを回転させると、ログからonCreate
が再び呼び出したことがわかります。実際、すべてのインスタンス変数が再びデフォルト値に設定されているため、アクティビティ全体が再インスタンス化されたことを知っています。
2回回転した後、ビットマップに十分なメモリを割り当てることができないため、FCを取得します。 (アクティビティのすべてのインスタンスはどこかにまだ生きていますか?またはGCが十分に速くクリーンアップしませんか?)
@Override
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);
}
}
私が読んだすべてから、onCreateはアプリケーションの存続期間中に1回呼び出される必要があります。私はこれについて間違っていますか?デバイスの向きを変えると、アクティビティが再作成されますか?
デフォルトでは、アクティビティは各ローテーション後に再作成されます。 AndroidManifestのconfigChanges
タグのactivity
属性でこの動作をオーバーライドできます。詳細とさまざまなオプションについては、 http://developer.Android.com/guide/topics/resources/runtime-changes.html をご覧ください。
Android:configChanges="keyboardHidden|orientation|screenSize"
注意:Android 3.2(APIレベル13)以降、デバイスの切り替え時に「画面サイズ」も変更されますしたがって、APIレベル13以上(minSdkVersion属性とtargetSdkVersion属性で宣言されている)で開発する際の向きの変更によるランタイムの再起動を防ぐには、に加えて "screenSize"値を含める必要があります。 「方向」値。つまり、
Android:configChanges="orientation|screenSize"
。ただし、アプリケーションがAPIレベル12以下をターゲットとする場合、アクティビティは常にこの構成変更を処理します(この構成変更は、Android 3.2以上のデバイスで実行している場合でも、アクティビティを再起動しません)。
http://developer.Android.com/guide/topics/resources/runtime-changes.html
向きが変わったときに何が起こるか
オリエンテーションのライフサイクル
_onPause();
onSaveInstanceState();
onStop();
onDestroy();
onCreate();
onStart();
onResume();
_
----アプリが再作成され、現在実行中です---
onCreate()
で長時間の操作を行い、アクティビティの再作成を防止する場合は、メインフェストにconfigChanges
属性を追加します
_<activity Android:name=".MyActivity"
Android:configChanges="orientation|keyboardHidden|screenSize"
Android:label="@string/app_name">
_
screenSize APIをターゲットにした場合> = 13
画面を回転させるときのアクティビティライフサイクル
onPause
onSaveInstanceState
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
FCが十分なメモリを確保できないようにするには、onStop()
またはonPause()
でリソースの割り当てを解除する必要があります。これにより、onCreate()
で新しいメモリを使用できます。
これは、次を使用してアクティビティの再現を防止する代替ソリューションです。
Android:configChanges="keyboardHidden|orientation"
アクティビティのレイアウトはポートレートとランドスケープ(レイアウト、レイアウトランド)で異なる場合があります。向きの変更時に再作成を防ぐと、アクティビティが他の向きのレイアウトを使用できなくなります。
On Createメソッドは、オリエンテーションを行うたびに呼び出されます。これを回避するには、使用する必要があります
//Define Below in you Manifest file.
<activity
Android:name="com.ecordia.activities.evidence.MediaAttachmentView"
Android:configChanges="keyboardHidden|orientation|screenSize"
</activity>
//Define Below in your activity.
@Override
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
}
}
それは魅力のように動作します!!
はい、アクティビティのonCreate()
はorientation
が変更されるたびに呼び出されますが、re-creation
of Activity
を追加してconfigChanges attribute
of Activity
of your AndroidManifest
file in activity tag。
Android:configChanges="keyboardHidden|orientation"
オリエンテーションの変化に対処するための最も一般的で推奨される「解決策」の1つは、それらに対処しないことです。これを行うには、以下に示すように、AndroidManifest.xmlのアクティビティでAndroid:configChangesフラグを設定します。
<activity
Android:name=".MyActivity"
Android:label="@string/title_my_activity"
Android:configChanges="orientation|screenSize|keyboardHidden" />
これは、向きの変更に対処する正しい方法ではありません。
正しい方法は、onSaveInstanceStateメソッド(これはActivity、Fragment、またはその両方にあります)を実装し、メソッドに渡されるBundle引数に保存する必要がある値を配置することです。
ここでうまく説明されています: http://code.hootsuite.com/orientation-changes-on-Android/
実装するのは少し面倒に思えるかもしれませんが、向きの変更を適切に処理すると、いくつかの利点が得られます。余分なコードなしで着信通話からの中断。
つかいます
Android:configChanges="keyboardHidden|orientation" in Manifest XML activity Tag
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
上記のコードを使用して、アクティビティの方向に関する変更を実行しますJava Code
乾杯!!!
私のやり方をご覧ください:-
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
スニペットは:-
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
@Override
public void onCreate(Bundle b)
{
super.onCreate(b);
ctx=getApplicationContext();
if(!screenChange)
{
String str="Screen Change="+String.valueOf(screenChange);