为什么我的onResume被调用两次?

基本上,这就是我正在做的

1)设置AlarmManager执行BroadcastReceiver(BCR)

Intent intent = new Intent(m_Context, BCR.class); intent.putExtras(extras); PendingIntent pendingIntent = PendingIntent.getBroadcast(m_Context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, StartTime, pendingIntent) 

2)从BCR启动MyActivity

 @Override public void onReceive(Context context, Intent intent) { Intent newIntent = new Intent(context, MyActivity.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(newIntent); } 

3)如果MyActivity没有打开,请打开屏幕

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(LayoutParams.FLAG_TURN_SCREEN_ON); setContentView(R.layout.myactivity); } @Overide protected void onNewIntent(Intent intent) { super.onNewIntent(intent); } 

出于某种原因,我注意到,当MyActivity打开时,stream程如下所示:

onCreate / onNewIntent – > onResume – > onPause – > onResume

我不知道为什么它马上做onPause。 我注意到这只发生在屏幕被标志打开时。 有谁知道为什么发生这种情况? 有什么办法可以防止这种行为?

以防其他人遇到这种情况,我似乎注意到这种行为,只有当我通过XML布局膨胀活动内的片段。 我不知道如果这种行为也发生与碎片的兼容性库版本(我正在使用android.app.Fragment)

看来这个活动会在调用Fragment#onResume之前调用Activity#onResume一次,然后再调用Activity#onResume

  1. 活动:的onCreate
  2. 片段:onAttach
  3. 活动时间:onAttachFragments
  4. 片段:的onCreate
  5. 活动:onStart
  6. 活动:onResume
  7. 片段:onResume
  8. 活动:onResume

如果你有ES文件资源pipe理器,强制停止它。 不知何故,他们中断你的应用程序的生命周期。

我的问题与onResume被造成两次是因为onPause不知何故被称为活动创build后,有什么中断我的应用程序。

而这只发生在安装后第一次开放或从工作室build成

我从另一篇文章中得到了CLUE,发现这是因为ES文件资源pipe理器。 为什么onResume()似乎被调用两次?

只要我“停止”ES文件资源pipe理器,这种打嗝行为不再发生…非常令人沮丧的知道后,尝试这么多其他提出的解决scheme。

我不知道发生了什么,但我怀疑你的活动正在重新启动,因为设置屏幕被系统视为configuration更改。 您可以尝试每次调用onResumeloggingconfiguration,看看是否发生了什么,如果是这样,实际上是在变化。 然后,您可以修改清单,告诉系统您的活动将自行处理更改。

 protected void onResume() [ super.onResume(); Configuration config = new Configuration(); config.setToDefaults(); Log.d("Config", config.toString()); . . . } 

我正在研究这个问题,因为在互联网上没有提到这种奇怪的行为。 我没有办法解决这个黑暗的行为,但是我发现了一个确切的情况。

onPause-onResume-onPause-onResume只是每次安装后第一次启动应用程序时发生。 您可以简单地通过在代码中进行任何更改并重新运行(包括重新编译)您的IDE中的应用程序来调用此行为。

不pipe你是否使用AppCompat库。 我已经testing了案件和行为进行。

注意:testingAndroid棉花糖。

我已经从这个线程中获得了有关片段和活动生命周期的代码,这里是(在manifest中复制,粘贴,声明活动并运行Forest运行):

 import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class TestActivity extends Activity { private static final String TAG = "ACTIVITY"; public TestActivity() { super(); Log.d(TAG, this + ": this()"); } protected void finalize() throws Throwable { super.finalize(); Log.d(TAG, this + ": finalize()"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, this + ": onCreate()"); TextView tv = new TextView(this); tv.setText("Hello world"); setContentView(tv); if (getFragmentManager().findFragmentByTag("test_fragment") == null) { Log.d(TAG, this + ": Existing fragment not found."); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(new TestFragment(), "test_fragment").commit(); } else { Log.d(TAG, this + ": Existing fragment found."); } } @Override public void onStart() { super.onStart(); Log.d(TAG, this + ": onStart()"); } @Override public void onResume() { super.onResume(); Log.d(TAG, this + ": onResume()"); } @Override public void onPause() { super.onPause(); Log.d(TAG, this + ": onPause()"); } @Override public void onStop() { super.onStop(); Log.d(TAG, this + ": onStop()"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, this + ": onDestroy()"); } public static class TestFragment extends Fragment { private static final String TAG = "FRAGMENT"; public TestFragment() { super(); Log.d(TAG, this + ": this() " + this); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, this + ": onCreate()"); } @Override public void onAttach(final Context context) { super.onAttach(context); Log.d(TAG, this + ": onAttach(" + context + ")"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, this + ": onActivityCreated()"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, this + ": onCreateView()"); return null; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.d(TAG, this + ": onViewCreated()"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG, this + ": onDestroyView()"); } @Override public void onDetach() { super.onDetach(); Log.d(TAG, this + ": onDetach()"); } @Override public void onStart() { super.onStart(); Log.d(TAG, this + ": onStart()"); } @Override public void onResume() { super.onResume(); Log.d(TAG, this + ": onResume()"); } @Override public void onPause() { super.onPause(); Log.d(TAG, this + ": onPause()"); } @Override public void onStop() { super.onStop(); Log.d(TAG, this + ": onStop()"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, this + ": onDestroy()"); } } } 

