/**
* Registers a task stack listener with the system.
* This should be called on the main thread.
*/publicvoidregisterTaskStackListener(TaskStackListener listener){if(mIam == null)return;
mTaskStackListeners.add(listener);if(mTaskStackListeners.size()==1){// Register mTaskStackListener to IActivityManager only once if needed.try{
mIam.registerTaskStackListener(mTaskStackListener);}catch(Exception e){
Log.w(TAG,"Failed to call registerTaskStackListener", e);}}}
AM 中调用onActivityForcedResizable()
|-- frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
//收到消息并回调case NOTIFY_FORCED_RESIZABLE_MSG:{synchronized(ActivityManagerService.this){for(int i = mTaskStackListeners.beginBroadcast()-1; i >=0; i--){try{// Make a one-way callback to the listener
mTaskStackListeners.getBroadcastItem(i).onActivityForcedResizable((String) msg.obj, msg.arg1);}catch(RemoteException e){// Handled by the RemoteCallbackList}}
mTaskStackListeners.finishBroadcast();}break;}
voidhandleNonResizableTaskIfNeeded(
TaskRecord task,int preferredStackId,int actualStackId,boolean forceNonResizable){if((!isStackDockedInEffect(actualStackId)&& preferredStackId != DOCKED_STACK_ID)|| task.isHomeTask()){return;}final ActivityRecord topActivity = task.getTopActivity();if(!task.canGoInDockedStack()|| forceNonResizable){// Display a warning toast that we tried to put a non-dockable task in the docked stack.
mService.mHandler.sendEmptyMessage(NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG);// Dismiss docked stack. If task appeared to be in docked stack but is not resizable -// we need to move it to top of fullscreen stack, otherwise it will be covered.moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, actualStackId == DOCKED_STACK_ID);}elseif(topActivity != null && topActivity.isNonResizableOrForced()&&!topActivity.noDisplay){//判断是否需要发送NOTIFY_FORCED_RESIZABLE_MSG
String packageName = topActivity.appInfo.packageName;
mService.mHandler.obtainMessage(NOTIFY_FORCED_RESIZABLE_MSG, task.taskId,0,
packageName).sendToTarget();}}
private Activity parseActivity(Package owner, Resources res,
XmlResourceParser parser,int flags, String[] outError,boolean receiver,boolean hardwareAccelerated)throws XmlPullParserException, IOException {...
a.info.resizeMode = RESIZE_MODE_UNRESIZEABLE;finalboolean appDefault =(owner.applicationInfo.privateFlags
& PRIVATE_FLAG_RESIZEABLE_ACTIVITIES)!=0;// This flag is used to workaround the issue with ignored resizeableActivity param when// either targetSdkVersion is not set at all or <uses-sdk> tag is below <application>// tag in AndroidManifest. If this param was explicitly set to 'false' we need to set// corresponding resizeMode regardless of targetSdkVersion value at this point in time.finalboolean resizeableSetExplicitly
= sa.hasValue(R.styleable.AndroidManifestActivity_resizeableActivity);finalboolean resizeable = sa.getBoolean(
R.styleable.AndroidManifestActivity_resizeableActivity, appDefault);if(resizeable){if(sa.getBoolean(R.styleable.AndroidManifestActivity_supportsPictureInPicture,false)){
a.info.resizeMode = RESIZE_MODE_RESIZEABLE_AND_PIPABLE;}else{
a.info.resizeMode = RESIZE_MODE_RESIZEABLE;}}elseif(owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.N
|| resizeableSetExplicitly){
a.info.resizeMode = RESIZE_MODE_UNRESIZEABLE;}elseif(!a.info.isFixedOrientation()&&(a.info.flags & FLAG_IMMERSIVE)==0){
a.info.resizeMode = RESIZE_MODE_FORCE_RESIZEABLE;}...}