Android Launcher 会onCreate 两次的原因

com.Android.server.am.ActivityStack      /**      * Make sure the given activity matches the current configuration.  Returns      * false if the activity had to be destroyed.  Returns true if the      * configuration is the same, or the activity will remain running as-is      * for whatever reason.  Ensures the HistoryRecord is updated with the      * correct configuration and all other bookkeeping is handled.      */      final boolean ensureActivityConfigurationLocked(ActivityRecord r,              int globalChanges) {          ...          if ((changes&(~r.info.configChanges)) != 0) {              // Aha, the activity isn't handling the change, so DIE DIE DIE.               r.configChangeFlags |= changes;              r.startFreezingScreenLocked(r.app, globalChanges);              if (r.app == null || r.app.thread == null) {                  if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,                          "Switch is destroying non-running " + r);                  destroyActivityLocked(r, true);              } else if (r.state == ActivityState.PAUSING) {                  // A little annoying: we are waiting for this activity to                   // finish pausing.  Let's not do anything now, but just                   // flag that it needs to be restarted when done pausing.                   if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,                          "Switch is skipping already pausing " + r);                  r.configDestroy = true;                  return true;              } else if (r.state == ActivityState.RESUMED) {                  // Try to optimize this case: the configuration is changing                   // and we need to restart the top, resumed activity.                   // Instead of doing the normal handshaking, just say                   // "restart!".                   if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,                          "Switch is restarting resumed " + r);                                    relaunchActivityLocked(r, r.configChangeFlags, true);                  r.configChangeFlags = 0;              } else {                  if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,                          "Switch is restarting non-resumed " + r);                  relaunchActivityLocked(r, r.configChangeFlags, false);                  r.configChangeFlags = 0;              }                            // All done...  tell the caller we weren't able to keep this               // activity around.               return false;          }          ...         }  注意以上代码中的第13行和第41行

Why:

        系统启动后,搜索到可用移动网络会触发 config changes : mcc | mnc 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyjjzg.html