日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Application创建到Activity启动(launcher启动和startActivity启动)

發(fā)布時間:2023/12/18 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Application创建到Activity启动(launcher启动和startActivity启动) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 點擊桌面應(yīng)用程序創(chuàng)建application和activity流程
      • 點擊 startActivity() 時的調(diào)用流程
      • 問題: 為什么啟動時會先調(diào)用棧頂activity的onPause()
      • 問題:為什么requestWindowFeature(Window.FEATURE_NO_TITLE);要在setContentView()之前.

點擊桌面應(yīng)用程序創(chuàng)建application和activity流程

  • 首先從APP程序入口啟動 main 函數(shù)開始。看下 ActivityThread 的 main 方法
    main方法中做了一些 Loop 的初始化,Application綁定流程的調(diào)用等,具體看代碼:代碼中有備注,省略了部分代碼
public static void main(String[] args) {// ... 省略上面代碼// 內(nèi)部是初始化 main Looper 邏輯 涉及到 Handler 的初始化知識Looper.prepareMainLooper();// ... 省略上面代碼// 創(chuàng)建 ActivityThread 對象ActivityThread thread = new ActivityThread();// 調(diào)用 ActivityThread 的 attach 方法 // attach 方法內(nèi)部 創(chuàng)建 Instrumentation 對象,綁定 application ,創(chuàng)建 applicationContext 對象,回調(diào) application 的 onCreate 方法// 下面會介紹一下 attach 的源碼thread.attach(false, startSeq);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}if (false) {Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG, "ActivityThread"));}// End of event ActivityThreadMain.Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);// 調(diào)用 Looper.loop() 內(nèi)部開啟了 for(;;) 去不斷接受 Handler 發(fā)送的消息Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");}
  • activityThread 的 attach 方法
    創(chuàng)建 Instrumentation 對象,綁定 application ,創(chuàng)建 applicationContext 對象,回調(diào) application 的 onCreate 方法
private void attach(boolean system, long startSeq) {// ... 代碼省略if (!system) { // 默認(rèn)傳入的是 false// 通過 Binder機(jī)制 ActivityManager.getService(); 獲取 ActivityManagerServicefinal IActivityManager mgr = ActivityManager.getService();try {// 綁定 attachApplication 下一部分會介紹具體綁定流程mgr.attachApplication(mAppThread, startSeq);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}// ...} else {// ... }// 代碼省略...ViewRootImpl.addConfigCallback(configChangedCallback);}
  • 上面 attach 中 mgr.attachApplication(mAppThread, startSeq); 方法是怎么綁定 application 的。進(jìn)入 ActivityManagerService 的 attachApplication
@Overridepublic final void attachApplication(IApplicationThread thread, long startSeq) {synchronized (this) {// 通過 Binder 獲取 PID ,PID和UID都是進(jìn)程創(chuàng)建應(yīng)用的時候系統(tǒng)指定的int callingPid = Binder.getCallingPid();// 獲取 UID final int callingUid = Binder.getCallingUid();final long origId = Binder.clearCallingIdentity();// 最終調(diào)用到了 attachApplicationLockedattachApplicationLocked(thread, callingPid, callingUid, startSeq);Binder.restoreCallingIdentity(origId);}}
  • ActivityManagerService 的 attachApplicationLocked(thread, callingPid, callingUid, startSeq);
    這里只挑一些主要代碼去貼出來
@GuardedBy("this")private final boolean attachApplicationLocked(IApplicationThread thread,int pid, int callingUid, long startSeq) {// ProcessRecord AMS通過ProcessRecord來維護(hù)進(jìn)程運行時的信息ProcessRecord app;long startTime = SystemClock.uptimeMillis();// 判斷 pid 和 uid 是否存在則創(chuàng)建 ProcessRecordif (pid != MY_PID && pid >= 0) {synchronized (mPidsSelfLocked) {app = mPidsSelfLocked.get(pid);}} else {app = null;}// ... 代碼省略一大堆// 在下面就是調(diào)用 thread.bindApplication 這里的 thread 是 IapplicationThreadif (app.isolatedEntryPoint != null) {// This is an isolated process which should just call an entry point instead of// being bound to an application.thread.runIsolatedEntryPoint(app.isolatedEntryPoint, app.isolatedEntryPointArgs);} else if (app.instr != null) {// bindApplication 傳入了各種app相關(guān)的信息 下面看 bindApplication 是怎么綁定的thread.bindApplication(processName, appInfo, providers,app.instr.mClass,profilerInfo, app.instr.mArguments,app.instr.mWatcher,app.instr.mUiAutomationConnection, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial, isAutofillCompatEnabled);} else {thread.bindApplication(processName, appInfo, providers, null, profilerInfo,null, null, null, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial, isAutofillCompatEnabled);}// ... 代碼省略// 做檢測 查看頂部可見活動是否等待此進(jìn)程中進(jìn)行if (normalMode) {try {// 后面會介紹 里面會具體解鎖 activity 的創(chuàng)建運行if (mStackSupervisor.attachApplicationLocked(app)) {didSomething = true;}} catch (Exception e) {Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);badApp = true;}}// ... 下面代碼省略}
  • thread.bindApplication 方法。IApplicationThread 中
    經(jīng)過一系列的操作 最后把各種信息保存在了 AppBindData 中,它就是javabean,最后調(diào)用了
    sendMessage(H.BIND_APPLICATION, data);
public final void bindApplication(String processName, ApplicationInfo appInfo,List<ProviderInfo> providers, ComponentName instrumentationName,ProfilerInfo profilerInfo, Bundle instrumentationArgs,IInstrumentationWatcher instrumentationWatcher,IUiAutomationConnection instrumentationUiConnection, int debugMode,boolean enableBinderTracking, boolean trackAllocation,boolean isRestrictedBackupMode, boolean persistent, Configuration config,CompatibilityInfo compatInfo, Map services, Bundle coreSettings,String buildSerial, boolean autofillCompatibilityEnabled) {if (services != null) {if (false) {// Test code to make sure the app could see the passed-in services.for (Object oname : services.keySet()) {if (services.get(oname) == null) {continue; // AM just passed in a null service.}String name = (String) oname;// See b/79378449 about the following exemption.switch (name) {case "package":case Context.WINDOW_SERVICE:continue;}if (ServiceManager.getService(name) == null) {Log.wtf(TAG, "Service " + name + " should be accessible by this app");}}}// Setup the service cache in the ServiceManagerServiceManager.initServiceCache(services);}setCoreSettings(coreSettings);// 將各種數(shù)據(jù)保存下載AppBindData data = new AppBindData();data.processName = processName;data.appInfo = appInfo;data.providers = providers;data.instrumentationName = instrumentationName;data.instrumentationArgs = instrumentationArgs;data.instrumentationWatcher = instrumentationWatcher;data.instrumentationUiAutomationConnection = instrumentationUiConnection;data.debugMode = debugMode;data.enableBinderTracking = enableBinderTracking;data.trackAllocation = trackAllocation;data.restrictedBackupMode = isRestrictedBackupMode;data.persistent = persistent;data.config = config;data.compatInfo = compatInfo;data.initProfilerInfo = profilerInfo;data.buildSerial = buildSerial;data.autofillCompatibilityEnabled = autofillCompatibilityEnabled;// 發(fā)送handler消息sendMessage(H.BIND_APPLICATION, data);}
  • 接下來看看 Handler 接收 H.BIND_APPLICATION 消息是怎么處理的。
public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {case BIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");AppBindData data = (AppBindData)msg.obj;handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;
  • ActivityThread 中的 handleBindApplication(data);
private void handleBindApplication(AppBindData data) {// ... 只貼出主要代碼try {// If the app is being launched for full backup or restore, bring it up in// 創(chuàng)建 applicationapp = data.info.makeApplication(data.restrictedBackupMode, null);// Propagate autofill compat stateapp.setAutofillCompatibilityEnabled(data.autofillCompatibilityEnabled);mInitialApplication = app;// don't bring up providers in restricted mode; they may depend on the// app's custom Application classif (!data.restrictedBackupMode) {if (!ArrayUtils.isEmpty(data.providers)) {installContentProviders(app, data.providers);// For process that contains content providers, we want to// ensure that the JIT is enabled "at some point".mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);}}// Do this after providers, since instrumentation tests generally start their// test thread at this point, and we don't want that racing.try {mInstrumentation.onCreate(data.instrumentationArgs);}catch (Exception e) {throw new RuntimeException("Exception thrown in onCreate() of "+ data.instrumentationName + ": " + e.toString(), e);}try {// 調(diào)用 appilcation 的 onCreate方法mInstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!mInstrumentation.onException(app, e)) {throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}} finally {// If the app targets < O-MR1, or doesn't change the thread policy// during startup, clobber the policy to maintain behavior of b/36951662if (data.appInfo.targetSdkVersion < Build.VERSION_CODES.O_MR1|| StrictMode.getThreadPolicy().equals(writesAllowedPolicy)) {StrictMode.setThreadPolicy(savedPolicy);}}}
  • 上面代碼中 app = data.info.makeApplication(data.restrictedBackupMode, null);
    LoadedApk 中的 makeApplication
public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {if (mApplication != null) {return mApplication;}Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication");Application app = null;// 獲取 application的 calssName 這里面是獲取的自定義 application 的名字 如果沒有則引用系統(tǒng)默認(rèn)的String appClass = mApplicationInfo.className;if (forceDefaultAppClass || (appClass == null)) {appClass = "android.app.Application";}try {// 通過 calssLoader 來創(chuàng)建 applicationjava.lang.ClassLoader cl = getClassLoader();if (!mPackageName.equals("android")) {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"initializeJavaContextClassLoader");initializeJavaContextClassLoader();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}// 創(chuàng)建 applicationContexxtContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);appContext.setOuterContext(app);} catch (Exception e) {if (!mActivityThread.mInstrumentation.onException(app, e)) {Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);throw new RuntimeException("Unable to instantiate application " + appClass+ ": " + e.toString(), e);}}mActivityThread.mAllApplications.add(app);mApplication = app;if (instrumentation != null) {try {// 調(diào)用 onCreateinstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!instrumentation.onException(app, e)) {Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}}// Rewrite the R 'constants' for all library apks.SparseArray<String> packageIdentifiers = getAssets().getAssignedPackageIdentifiers();final int N = packageIdentifiers.size();for (int i = 0; i < N; i++) {final int id = packageIdentifiers.keyAt(i);if (id == 0x01 || id == 0x7f) {continue;}rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id);}Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);return app;}
  • 這樣 application 就創(chuàng)建完成了 ,然后繼續(xù)回到 ActivityManagerService 中的 attachApplicationLocked 創(chuàng)建完成application之后繼續(xù)執(zhí)行后面的代碼,有這么一句話
mStackSupervisor.attachApplicationLocked(app)
  • 來具體看看里面是做什么的
    ActivityStackSupervisor 的 attachApplicationLocked
boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {// 獲取進(jìn)程名final String processName = app.processName;boolean didSomething = false;for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {final ActivityStack stack = display.getChildAt(stackNdx);if (!isFocusedStack(stack)) {continue;}stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);final ActivityRecord top = stack.topRunningActivityLocked();final int size = mTmpActivityList.size();for (int i = 0; i < size; i++) {final ActivityRecord activity = mTmpActivityList.get(i);if (activity.app == null && app.uid == activity.info.applicationInfo.uid&& processName.equals(activity.processName)) {try {// 下面會看一下 realStartActivityLocked 里面是什么邏輯if (realStartActivityLocked(activity, app,top == activity /* andResume */, true /* checkConfig */)) {didSomething = true;}} catch (RemoteException e) {Slog.w(TAG, "Exception in new application when starting activity "+ top.intent.getComponent().flattenToShortString(), e);throw e;}}}}}if (!didSomething) {ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);}return didSomething;}
  • ActivityStackSupervisor 的 realStartActivityLocked
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {// ... // Create activity launch transaction.final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,r.appToken);// LaunchActivityItem 就是 manifest里面的 launch回調(diào)clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,r.persistentState, results, newIntents, mService.isNextTransitionForward(),profilerInfo));}// Set desired final state.final ActivityLifecycleItem lifecycleItem;if (andResume) {lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());} else {lifecycleItem = PauseActivityItem.obtain();}clientTransaction.setLifecycleStateRequest(lifecycleItem);// Schedule transaction.// 調(diào)用 scheduleTransaction 代碼在下面會貼出來 mService 就是 AMSmService.getLifecycleManager().scheduleTransaction(clientTransaction);
  • mService.getLifecycleManager().scheduleTransaction(clientTransaction); 方法
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();transaction.schedule();if (!(client instanceof Binder)) {// If client is not an instance of Binder - it's a remote call and at this point it is// safe to recycle the object. All objects used for local calls will be recycled after// the transaction is executed on client in ActivityThread.transaction.recycle();}}
  • 調(diào)用了ClientTransaction 中的 transaction.schedule();
public void schedule() throws RemoteException {// 調(diào)用了 IApplicationThread 的 scheduleTransactionmClient.scheduleTransaction(this);}
  • mClient.scheduleTransaction(this); 調(diào)用到了 ActivityThread 中的
@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {ActivityThread.this.scheduleTransaction(transaction);}
  • ActivityThread.this.scheduleTransaction(transaction); 如下:
/** Prepare and schedule transaction for execution. */void scheduleTransaction(ClientTransaction transaction) {transaction.preExecute(this);// 發(fā)送 HandlersendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}
  • 看一下 Handler 的 EXECUTE_TRANSACTION
case EXECUTE_TRANSACTION:final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);if (isSystem()) {// Client transactions inside system process are recycled on the client side// instead of ClientLifecycleManager to avoid being cleared before this// message is handled.transaction.recycle();}// TODO(lifecycler): Recycle locally scheduled transactions.break;
  • 上面 Handler 中 mTransactionExecutor.execute(transaction); 跳轉(zhuǎn)到 TransactionExecutor 中
public void execute(ClientTransaction transaction) {final IBinder token = transaction.getActivityToken();log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);// 調(diào)用這個方法executeCallbacks(transaction); executeLifecycleState(transaction);mPendingActions.clear();log("End resolving transaction");}
  • executeCallbacks(transaction); 方法
public void executeCallbacks(ClientTransaction transaction) {final List<ClientTransactionItem> callbacks = transaction.getCallbacks();if (callbacks == null) {// No callbacks to execute, return early.return;}log("Resolving callbacks");final IBinder token = transaction.getActivityToken();ActivityClientRecord r = mTransactionHandler.getActivityClient(token);// In case when post-execution state of the last callback matches the final state requested// for the activity in this transaction, we won't do the last transition here and do it when// moving to final state instead (because it may contain additional parameters from server).final ActivityLifecycleItem finalStateRequest = transaction.getLifecycleStateRequest();final int finalState = finalStateRequest != null ? finalStateRequest.getTargetState(): UNDEFINED;// Index of the last callback that requests some post-execution state.final int lastCallbackRequestingState = lastCallbackRequestingState(transaction);final int size = callbacks.size();for (int i = 0; i < size; ++i) {final ClientTransactionItem item = callbacks.get(i);log("Resolving callback: " + item);final int postExecutionState = item.getPostExecutionState();final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,item.getPostExecutionState());if (closestPreExecutionState != UNDEFINED) {cycleToPath(r, closestPreExecutionState);}// 執(zhí)行了 item.execute 就是 LaunchActivityItem 的 executeitem.execute(mTransactionHandler, token, mPendingActions);item.postExecute(mTransactionHandler, token, mPendingActions);if (r == null) {// Launch activity request will create an activity record.r = mTransactionHandler.getActivityClient(token);}if (postExecutionState != UNDEFINED && r != null) {// Skip the very last transition and perform it by explicit state request instead.final boolean shouldExcludeLastTransition =i == lastCallbackRequestingState && finalState == postExecutionState;cycleToPath(r, postExecutionState, shouldExcludeLastTransition);}}}
  • 上面的 item.execute 就是 LaunchActivityItem 的 execute
@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,mPendingResults, mPendingNewIntents, mIsForward,mProfilerInfo, client);// 調(diào)用了 handleLaunchActivity 這句話又回到了 ActivityThread中的 handleLaunchActivityclient.handleLaunchActivity(r, pendingActions, null /* customIntent */);Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}
@Overridepublic Activity handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent) {// ... // 得到 activity 對象final Activity a = performLaunchActivity(r, customIntent);if (a != null) {r.createdConfig = new Configuration(mConfiguration);reportSizeConfigurations(r);if (!r.activity.mFinished && pendingActions != null) {pendingActions.setOldState(r.state);pendingActions.setRestoreInstanceState(true);pendingActions.setCallOnPostCreate(true);}} else {// If there was an error, for any reason, tell the activity manager to stop us.try {ActivityManager.getService().finishActivity(r.token, Activity.RESULT_CANCELED, null,Activity.DONT_FINISH_TASK_WITH_ACTIVITY);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}}return a;}
  • performLaunchActivity(r, customIntent);
/** Core implementation of activity launch. */private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {// 通過 ClassLoader 創(chuàng)建 newActivityContextImpl appContext = createBaseContextForActivity(r);Activity activity = null;try {java.lang.ClassLoader cl = appContext.getClassLoader();activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);StrictMode.incrementExpectedActivityCount(activity.getClass());r.intent.setExtrasClassLoader(cl);r.intent.prepareToEnterProcess();if (r.state != null) {r.state.setClassLoader(cl);}} catch (Exception e) {if (!mInstrumentation.onException(activity, e)) {throw new RuntimeException("Unable to instantiate activity " + component+ ": " + e.toString(), e);}}// ... // ...Window window = null;if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {window = r.mPendingRemoveWindow;r.mPendingRemoveWindow = null;r.mPendingRemoveWindowManager = null;}appContext.setOuterContext(activity);// 調(diào)用 activity 的attach 方法activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config,r.referrer, r.voiceInteractor, window, r.configCallback);if (customIntent != null) {activity.mIntent = customIntent;}r.lastNonConfigurationInstances = null;checkAndBlockForNetworkAccess();activity.mStartedActivity = false;int theme = r.activityInfo.getThemeResource();if (theme != 0) {activity.setTheme(theme);}activity.mCalled = false;// 這里面調(diào)用了 mInstrumentation.callActivityOnCreate if (r.isPersistable()) {mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}// ...// ...r.setState(ON_CREATE);// ...// ...}
  • mInstrumentation.callActivityOnCreate
public void callActivityOnCreate(Activity activity, Bundle icicle) {// 調(diào)用了 activity.performCreateprePerformCreate(activity);activity.performCreate(icicle);postPerformCreate(activity);}
  • 在 performLaunchActivity 中調(diào)用了 callActivityOnCreate 后,調(diào)用了 r.setState(ON_CREATE); 方法 記錄了當(dāng)前是 onCreate狀態(tài)(實際上保存的就是int值 1-7)
    然后前面在 TransactionExecuor調(diào)用了 executeCallbacks(transaction); 之后會繼續(xù)調(diào)用
    executeLifecycleState(transaction);

  • executeLifecycleState

private void executeLifecycleState(ClientTransaction transaction) {// ...// Cycle to the state right before the final requested state.// 這里會繼續(xù)根據(jù)state調(diào)用其他的生命周期cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);// Execute the final transition with proper parameters.lifecycleItem.execute(mTransactionHandler, token, mPendingActions);lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);}
  • cycleToPath 然后調(diào)用 performLifecycleSequence()
private void cycleToPath(ActivityClientRecord r, int finish,boolean excludeLastState) {final int start = r.getLifecycleState();log("Cycle from: " + start + " to: " + finish + " excludeLastState:" + excludeLastState);final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);performLifecycleSequence(r, path);}/** Transition the client through previously initialized state sequence. */private void performLifecycleSequence(ActivityClientRecord r, IntArray path) {final int size = path.size();for (int i = 0, state; i < size; i++) {state = path.get(i);log("Transitioning to state: " + state);switch (state) {case ON_CREATE:mTransactionHandler.handleLaunchActivity(r, mPendingActions,null /* customIntent */);break;case ON_START:mTransactionHandler.handleStartActivity(r, mPendingActions);break;case ON_RESUME:mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,r.isForward, "LIFECYCLER_RESUME_ACTIVITY");break;case ON_PAUSE:mTransactionHandler.handlePauseActivity(r.token, false /* finished */,false /* userLeaving */, 0 /* configChanges */, mPendingActions,"LIFECYCLER_PAUSE_ACTIVITY");break;case ON_STOP:mTransactionHandler.handleStopActivity(r.token, false /* show */,0 /* configChanges */, mPendingActions, false /* finalStateRequest */,"LIFECYCLER_STOP_ACTIVITY");break;case ON_DESTROY:mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,0 /* configChanges */, false /* getNonConfigInstance */,"performLifecycleSequence. cycling to:" + path.get(size - 1));break;case ON_RESTART:mTransactionHandler.performRestartActivity(r.token, false /* start */);break;default:throw new IllegalArgumentException("Unexpected lifecycle state: " + state);}}}

其中的mTransactionHandler 就是 ThreadHandler ,又回到了ThreadHandler中繼續(xù)下面的生命周期調(diào)用。

點擊 startActivity() 時的調(diào)用流程

  • 調(diào)用 startActivity(new Intent()); 方法。
    隨著調(diào)用會調(diào)用到 startActivityForResult
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,@Nullable Bundle options) {// 重點代碼 調(diào)用了 Instrumentation 的 execStartActivitymInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);}
  • Instrumentation 的 execStartActivity
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, String resultWho,Intent intent, int requestCode, Bundle options, UserHandle user) {// 重要代碼 調(diào)用了 AMS 的 startActivityAsUser 方法int result = ActivityManager.getService().startActivityAsUser(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, resultWho,requestCode, 0, null, options, user.getIdentifier());}
  • AMS 的 startActivityAsUser 方法
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,boolean validateIncomingUser) {enforceNotIsolatedCaller("startActivity");userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");// 這里面保存了一些信息 比如熟悉的 requestCode userId 等等 // 執(zhí)行的 execute 是調(diào)用到了 ActivityStarter 的 execute() 方法return mActivityStartController.obtainStarter(intent, "startActivityAsUser").setCaller(caller).setCallingPackage(callingPackage).setResolvedType(resolvedType).setResultTo(resultTo).setResultWho(resultWho).setRequestCode(requestCode).setStartFlags(startFlags).setProfilerInfo(profilerInfo).setActivityOptions(bOptions).setMayWait(userId).execute();}
  • ActivityStarter 的 execute() 方法
int execute() {try {// TODO(b/64750076): Look into passing request directly to these methods to allow// 上面?zhèn)鬟M(jìn)來的默認(rèn)是 true 所以后面調(diào)用的是 startActivityMayWaitif (mRequest.mayWait) {return startActivityMayWait(mRequest.caller, mRequest.callingUid,mRequest.callingPackage, mRequest.intent, mRequest.resolvedType,mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,mRequest.inTask, mRequest.reason,mRequest.allowPendingRemoteAnimationRegistryLookup);} else {return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo,mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,mRequest.resultWho, mRequest.requestCode, mRequest.callingPid,mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid,mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions,mRequest.ignoreTargetSecurity, mRequest.componentSpecified,mRequest.outActivity, mRequest.inTask, mRequest.reason,mRequest.allowPendingRemoteAnimationRegistryLookup);}} finally {onExecutionComplete();}}
  • ActivityStarter 的 startActivityMayWait() 方法
private int startActivityMayWait(IApplicationThread caller, int callingUid,String callingPackage, Intent intent, String resolvedType,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode, int startFlags,ProfilerInfo profilerInfo, WaitResult outResult,Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,int userId, TaskRecord inTask, String reason,boolean allowPendingRemoteAnimationRegistryLookup) {// ... 重要代碼int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,allowPendingRemoteAnimationRegistryLookup);}
  • ActivityStarter 的 startActivity() 方法
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,// .... // 調(diào)用了重載的 startActivity mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,inTask, allowPendingRemoteAnimationRegistryLookup);if (outActivity != null) {// mLastStartActivityRecord[0] is set in the call to startActivity above.outActivity[0] = mLastStartActivityRecord[0];}return getExternalResult(mLastStartActivityResult);}
  • ActivityStarter 的 startActivity() 方法
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,String callingPackage, int realCallingPid, int realCallingUid, int startFlags,SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,ActivityRecord[] outActivity, TaskRecord inTask, String reason,boolean allowPendingRemoteAnimationRegistryLookup) {// ...// ...// 再一次調(diào)用了重載的方法return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,true /* doResume */, checkedOptions, inTask, outActivity);}
  • ActivityStarter 的 startActivity() 方法
private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {int result = START_CANCELED;try {mService.mWindowManager.deferSurfaceLayout();// 調(diào)用了 startActivityUnchecked 方法result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, outActivity);} finally {// ...mService.mWindowManager.continueSurfaceLayout();}postStartActivityProcessing(r, result, mTargetStack);return result;}
  • startActivityUnchecked() 方法
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {// ...// 調(diào)用到了 ActivityStackSupervisor 中的 resumeFocusedStackTopActivityLockedmSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,mOptions);mOptions);// ... }
  • ActivityStackSupervisor 中的 resumeFocusedStackTopActivityLocked
boolean resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {if (!readyToResume()) {return false;}if (targetStack != null && isFocusedStack(targetStack)) {return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);}final ActivityRecord r = mFocusedStack.topRunningActivityLocked();if (r == null || !r.isState(RESUMED)) {mFocusedStack.resumeTopActivityUncheckedLocked(null, null);} else if (r.isState(RESUMED)) {// Kick off any lingering app transitions form the MoveTaskToFront operation.mFocusedStack.executeAppTransition(targetOptions);}return false;}
  • mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {if (mStackSupervisor.inResumeTopActivity) {// Don't even start recursing.return false;}boolean result = false;try {// Protect against recursion.mStackSupervisor.inResumeTopActivity = true;// 調(diào)用 resumeTopActivityInnerLocked result = resumeTopActivityInnerLocked(prev, options);final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);if (next == null || !next.canTurnScreenOn()) {checkReadyForSleep();}} finally {mStackSupervisor.inResumeTopActivity = false;}return result;}

經(jīng)過一些列的調(diào)用會走到 ActivityStachSupervisor 中下面的方法

  • startSpecificActivityLocked
void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {// Is this activity's application already running?ProcessRecord app = mService.getProcessRecordLocked(r.processName,r.info.applicationInfo.uid, true);getLaunchTimeTracker().setLaunchTime(r);// 先判斷進(jìn)程 是否存在 如果進(jìn)程存在則調(diào)用 realStartActivityLockedif (app != null && app.thread != null) {try {realStartActivityLocked(r, app, andResume, checkConfig);return;}}// 如果進(jìn)程不存在則通過 AMS 去開啟進(jìn)程創(chuàng)建流程mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,"activity", r.intent.getComponent(), false, false, true);}
  • realStartActivityLocked()
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {mService.getLifecycleManager().scheduleTransaction(clientTransaction);} void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();transaction.schedule();if (!(client instanceof Binder)) {// If client is not an instance of Binder - it's a remote call and at this point it is// safe to recycle the object. All objects used for local calls will be recycled after// the transaction is executed on client in ActivityThread.transaction.recycle();}}

ClientTransaction 的 schedule();

private IApplicationThread mClient;public void schedule() throws RemoteException {// 這里實際上調(diào)用到了當(dāng)前客戶端的 ApplicationThread 的 scheduleTransaction()mClient.scheduleTransaction(this);}
  • scheduleTransaction()
@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {ActivityThread.this.scheduleTransaction(transaction);}

ActivityThread.this 中 ActivityThread 并沒有重寫 scheduleTransaction 所以調(diào)用的是其父類的ClientTransactionHandler 的 scheduleTransaction() 方法

void scheduleTransaction(ClientTransaction transaction) {transaction.preExecute(this);sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}

發(fā)送了 EXECUTE_TRANSACTION 消息,接收消息在 ActivityThread 中的 handleMessage()

public void handleMessage(Message msg) {switch (msg.what) {case EXECUTE_TRANSACTION:final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);if (isSystem()) {// Client transactions inside system process are recycled on the client side// instead of ClientLifecycleManager to avoid being cleared before this// message is handled.transaction.recycle();}// TODO(lifecycler): Recycle locally scheduled transactions.break;} }

// 執(zhí)行了 LaunchActivityItem 的 execute LaunchActivityItemClientTransactionItem

public void execute(ClientTransaction transaction) {
// 其內(nèi)部調(diào)用了 executeCallbacks
// 該方法內(nèi)執(zhí)行了 LaunchActivityItem 的 execute
executeCallbacks(transaction);
}

@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,mPendingResults, mPendingNewIntents, mIsForward,mProfilerInfo, client);// client 是 ClientTransactionHandler 它的實現(xiàn)類是 ActivityThreadclient.handleLaunchActivity(r, pendingActions, null /* customIntent */);Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}

所以接下來就到了 ActivityThread 中的 handleLaunchActivity 流程,啟動Activity 執(zhí)行生命周期

問題: 為什么啟動時會先調(diào)用棧頂activity的onPause()

  • resumeTopActivityInnerLocked
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {// startPausingLocked 先讓棧頂?shù)腶ctivity去onPause 然后在去啟動新的activity// 所以當(dāng)啟動一個新的activity的時候會先讓頂部activity onPause 雖然可見但是已經(jīng)失去焦點// 內(nèi)部 pause 原理也是通過發(fā)送 Handler 然后出發(fā) state 的改變回調(diào)if (mResumedActivity != null) {if (DEBUG_STATES) Slog.d(TAG_STATES,"resumeTopActivityLocked: Pausing " + mResumedActivity);pausing |= startPausingLocked(userLeaving, false, next, false);}// ... // 最后調(diào)用了 startSpecificActivityLocked 去啟動 activitymStackSupervisor.startSpecificActivityLocked(next, true, false);}
  • startSpecificActivityLocked()
void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {// Is this activity's application already running?ProcessRecord app = mService.getProcessRecordLocked(r.processName,r.info.applicationInfo.uid, true);getLaunchTimeTracker().setLaunchTime(r);if (app != null && app.thread != null) {try {if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0|| !"android".equals(r.info.packageName)) {// Don't add this if it is a platform component that is marked// to run in multiple processes, because this is actually// part of the framework so doesn't make sense to track as a// separate apk in the process.app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,mService.mProcessStats);}// real startrealStartActivityLocked(r, app, andResume, checkConfig);return;} catch (RemoteException e) {Slog.w(TAG, "Exception when starting activity "+ r.intent.getComponent().flattenToShortString(), e);}// If a dead object exception was thrown -- fall through to// restart the application.}mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,"activity", r.intent.getComponent(), false, false, true);}
  • realStartActivityLocked
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {// ...clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,r.persistentState, results, newIntents, mService.isNextTransitionForward(),profilerInfo));// Set desired final state.final ActivityLifecycleItem lifecycleItem;if (andResume) {lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());} else {lifecycleItem = PauseActivityItem.obtain();}// 設(shè)置生命周期的狀態(tài)clientTransaction.setLifecycleStateRequest(lifecycleItem);// 執(zhí)行生命周期的調(diào)用mService.getLifecycleManager().scheduleTransaction(clientTransaction);// ... }
  • mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    下面的代碼就和最開始 app啟動的activity啟動差不多了
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();transaction.schedule();if (!(client instanceof Binder)) {// If client is not an instance of Binder - it's a remote call and at this point it is// safe to recycle the object. All objects used for local calls will be recycled after// the transaction is executed on client in ActivityThread.transaction.recycle();}}
  • 會調(diào)用到 scheduleTransaction
void scheduleTransaction(ClientTransaction transaction) {transaction.preExecute(this);sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}
  • 對應(yīng) handler 中
case EXECUTE_TRANSACTION:final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);if (isSystem()) {// Client transactions inside system process are recycled on the client side// instead of ClientLifecycleManager to avoid being cleared before this// message is handled.transaction.recycle();}
  • TransactionExecutor 中的 execute 方法。
public void execute(ClientTransaction transaction) {final IBinder token = transaction.getActivityToken();// 指定 callbacksexecuteCallbacks(transaction);executeLifecycleState(transaction);mPendingActions.clear();log("End resolving transaction");}
  • 然后執(zhí)行executeCallbacks 中的 item.execute(mTransactionHandler, token, mPendingActions);
public void executeCallbacks(ClientTransaction transaction) {// ... // 執(zhí)行了 LaunchActivityItem 的 execute LaunchActivityItemClientTransactionItemitem.execute(mTransactionHandler, token, mPendingActions);item.postExecute(mTransactionHandler, token, mPendingActions);if (r == null) {// Launch activity request will create an activity record.r = mTransactionHandler.getActivityClient(token);}if (postExecutionState != UNDEFINED && r != null) {// Skip the very last transition and perform it by explicit state request instead.final boolean shouldExcludeLastTransition =i == lastCallbackRequestingState && finalState == postExecutionState;// 通過 cycleToPath 調(diào)用后面的生命周期cycleToPath(r, postExecutionState, shouldExcludeLastTransition);}// ...}
  • LaunchActivityItem 的 execute
@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,mPendingResults, mPendingNewIntents, mIsForward,mProfilerInfo, client);// 最終調(diào)用回了 ActivityThread 中的 handleLaunchActivityclient.handleLaunchActivity(r, pendingActions, null /* customIntent */);Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}
  • 接下來 ActivityThread 中的 handleLaunchActivity 后就通過調(diào)用 mInstrumentation.newActivity進(jìn)行創(chuàng)建, activity的attach onCreate方法等進(jìn)行activity生命周期的開始。下面就不說了跟上面都一樣了。

問題:為什么requestWindowFeature(Window.FEATURE_NO_TITLE);要在setContentView()之前.

  • 我們看一下setContentView的源碼:在 installDecor() 的時候。
@Overridepublic void setContentView(int layoutResID) {if (mContentParent == null) {// 創(chuàng)建DecorinstallDecor();} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {mContentParent.removeAllViews();}if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {// ...} else {mLayoutInflater.inflate(layoutResID, mContentParent);}// ...}
  • 在 installDecor(); 中
private void installDecor() {mForceDecorInstall = false;if (mDecor == null) {// 如果是null new Decor // 當(dāng) new Decor()的時候需要傳入 FeatureId 所以要在之前設(shè)置好才會能拿到用戶自己設(shè)置的值。源碼我就不貼出來了mDecor = generateDecor(-1);// ...} else {mDecor.setWindow(this);}if (mContentParent == null) {// 這里面會獲取 Feature 的信息mContentParent = generateLayout(mDecor);// Set up decor part of UI to ignore fitsSystemWindows if appropriate.mDecor.makeOptionalFitsSystemWindows();final DecorContentParent decorContentParent = (DecorContentParent) mDecor.findViewById(R.id.decor_content_parent);if (decorContentParent != null) {mDecorContentParent = decorContentParent;mDecorContentParent.setWindowCallback(getCallback());if (mDecorContentParent.getTitle() == null) {mDecorContentParent.setWindowTitle(mTitle);}final int localFeatures = getLocalFeatures();for (int i = 0; i < FEATURE_MAX; i++) {if ((localFeatures & (1 << i)) != 0) {mDecorContentParent.initFeature(i);}}mDecorContentParent.setUiOptions(mUiOptions);if ((mResourcesSetFlags & FLAG_RESOURCE_SET_ICON) != 0 ||(mIconRes != 0 && !mDecorContentParent.hasIcon())) {mDecorContentParent.setIcon(mIconRes);} else if ((mResourcesSetFlags & FLAG_RESOURCE_SET_ICON) == 0 &&mIconRes == 0 && !mDecorContentParent.hasIcon()) {mDecorContentParent.setIcon(getContext().getPackageManager().getDefaultActivityIcon());mResourcesSetFlags |= FLAG_RESOURCE_SET_ICON_FALLBACK;}if ((mResourcesSetFlags & FLAG_RESOURCE_SET_LOGO) != 0 ||(mLogoRes != 0 && !mDecorContentParent.hasLogo())) {mDecorContentParent.setLogo(mLogoRes);}PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false);if (!isDestroyed() && (st == null || st.menu == null) && !mIsStartingWindow) {invalidatePanelMenu(FEATURE_ACTION_BAR);}} else {mTitleView = findViewById(R.id.title);if (mTitleView != null) {if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) {final View titleContainer = findViewById(R.id.title_container);if (titleContainer != null) {titleContainer.setVisibility(View.GONE);} else {mTitleView.setVisibility(View.GONE);}mContentParent.setForeground(null);} else {mTitleView.setText(mTitle);}}}if (mDecor.getBackground() == null && mBackgroundFallbackResource != 0) {mDecor.setBackgroundFallback(mBackgroundFallbackResource);}// 判斷 sFeature 的值 if (hasFeature(FEATURE_ACTIVITY_TRANSITIONS)) {if (mTransitionManager == null) {final int transitionRes = getWindowStyle().getResourceId(R.styleable.Window_windowContentTransitionManager,0);if (transitionRes != 0) {final TransitionInflater inflater = TransitionInflater.from(getContext());mTransitionManager = inflater.inflateTransitionManager(transitionRes,mContentParent);} else {mTransitionManager = new TransitionManager();}}mEnterTransition = getTransition(mEnterTransition, null,R.styleable.Window_windowEnterTransition);mReturnTransition = getTransition(mReturnTransition, USE_DEFAULT_TRANSITION,R.styleable.Window_windowReturnTransition);mExitTransition = getTransition(mExitTransition, null,R.styleable.Window_windowExitTransition);mReenterTransition = getTransition(mReenterTransition, USE_DEFAULT_TRANSITION,R.styleable.Window_windowReenterTransition);mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition, null,R.styleable.Window_windowSharedElementEnterTransition);mSharedElementReturnTransition = getTransition(mSharedElementReturnTransition,USE_DEFAULT_TRANSITION,R.styleable.Window_windowSharedElementReturnTransition);mSharedElementExitTransition = getTransition(mSharedElementExitTransition, null,R.styleable.Window_windowSharedElementExitTransition);mSharedElementReenterTransition = getTransition(mSharedElementReenterTransition,USE_DEFAULT_TRANSITION,R.styleable.Window_windowSharedElementReenterTransition);if (mAllowEnterTransitionOverlap == null) {mAllowEnterTransitionOverlap = getWindowStyle().getBoolean(R.styleable.Window_windowAllowEnterTransitionOverlap, true);}if (mAllowReturnTransitionOverlap == null) {mAllowReturnTransitionOverlap = getWindowStyle().getBoolean(R.styleable.Window_windowAllowReturnTransitionOverlap, true);}if (mBackgroundFadeDurationMillis < 0) {mBackgroundFadeDurationMillis = getWindowStyle().getInteger(R.styleable.Window_windowTransitionBackgroundFadeDuration,DEFAULT_BACKGROUND_FADE_DURATION_MS);}if (mSharedElementsUseOverlay == null) {mSharedElementsUseOverlay = getWindowStyle().getBoolean(R.styleable.Window_windowSharedElementsUseOverlay, true);}}}}

所以需要在setContentView之前設(shè)置才會生效。

總結(jié)

以上是生活随笔為你收集整理的Android Application创建到Activity启动(launcher启动和startActivity启动)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产区精品区 | 国产免费不卡 | 波多野结衣视频一区二区三区 | 九九热在线免费观看 | 97人人看 | 九九色网 | 黄色免费国产 | 在线观看你懂的网站 | 91av在线免费观看 | 欧美激情精品久久久久久免费印度 | 丁香五月网久久综合 | 麻豆91精品91久久久 | 91成熟丰满女人少妇 | 五月婷亚洲 | 色播激情五月 | 在线观看中文字幕一区 | 香蕉久久久久久久 | 日韩城人在线 | 国产男女免费完整视频 | 五月婷社区 | 免费在线黄色av | 欧美成年黄网站色视频 | 欧美夫妻生活视频 | 欧美性猛片 | 日日干视频 | 国产精品久久麻豆 | 伊人精品在线 | 一区二区三区精品在线视频 | 91在线麻豆| 天天操夜夜干 | 亚洲黄色在线 | 四虎5151久久欧美毛片 | 五月婷婷在线观看视频 | 亚洲国产中文字幕 | 日韩高清 一区 | 亚洲资源在线网 | 国产高清免费在线观看 | 日韩高清在线观看 | 成人亚洲欧美 | 国产精品手机视频 | 国产主播99 | 国产精品入口66mio女同 | 国产亚洲欧美一区 | 麻豆91视频 | 在线免费中文字幕 | 狠狠网 | 欧美日韩国产精品一区二区三区 | 国产探花在线看 | 黄色av电影在线观看 | 国产精品白浆 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 热久在线| 久久激情视频网 | 日韩免费专区 | 91精品国产欧美一区二区成人 | 久久久免费高清视频 | 97成人精品视频在线观看 | 一区在线播放 | 三级毛片视频 | 精品久久亚洲 | 天天操综合网 | 日日夜操 | 成人影片在线免费观看 | 久热色超碰 | 国产精品久久一区二区三区不卡 | 欧美亚洲一区二区在线 | 免费一级黄色 | 992tv成人免费看片 | 在线视频一区观看 | 天天草夜夜 | 中文字幕在线免费看线人 | 婷婷在线观看视频 | 黄色三级免费看 | 激情六月婷婷久久 | 中文字幕资源网在线观看 | 国产精品国产亚洲精品看不卡15 | 免费a网站 | 成人一区不卡 | 久久精品亚洲一区二区三区观看模式 | 日韩三级精品 | 国语对白少妇爽91 | 深夜免费福利视频 | 国产精久久久久久妇女av | 蜜臀av性久久久久av蜜臀三区 | 亚洲高清视频在线播放 | 久久成人午夜 | 在线观看麻豆av | 手机av网站 | 日本久久高清视频 | 99r国产精品| 日韩欧美一区二区三区视频 | 中文字幕在线看视频国产中文版 | 超碰在线免费福利 | 欧美日韩裸体免费视频 | 麻豆视频在线看 | 婷婷色在线播放 | 欧美色一色 | 久久久久免费精品国产小说色大师 | 久久综合狠狠综合久久狠狠色综合 | 精品国产一区二区三区噜噜噜 | 亚洲专区中文字幕 | 日韩在线中文字幕视频 | 欧美日韩久久 | 五月天最新网址 | 92国产精品久久久久首页 | 中文字幕在线网址 | 精品国产乱码久久久久久1区2匹 | 1024在线看片 | 99热播精品| 在线观看亚洲免费视频 | 九九九九九九精品任你躁 | 中文字幕中文中文字幕 | 国产精品原创 | 中文字幕在线日亚洲9 | 亚洲涩涩网站 | 国产亚洲资源 | 国产精品欧美久久久久天天影视 | 国产精品国内免费一区二区三区 | 激情小说久久 | 欧美国产日韩久久 | 日韩精品大片 | 天天插综合 | 粉嫩aⅴ一区二区三区 | 国产免费午夜 | 91九色国产 | 婷婷看片 | 日韩成人精品一区二区 | 西西大胆啪啪 | 天天摸天天操天天舔 | www色片 | 日韩在线大片 | 国产精品一区二区av | 中文字幕乱码电影 | 成人黄色在线 | 亚洲欧美视频一区二区三区 | 久爱综合| 久久久五月天 | 蜜臀久久99静品久久久久久 | 绯色av一区 | 中文字幕在线久一本久 | www.久久久精品 | 超碰国产在线播放 | 久久99这里只有精品 | 日韩av成人在线观看 | 91av原创 | 国产精品色在线 | 黄色影院在线免费观看 | 天天操夜夜想 | 香蕉视频在线观看免费 | 午夜精品久久久久久久久久久久久久 | 夜夜躁日日躁狠狠躁 | 久久精品一二三 | 欧美色插| 久久系列 | 97av影院 | 九九热精品视频在线播放 | 国产亚洲欧美精品久久久久久 | 国产精品一码二码三码在线 | 欧美精品久久久久久久 | 日韩| 国产又粗又猛又黄又爽 | 四虎影视精品成人 | 久久久精品网 | 欧美一区二区免费在线观看 | 免费激情在线电影 | 成人av资源站 | 久久久综合精品 | 久久精彩 | 正在播放五月婷婷狠狠干 | av黄色国产| 日本中文字幕在线播放 | 欧美超碰在线 | www.亚洲视频.com | 一区二区亚洲精品 | 欧美成人va| 久久欧美在线电影 | 91麻豆精品国产午夜天堂 | 黄色录像av | 久久久伊人网 | 免费视频在线观看网站 | 999久久国产 | 免费a网站 | 免费在线观看不卡av | 人人干在线 | 黄色亚洲片 | 国产分类视频 | 日本精品视频在线 | 激情五月婷婷综合网 | 中文字幕一区二区三区在线观看 | 大荫蒂欧美视频另类xxxx | 欧美日韩精品影院 | 欧美天堂影院 | 国产 在线观看 | 中文字幕高清在线播放 | 国产玖玖在线 | 久久综合狠狠综合 | 在线91av| 狠狠的干狠狠的操 | 欧美日韩在线第一页 | 亚洲精品视频二区 | 麻豆观看| 国产精品国产三级国产aⅴ9色 | 97精产国品一二三产区在线 | 少妇bbbb揉bbbb日本 | 亚洲精品白浆高清久久久久久 | 欧美精品一区二区三区一线天视频 | 麻豆精品视频在线观看免费 | 亚洲一级黄色av | 精品在线视频观看 | 五月宗合网 | 在线观看中文字幕dvd播放 | 精品久久久久一区二区国产 | 日本在线观看中文字幕 | 久久福利剧场 | 久久一本综合 | 色久综合 | 久久久久久久久毛片 | 天天射天天 | 亚洲砖区区免费 | www亚洲一区 | 天天做天天爱天天综合网 | 免费观看www7722午夜电影 | www久草| 欧美激情在线看 | 国产精品美女免费 | 久久久久成人免费 | 国产在线观看地址 | 在线观看免费版高清版 | 九九亚洲精品 | 成人av一区二区三区 | 国产五码一区 | 午夜视频久久久 | 99久久影院 | 在线三级中文 | 日韩精品最新在线观看 | 亚洲精品国产精品国自产 | 精品麻豆入口免费 | 五月天婷亚洲天综合网精品偷 | 亚洲va欧美va人人爽春色影视 | 草在线视频 | 久久视讯 | 国产一区视频导航 | 久久久久久97三级 | 久久人人爽人人爽 | 久久国产午夜精品理论片最新版本 | 中文在线字幕观看电影 | 91精品国产成人www | 久久国产精品成人免费浪潮 | 97精品一区 | 91激情| 91视频在线国产 | 国产精品久久久久久电影 | 久久国内免费视频 | 日韩天堂在线观看 | 免费看片网页 | 五月天久久狠狠 | 碰天天操天天 | 国产人成精品一区二区三 | 久久99国产精品自在自在app | 久草在线视频免费资源观看 | 国产一性一爱一乱一交 | 成人在线中文字幕 | 久草在线91| 国产精品久久久久久久久久久久午 | 日韩影视大全 | 激情欧美一区二区三区 | 精品日韩在线一区 | 丁香花在线观看免费完整版视频 | 国内精自线一二区永久 | 456免费视频 | 国产不卡av在线播放 | 99热日本| 天天摸天天干天天操天天射 | 91国内在线视频 | 久久99日韩| 九九热视频在线 | 国产成人三级 | 精品亚洲一区二区 | 在线视频久久 | 日日碰狠狠添天天爽超碰97久久 | 久久久久五月天 | 亚洲1级片| 天天干天天玩天天操 | 婷婷久久丁香 | 日韩天堂在线观看 | 国产精品一区二区白浆 | 久久私人影院 | 超碰97人人射妻 | 天天色天天骑天天射 | 美女久久久久久久 | 久久精品亚洲精品国产欧美 | 99热 精品在线 | 国产精品麻豆三级一区视频 | 国内精品久久久久影院优 | 亚洲最大在线视频 | 中文字幕国产视频 | 日本中文字幕网址 | 五月天色丁香 | 成人中文字幕在线 | av电影免费观看 | 亚洲成人资源 | 日韩久久视频 | 97超碰网| 国外调教视频网站 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 中文字幕在线成人 | 久久婷婷亚洲 | 91精品久久久久久久91蜜桃 | 日本在线中文 | 精品国产乱码久久久久久浪潮 | 日日操天天操夜夜操 | 2019天天干天天色 | 玖操| 国偷自产视频一区二区久 | www.人人草| 片网址| 91九色最新 | 高潮久久久| 69国产精品视频 | 六月天色婷婷 | 国产精品九九热 | 中文字幕xxxx| 色多多在线观看 | 久久久精品福利视频 | 狠狠狠狠狠干 | 亚洲人成在线电影 | 黄色特一级 | 国产99久久精品一区二区永久免费 | 日本免费久久高清视频 | www.com久久 | 三级a视频| 日韩在线电影 | 一区二区三区在线免费观看视频 | 99久久久国产精品免费观看 | 国产精品高潮呻吟久久av无 | 三级黄色片在线观看 | 日本成址在线观看 | 亚洲精品国产精品久久99 | 麻豆果冻剧传媒在线播放 | 国产第一页精品 | av国产网站| 狠狠成人 | 最新久久久 | 91免费黄视频 | 欧美va天堂va视频va在线 | 欧美一级久久久久 | 在线探花| 国产小视频免费在线网址 | 亚洲国产剧情av | 日韩专区av | 欧美日韩3p | 在线性视频日韩欧美 | 久久久久久久久精 | www.91成人| 久久99国产综合精品免费 | av一级网站 | 手机在线永久免费观看av片 | 中文字幕乱码在线播放 | 亚洲精品小视频在线观看 | 9999在线观看 | 久久午夜电影网 | 日韩一区二区三区免费视频 | av在线观| www激情com| 亚洲一区二区三区四区在线视频 | 天天天天爽 | 亚洲综合一区二区精品导航 | 99热 精品在线 | 日韩色中色 | 午夜精品成人一区二区三区 | 久久国产精品网站 | 久久精品一区二区三区视频 | 在线精品在线 | 成人av av在线 | 国产精品1区 | 超碰99在线 | 久久午夜剧场 | 久久免费视频这里只有精品 | 91精品啪啪 | 久久久久北条麻妃免费看 | 99re国产 | 日韩精品在线免费观看 | 日韩| 国模一二三区 | 91精品久久久久久粉嫩 | 久久综合九色综合欧美就去吻 | 99精品国产在热久久 | 成人在线观看影院 | 日韩av在线不卡 | 最近免费中文字幕大全高清10 | 在线观看成人av | 天天操天天弄 | 国产亚洲精品久久网站 | 国产18精品乱码免费看 | 欧美天天综合网 | 在线观看国产永久免费视频 | 色就是色综合 | 丁香高清视频在线看看 | 国产高清视频在线播放 | 国内精品久久久久影院一蜜桃 | 国产日韩欧美自拍 | 日韩三级中文字幕 | 美女视频久久 | 丰满少妇一级片 | 国产免费亚洲 | 一二区精品 | 九九视频免费在线观看 | 免费91在线| 午夜精品一区二区三区可下载 | 日韩中文在线视频 | 久久免费一级片 | 日本久久免费视频 | av天天草| 又黄又爽又无遮挡免费的网站 | 日韩欧美视频一区 | 日韩精品无码一区二区三区 | 国产乱对白刺激视频不卡 | www.久久久.com | 国产黄免费在线观看 | 999国产在线| 99国产视频 | 久久日韩精品 | 久久免费高清 | 1024手机基地在线观看 | 久久激五月天综合精品 | 精品视频在线播放 | 中日韩免费视频 | www.亚洲| 草久久影院 | 久久久久成人精品 | 综合久久久久久久久 | 日本在线观看黄色 | 天天激情| 91你懂的 | 国产裸体视频网站 | adn—256中文在线观看 | 国产免费久久久久 | 天天射天天色天天干 | 91视频高清免费 | 亚洲精品在线免费观看视频 | 欧美精品在线一区 | 国内精品在线观看视频 | 日韩av中文字幕在线 | 不卡视频一区二区三区 | 国内毛片毛片 | 免费成人在线视频网站 | 午夜视频一区二区三区 | 色综合久久久久网 | 能在线观看的日韩av | 国产免费久久久久 | 久久激情小说 | 日本中出在线观看 | 国产网站色 | 美女网站在线看 | 欧美日韩一区二区视频在线观看 | 在线中文字幕播放 | 一区二区三区日韩在线观看 | 操久久免费视频 | 欧美久久久久久久久久久久久 | 91看片看淫黄大片 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久免费视频一区 | 国产99久久久国产精品免费二区 | 综合久久久久 | 久久www免费视频 | 国产在线视频一区二区 | 国产精品成人久久 | 成人日韩av| 国产污视频在线观看 | 日日婷婷夜日日天干 | 欧美成人h版在线观看 | 久久久久综合视频 | 开心婷婷色 | 精品国产一区二区三区久久久蜜月 | 在线视频 国产 日韩 | 91激情视频在线 | 婷婷伊人五月天 | 久久九九网站 | 国产精选在线观看 | 久久久一本精品99久久精品 | 免费视频一级片 | 91传媒视频在线观看 | 国产成人性色生活片 | 亚洲国产免费网站 | 日韩视频中文 | 天天干,狠狠干 | 69热国产视频 | 午夜精品av| 久久免费黄色大片 | 国产又粗又猛又黄视频 | 人人爽人人爽人人 | 亚洲免费永久精品国产 | 精品影院一区二区久久久 | 美女久久视频 | 亚洲资源视频 | 久久精品中文字幕 | av在线免费观看网站 | 国产成人精品综合 | 91视频麻豆 | 免费看的黄色片 | 精品你懂的 | 亚洲激情p | 一区二区三区在线观看 | 国产一级在线观看视频 | 粉嫩av一区二区三区免费 | 国产又粗又猛又色又黄视频 | 日韩免费在线观看视频 | 日韩视频一| 一级黄色在线视频 | 毛片1000部免费看 | 九九日韩 | 美女视频免费一区二区 | 最新av网址在线观看 | 久久久久久久久久久综合 | 人人爽人人爱 | 国产高清视频在线 | 激情av综合 | 中文字幕色站 | 久久av在线播放 | 久久精品视频播放 | 日韩综合第一页 | 夜夜躁狠狠躁日日躁 | 99视频网站 | 国产视频一二区 | 美女久久久久久久 | www日韩在线 | 欧美视频网址 | 91精品91| 中文字幕国产一区二区 | 精品视频www | 国产精品黄色影片导航在线观看 | 日韩精品专区在线影院重磅 | 亚州天堂| 蜜臀一区二区三区精品免费视频 | 狠狠干狠狠色 | 色婷婷一| 日日夜夜天天射 | av女优中文字幕在线观看 | www.色爱 | 96精品在线 | 久久综合久久久久88 | 欧美日韩激情视频8区 | 天天色天| 狠狠综合网 | 免费视频一区 | 在线国产99 | 久久涩视频 | 丁香电影小说免费视频观看 | 一区二区国产精品 | 亚洲妇女av | 日韩偷拍精品 | 国产xxxx| 看全黄大色黄大片 | 久草视频视频在线播放 | 久草视频在线新免费 | 永久免费在线 | 国产午夜不卡 | 日韩久久久久久久久久久久 | 黄色av网站在线观看 | 97香蕉久久国产在线观看 | 色综合久久悠悠 | 日韩成人av在线 | va视频在线 | 日日干日日操 | 2019中文 | 欧美日韩亚洲一 | 久久久国产高清 | 在线播放第一页 | 国产成人福利在线观看 | 91禁在线看 | 国产伦精品一区二区三区高清 | 蜜臀av性久久久久蜜臀av | 亚洲欧美国产精品va在线观看 | 中文免费| 天天操天天操 | 99久久精品免费看国产一区二区三区 | 日韩91精品 | 亚洲国产一区在线观看 | 91福利视频久久久久 | 国产丝袜 | 久久新| 久久久www免费电影网 | 国产综合视频在线观看 | 中文字幕在线播放第一页 | 91天堂在线观看 | 大型av综合网站 | 天天插天天干 | 99色网站 | 免费男女羞羞的视频网站中文字幕 | 久草免费电影 | 国产精品入口久久 | 亚洲视频免费在线看 | 午夜男人影院 | 久久成人国产精品免费软件 | 国产精品美女久久 | 五月天电影免费在线观看一区 | 欧美十八| 操操操干干干 | 99精品影视 | 色伊人网 | 2021av在线 | 99热在线观看免费 | 在线观看亚洲免费视频 | 国产精品中文在线 | 久久婷婷久久 | 亚洲精品美女久久 | 中文字幕在线日亚洲9 | 国产精品 国产精品 | 国产婷婷在线观看 | 久久av影院 | 狠狠狠色丁香婷婷综合久久五月 | 99在线精品免费视频九九视 | 亚洲精品婷婷 | 欧美日韩视频观看 | 免费在线91 | av一级片网站| 日韩午夜剧场 | 成人久久精品 | 五月天婷婷免费视频 | 亚洲网站在线 | 超碰97久久| 日韩理论电影在线观看 | 人人澡澡人人 | 免费三级大片 | 久久综合欧美精品亚洲一区 | 精品久久影院 | 中文在线字幕免费观看 | 久久激情五月激情 | 最新av电影网站 | 日韩免费在线观看视频 | 五月婷婷在线视频观看 | 热久久最新地址 | 欧美色图亚洲图片 | 国产精品 日韩 欧美 | 色综合小说 | 人人澡澡人人 | 成人av免费在线 | 久久看免费视频 | 狠狠黄 | 五月天电影免费在线观看一区 | 中文字幕在线人 | 99久久精品久久亚洲精品 | 国产成人专区 | 国产色小视频 | 亚洲美女精品区人人人人 | 成人亚洲网 | 成人性生交大片免费观看网站 | 99精品久久只有精品 | 黄色三级网站 | 99草在线视频 | 91亚洲网| 国产91学生粉嫩喷水 | 国产最新在线视频 | 国产91在线观看 | 国产96av | 国产真实精品久久二三区 | 美女免费黄网站 | 日韩午夜高清 | 亚洲精品美女在线观看 | 精品久久免费 | av一二三区 | 久久99欧美| 天天干天天搞天天射 | 久久爽久久爽久久av东京爽 | 国产精品18久久久久久不卡孕妇 | 亚洲精品一区二区精华 | 久久精品高清 | 午夜少妇av | 精品久久久久久久久中文字幕 | 国产精品99久久久久人中文网介绍 | 国产丝袜网站 | 91豆花在线观看 | 亚洲狠狠丁香婷婷综合久久久 | 最近中文字幕久久 | 97香蕉视频 | 亚洲精品日韩在线观看 | 午夜免费福利视频 | 91在线播放视频 | 91影视成人 | 精品一区二区三区香蕉蜜桃 | 五月天中文字幕 | 美女中文字幕 | 色综合国产 | 久久久精品电影 | 亚洲最新毛片 | 亚洲精品高清视频 | 国产精品资源在线观看 | 91高清完整版在线观看 | 中文字幕亚洲不卡 | 色综合久久综合网 | 欧美日韩亚洲一 | 精品一区二区精品 | 日韩中文字幕免费在线观看 | 人人添人人澡人人澡人人人爽 | 天天爽天天爽夜夜爽 | www.久久久com | 91麻豆免费视频 | 精品视频999 | 丁香花在线观看视频在线 | 激情五月综合 | 天天做天天射 | 插久久| 亚洲国产精品一区二区久久,亚洲午夜 | av成人亚洲 | 天天草天天草 | 免费在线色视频 | 日韩免费在线网站 | 免费观看久久 | 区一区二区三区中文字幕 | 香蕉在线影院 | 999久久久国产精品 高清av免费观看 | 久久与婷婷 | av播放在线 | 91在线超碰 | 99久久婷婷国产综合精品 | 久久久久亚洲精品成人网小说 | 亚洲精品视频免费在线 | 91精品999 | 亚洲精品欧美成人 | 午夜免费视频网站 | 日韩欧美精选 | 久久99精品国产麻豆宅宅 | 天天曰天天爽 | 日韩欧美视频在线播放 | 精品视频久久久久久 | 美女网站在线看 | 国产一区二区三精品久久久无广告 | 天天色综合三 | 麻豆成人在线观看 | av福利在线 | 日夜夜精品视频 | 日韩天天综合 | 成人在线视频免费 | 国产精品激情偷乱一区二区∴ | 美女久久精品 | 夜又临在线观看 | 97超碰资源 | 久久婷亚洲五月一区天天躁 | 99性视频 | 欧美精品在线视频 | 中文字幕免费观看 | 中文在线免费看视频 | free,性欧美| 免费观看www7722午夜电影 | 91麻豆精品国产91久久久无需广告 | 亚洲激情精品 | 国产高清在线a视频大全 | 久草在线免费在线观看 | 五月天久久激情 | 在线观看视频三级 | 欧美精品久久久久性色 | 国产中文字幕视频在线 | 天天操狠狠操网站 | 99热最新网址 | 狠狠色丁香久久婷婷综 | 有码中文字幕在线观看 | 久久99亚洲热视 | 97看片| 久久美女精品 | 天天摸日日摸人人看 | 国产高清一区二区 | 欧美成人久久 | 国产亚洲激情视频在线 | 色999五月色| 在线免费观看国产 | 婷婷六月天在线 | 亚洲爱视频 | 一区二区三区在线免费播放 | 少妇按摩av | 久久黄色影视 | 国产精品第一页在线 | 91豆花在线 | 午夜手机电影 | 在线观看激情av | 亚洲极色 | 午夜精品久久一牛影视 | 天天弄天天操 | 国精产品999国精产品岳 | 欧美视频一区二 | www.久久久com | 三级小视频在线观看 | 天天操天天摸天天干 | 成人va在线观看 | av黄色大片 | www.99热精品| 天天操天天爽天天干 | 亚洲色综合| 色吧久久 | 婷婷丁香激情网 | 欧美成人按摩 | 一区二区三区在线免费观看 | 日韩黄色在线电影 | 欧美日韩另类视频 | 久久这里只有精品视频首页 | 91视频免费网站 | 久久丁香网 | 亚洲国产激情 | 精品国产一区二区三区四 | 99精品视频免费 | 亚洲成人av在线播放 | 成年人在线观看 | 久久高视频 | 中文字幕999 | 日韩精品免费在线播放 | 久久综合成人网 | 成人中心免费视频 | 青春草视频在线播放 | 中文字幕日韩一区二区三区不卡 | 色在线最新 | 中文字幕电影网 | 玖玖视频精品 | 黄色软件视频大全免费下载 | av免费在线观 | 婷婷丁香社区 | 国产精品激情偷乱一区二区∴ | 久青草电影 | 欧美成人在线免费观看 | 91传媒在线播放 | 日日干影院 | 国产精品刺激对白麻豆99 | 欧美精品二区 | 国产一区在线播放 | 久久久久观看 | 九九久久精品 | 91精品欧美一区二区三区 | 国产91成人在在线播放 | 五月天激情电影 | 国产成人高清 | 丁香色婷| 国产视频在线观看一区 | 亚洲欧美精品在线 | 国产成人一区三区 | 亚洲黄色激情小说 | 精品久久久久久亚洲 | 国内精品免费 | 99性视频 | 午夜电影久久 | 免费观看一级一片 | 国产精品色在线 | 91传媒在线看| 在线观看免费视频 | 成人性生活大片 | 一区二区欧美日韩 | 2019国产精品| 成 人 a v天堂 | 91福利在线观看 | 国产高清免费av | 免费观看www7722午夜电影 | 91片网 | 天天干夜夜 | 伊人五月天.com | 国产精品va最新国产精品视频 | 一区二区三区在线视频观看58 | 狠狠干成人综合网 | 三级av免费看 | 69国产精品视频免费观看 | 色综合亚洲精品激情狠狠 | av免费电影网站 | 久久草网 | av高清不卡 | 成人毛片一区 | 免费在线看成人av | 成人免费在线观看入口 | a视频免费看 | 国产精品久久久久婷婷 | 国产成人在线综合 | 亚洲精品合集 | 日韩在线| 黄在线免费看 | 国产精品一区二区吃奶在线观看 | av中文在线观看 | 久久免费99| 天天躁日日 | 午夜av片| 亚洲,播放 | 午夜精品福利一区二区三区蜜桃 | 中文字幕高清免费日韩视频在线 | 麻豆国产网站 | 在线播放国产一区二区三区 | 久久精久久精 | 亚洲综合欧美激情 | 亚洲丝袜一区 | 2019免费中文字幕 | 国产成人在线综合 | av短片在线观看 | 瑞典xxxx性hd极品| 一区二区精品视频 | 久久老司机精品视频 | 国产三级在线播放 | 婷婷色在线 | 亚洲在线网址 | 91人人爽人人爽人人精88v | 久久婷婷精品视频 | 久久情网 | 福利电影一区二区 | 亚洲国产成人精品在线 | 国产精品久久久久aaaa九色 | 成人h动漫精品一区二 | 毛片.com| 91九色成人 | 亚洲精品国产欧美在线观看 | av在线官网 | 久久综合在线 | 久草视频在线资源 | 亚洲精品高清在线观看 | 日p在线观看 | 天天天干 | 综合色爱 | 99久久er热在这里只有精品66 | 国产高清专区 | 黄色天堂在线观看 | 伊人资源站 | 日韩成人邪恶影片 | 天堂av在线7 | 国产黄在线免费观看 | 国产福利一区二区三区在线观看 | 日韩高清在线不卡 | 一区二区三区动漫 | 超碰在线免费福利 | 午夜av在线电影 | 国产精品21区 | 狠狠操综合网 | 国产97在线看 | 蜜臀久久99精品久久久久久网站 | 久久久婷 | 在线视频日韩精品 | 国产精品黄色影片导航在线观看 | 国产在线播放一区二区三区 | 精品久久久久一区二区国产 | 在线中文日韩 | 国产精品美女久久久 | 精品亚洲免费 | 天天av在线播放 | 日韩婷婷 | 久久免费黄色大片 | 99久热在线精品 | 国产精品一区专区欧美日韩 | 天天操狠狠操网站 | 国产精品婷婷 | 免费麻豆 | 99在线视频网站 | 国产精品黄网站在线观看 | 成人久久精品视频 | 精品视频一区在线观看 | 国产亚洲欧美一区 | 成人午夜精品 | 久久成熟 | 久久综合日 | 黄色录像av| 亚洲 欧美 综合 在线 精品 | 欧美成人h版在线观看 | 人人舔人人爽 | 久久观看 | 中文字幕亚洲高清 | 天堂av在线免费 | 男女拍拍免费视频 | 亚洲中字幕 | 黄色资源网站 | 国产又粗又猛又黄又爽的视频 | 久久精品国亚洲 | 婷婷丁香九月 | 免费观看性生活大片3 | 九九热在线视频 | 五月天综合激情网 | 亚洲女欲精品久久久久久久18 | 欧美精品久久天天躁 | 一二三区高清 | 久久在现 | 国产欧美日韩视频 | 国产在线精品一区二区不卡了 | 狠狠的日日 | 国产首页 | 国产精品青草综合久久久久99 | 国产高清视频免费观看 | 国产福利91精品 | 四虎影视精品永久在线观看 | 欧美日韩性视频在线 | 永久免费观看视频 | 一区二区国产精品 | 99午夜 | 一区二区 精品 | 久草视频手机在线 | 日韩资源在线播放 | 亚洲欧美精品在线 | 国产手机视频 | 毛片激情永久免费 | 99视频国产精品免费观看 | 久久久久久久久久久久久9999 | 在线 视频 一区二区 | 99视频网址 | 免费网站看av片 | 国产免费观看久久 | 91禁在线观看 | av在线日韩 | 色婷婷综合久色 | 片黄色毛片黄色毛片 | 色婷婷福利 | 国产日韩欧美自拍 |