我有一个类似的问题,我的问题是在onCreate()方法,我正在做:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.friends); <-- problem } 

我的电话是“超级”。 触发了两次onResume()。 它改变了它只是为了:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.friends); <-- 'super.' removed } 

希望能帮助到你。

我有类似的问题。 我的情况是下一个CurrentActivity扩展MainActivity CurrentFragment扩展MainFragment

我通常打算与意图打开CurrentActivity 。 在onCreate CurrentAcitivity我正在replaceCurrentFragment。

生命周期是:1. onResume MainActivity 2. onResume CurrentActivity 3. onResume MainFragment 4. onResume CurrentFragment

自动调用onPause,然后再次

  1. onResume MainActivity
  2. onResume CurrentActivity
  3. onResume MainFragment
  4. onResume CurrentFragment

我决定重新testing一切,经过几个小时花在尝试和玩,我发现根本问题。 在MainFragment onStart我每次都调用startActivityForResult(在我的情况下android打开Wifi的popup),这是调用MainPragment上的onPause。 我们都知道onPause之后是onResume。

所以它不是Android的错误,它只是我的:-)

快乐的生命周期debugging!

我也遇到了这个onresume-onpause-onresume序列(在4.1.2及以上版本,但是我没有在2.3上经历过这个)。 我的问题与wakelock处理有关:我不小心忘记了释放唤醒锁并重新获取,导致错误消息“WakeLock在仍然保留的情况下完成”。 这个问题导致在onResume之后立即调用onPause并导致错误的行为。

我的build议是:检查日志中的错误,可能与这个问题有关。

另一个提示:打开屏幕可能比简单地使用窗口标志更棘手。 你可能想在这里查看这个答案 – 它build议你设置一个接收器来检查屏幕是否已经打开,并且仅在以下情况下启动期望的活动: https : //stackoverflow.com/a/16346369/875442

似乎使用支持库中的Activity自动保存和恢复实例。 因此,如果savedInstanceStatenull ,则只做你的工作。

我只是碰到了这个,似乎getWindow().addFlags()和调整一般的Window属性可能是一个罪魁祸首。

当我的代码是这样的

 @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_generic_fragment_host); // performing fragment transaction when instance state is null... 

onResume()被触发两次,但是当我删除requestWindowFeature() ,它只被调用一次。

我认为你应该看看这个问题: Nexus 5进入睡眠模式使得活动生命周期越野车你应该find线索

基本上有很多东西可以触发这一点。 一些恢复过程失去了重点可以做到这一点。 一些应用程序也会导致它发生。 唯一的办法是阻止双重跑。 请注意,这也将有一个错误的暂停投入很好的措施。

  boolean resumeblock = false; @Override protected void onResume() { super.onResume(); sceneView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { sceneView.getViewTreeObserver().removeOnPreDrawListener(this); if (resumeblock) return false; resumeblock = true; //Some code. return false; } }); } 

这是防止这种事情的可靠方法。 这将阻止双重履历。 但是,它也会阻止两个恢复保存内存。 所以如果你只是失去了重点,并不需要重build你的东西​​。 它也会阻止。 这可能是一个明显的好处,因为如果您使用简历来控制焦点的一些变化,那么您实际上关心是否需要重点关注重点。 由于预绘制侦听器只能由一个线程调用,并且必须按顺序调用,所以此处的代码只能运行一次。 直到正确地破坏整个活动并将resumeblock恢复为false。

我也面临这个问题,这是因为片段..您在活动onResume()的片段数将调用该次数。 克服我在SharedPrefrences使用的标志variables