activity是如何加载的

来源:互联网 发布:会计课程 知乎 编辑:程序博客网 时间:2024/05/18 06:20

Context 抽象类的抽象方法:

 

public abstract void startActivity(Intentintent);

 

class ContextImpl extends Context

 @Override

   public void startActivity(Intent intent) {

       if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {

           throw new AndroidRuntimeException(

                    "CallingstartActivity() from outside of an Activity "

                    + " context requiresthe FLAG_ACTIVITY_NEW_TASK flag."

                    + " Is this reallywhat you want?");

       }

       mMainThread.getInstrumentation().execStartActivity(

           getOuterContext(),mMainThread.getApplicationThread(), null,

           (Activity)null, intent, -1);

}

 

mMainThread.getInstrumentation()

    public ActivityResult execStartActivity(

        Context who, IBinder contextThread,IBinder token, Fragment target,

        Intent intent, int requestCode) {

        IApplicationThread whoThread =(IApplicationThread) contextThread;

        if (mActivityMonitors != null) {

            synchronized (mSync) {

                final int N =mActivityMonitors.size();

                for (int i=0; i<N; i++) {

                    final ActivityMonitor am =mActivityMonitors.get(i);

                    if (am.match(who, null,intent)) {

                        am.mHits++;

                        if (am.isBlocking()) {

                            return requestCode>= 0 ? am.getResult() : null;

                        }

                        break;

                    }

                }

            }

        }

        try {

            intent.setAllowFds(false);

            int result =ActivityManagerNative.getDefault()

                .startActivity(whoThread,intent,

                       intent.resolveTypeIfNeeded(who.getContentResolver()),

                        null, 0, token, target!= null ? target.mWho : null,

                        requestCode, false,false, null, null, false);

            checkStartActivityResult(result,intent);

        } catch (RemoteException e) {

        }

        return null;

    }

是怎么调用到activity 中的?

————》activity attach 中:

PolicyManager.makeNewWindow(this); 产生一个window :

public staticWindow makeNewWindow(Context context) {

        return sPolicy.makeNewWindow(context);

    }

private staticfinal IPolicy sPolicy;

 

public WindowmakeNewWindow(Context context);  返回一个window

public WindowmakeNewWindow(Context context) {

        return new PhoneWindow(context);

    }

 

通过PhoneWindow来建立一个window进程。是真正的实例化窗体。

  public PhoneWindow(Context context) {

        super(context);

        mLayoutInflater =LayoutInflater.from(context);使用layout填充。

    }

 

public voidsetContentView(View view) {

        getWindow().setContentView(view);activity在实例化时会实例化有且仅有一个window,即PhoneWindow

        initActionBar();

    }

同样,调用到PhoneWindow

    public void setContentView(View view,ViewGroup.LayoutParams params) {

        if (mContentParent == null) {

            installDecor();

        } else {

            mContentParent.removeAllViews();

        }

        mContentParent.addView(view, params);

        final Callback cb = getCallback();

        if (cb != null &&!isDestroyed()) {

            cb.onContentChanged();

        }

    }

使用ViewGroup根试图,添加view

因此,我们可以这样写:getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.layout));//inflateXML转换成view

WindowManagerService接受的消息发送到context之后发到windowwindow优先发送到输入法窗体。然后发到 rootview . 并且回调activity onkeydown().

使用window可以设置当前activity的一些窗口属性。

 

使用window可以设置当前activity的一些窗口属性。

requestWindowFeature(Window.FEATURE_NO_TITLE);

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    getWindow().setContentView(view, params)

   @Override保存activity的一些状态,系统在回收我们的activity之前会调用。BACKHOME键不会调用此方法。例如有电话来,横竖屏幕切换时会调用。

  protectedvoidonSaveInstanceState(Bundle outState) {

    //TODO Auto-generated method stub

    super.onSaveInstanceState(outState);

    if(outState!=null)

    {

      outState.putBundle(key,value);

      outState.putString(key,value);

    }

  }

@Overrideoncreate之后执行。数据在这恢复。也可在oncreate之中恢复。

  protectedvoidonRestoreInstanceState(Bundle savedInstanceState) {

    //TODO Auto-generated method stub

  super.onRestoreInstanceState(savedInstanceState);

  }

BACKHOME:可以在onpause()保存,在onResume()中恢复。

    requestWindowFeature(Window.FEATURE_NO_TITLE);

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    getWindow().setContentView(view, params)

 

Intent intent =new Intent(MainActivity.this,OthreActivity.class);
  intent.putExtra("name", "value");
  OthreActivity.tv=tv;
  //startActivity(intent);
  startActivityForResult(intent, 0);//表示需要回传数据。请求码0 要求唯一。

OthreActivity 执行完之前,使用传来的intent回传数据
Intent intent=this.getIntent();
  intent.putExtra("name", "value");
  setResult(0, intent);
  finish();
在MainActivity中接收回传的数据
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  if(requestCode==0)
  {
   String value=data.getStringExtra("name");
  }
 }

activity 生命周期: 第一个 root(即根activity)activity onresume 等待用户操作,当看不见,即onpause状态。切换到第二个activity,

activity onresume,才调用第一个activity的onstop,此时按back键又返回到第一个activity,第二个onpause,不可见即onstop,返回第一个

,由于已经创建没有被destroy掉,即调用onrestart-->onstart.注意,这个时候第二个activity看不见的话已经stop了。
注意 :当此进程被kill掉了,将会重新走第一个的oncreate。

反正屏切换时辰activity的生命周期

  1、不设置Activityandroid:configChanges时,切屏会从头调用各个生命周期,切横屏时会履行一次,切竖屏时会履行两次

  2、设置Activityandroid:configChanges="orientation"时,切屏还是会从头调用各个生命周期,切横、竖屏时只会履行一次

  3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会从头调用各个生命周期,只会履行onConfigurationChanged办法

原创粉丝点击