是否有可能检查是因为方向变化而被调用?

我需要在onStart()方法中采取不同的行为,具体取决于onCreate()如何在orientation change结果中被调用。 有可能检查吗?

其实我所需要的是在活动开始的时候做something除了用户改变方向的情况

当用户切换到另一个应用程序并返回或者他改变了设备的方向时,我需要清楚地区分这些情况。

Related of "是否有可能检查是因为方向变化而被调用?"

 public class MyActivity extends Activity { boolean fromOrientation=false; SharedPreferences myPrefLogin; Editor prefsEditor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefsEditor = myPrefLogin.edit(); myPrefLogin = this.getSharedPreferences("myPrefs", Context.MODE_WORLD_READABLE); fromOrientation = myPrefLogin.getString("fromOrient", false); if(fromOrientation) { // do as per need--- logic of orientation changed. } else { // do as per need--- logic of default onCreate(). } } @Override public Object onRetainNonConfigurationInstance() { prefsEditor.putString("fromOrient", true); prefsEditor.commit(); return null; } @Override protected void onDestroy() { if(fromOrientation) { prefsEditor.putString("fromOrient", false); prefsEditor.commit(); } super.onDestroy(); } } 

标志fromOrientation (告诉状态或者configuration已经改变与否)以上我们已经做了defalut,我们正在考虑onCreate()不是通过改变方向来调用。 如果方向改变( onRetainNonConfigurationInstance() ),那么我们设置优先标记值,让我们知道onCreate()是否从on方向调用。 最后onDestroy()我们再次重置方向标志。

按照Nahtan的想法,我这样写道:

在onCreate()中:

 if ( (oldConfigInt & ActivityInfo.CONFIG_ORIENTATION)==ActivityInfo.CONFIG_ORIENTATION ) { // ... was rotated } else { // ... was not rotated } 

在onDestroy()中:

 super.onDestroy(); oldConfigInt = getChangingConfigurations(); 

尝试getChangingConfigurations 。 使用它可以发现由于方向更改而导致活动何时被销毁,设置标志,并在调用onCreate时检查该标志。

这具有让您知道为什么重新启动活动而不必在清单中重写方向configuration的优势。

只需检查包:当活动首次启动时,包将为空。 如果有方向更改,它应该是非空的。

从android文档 :

如果活动正在被closures之后重新初始化,那么这个Bundle包含最近在onSaveInstanceState(Bundle)中提供的数据。 注意:否则它是空的。

编辑:我不认为你必须在onSaveInstanceState中提供一个包,因为它在方向改变后是非空的,但是这将是微不足道的。

正如别人所说,拯救国家:

 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState == null) { // app started afresh, don't check orientation /* do application first-run stuff */ } else { // re-started, so check for orientation change boolean orientationChanged = false; if(savedInstanceState != null) { int lastOrientation = savedInstanceState.getInt("last_orientation"); orientationChanged = (getOrientation() != lastOrientation); } if(orientationChanged) { // orientation changed /* do stuff */ } else { // orientation has not changed /* do stuff */ } } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("last_orientation", getOrientation()); } private int getOrientation() { // ... } } 

你可以尝试以下。 在每个onStart上,您可以保存当前的方向(请看这里 )。 如果是第一次onStart呼叫,则在其他呼叫中不做任何事情,检查方向是否已更改,并执行所需操作。

 private int m_currentOrientation = -1; public void onStart() { int oldOrientation = m_currentOrientation; // m_currentOrientation = getCurrentOrientation(); // As in the link above if ((oldOrientation != -1) && (oldOrientation != m_currentOrientation)) { // Do what you need } } 

在这种情况下,你为什么不自己处理configuration文件(方向)。 告诉android不要处理屏幕方向。

 android:configChanges="keyboardHidden|orientation" 

那么你只需重写onConfigurationChanged方法来重新排列视图或任何需要做的事情。 留下你不想执行的东西。

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //do your jobs } 

如果应用程序第一次启动, mCurrentOrientation将为-1。

 static int mCurrentOrientation = -1; public void onStart() { int oldOrientation = mCurrentOrientation; mCurrentOrientation = getCurrentOrientation(); if ((oldOrientation != -1) && (oldOrientation != mCurrentOrientation)) { // Do your something here. } } 

如果我正确理解你的问题,我认为这应该适合你。