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));//inflate将XML转换成view。
WindowManagerService接受的消息发送到context之后发到window,window优先发送到输入法窗体。然后发到 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之前会调用。BACK和HOME键不会调用此方法。例如有电话来,横竖屏幕切换时会调用。
protectedvoidonSaveInstanceState(Bundle outState) {
//TODO Auto-generated method stub
super.onSaveInstanceState(outState);
if(outState!=null)
{
outState.putBundle(key,value);
outState.putString(key,value);
}
}
@Override在oncreate之后执行。数据在这恢复。也可在oncreate之中恢复。
protectedvoidonRestoreInstanceState(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}
BACK和HOME键:可以在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、不设置Activity的android:configChanges时,切屏会从头调用各个生命周期,切横屏时会履行一次,切竖屏时会履行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会从头调用各个生命周期,切横、竖屏时只会履行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会从头调用各个生命周期,只会履行onConfigurationChanged办法
- activity是如何加载的
- Activity是如何加载布局文件的?
- Activity是如何生成一个 view 的
- 深入理解Activity——Activity是如何启动的
- 模块是如何加载到内核的
- java class 是如何加载的
- Hibernate是如何延迟加载的
- Hibernate是如何延迟加载的
- hibernate是如何延迟加载的
- Hibernate是如何延迟加载的
- Hibernate是如何延迟加载的?
- rails 程序是如何加载的
- rails程序是如何加载的
- Nib文件是如何被加载的?
- android是如何加载资源图片的
- android是如何加载资源图片的?
- windows是如何加载程序的
- 探究mybatis 是如何加载配置文件的
- C#垃圾回收Finalize 和Dispose的理解
- Citrus Engine关于创建Tiled Map游戏的小窍门
- metasploit之db_autopwn
- Android 面试知识集2
- c# 网页采集类 (方法)
- activity是如何加载的
- metasploit之db_nmap
- Codeforces 193 Div 2
- YUV420图像格式
- hdu4185(二分图+最大匹配)
- UVA 10061 How many zeros and how many digits?
- 内存分配malloc函数注意事项。
- socket简单例子
- python VS java 摘自http://www.ej38.com/showinfo/Python-209370.html