我们在写一个自己的Activity的时候需要注意:

1、都必须extends Activity(或者其子类);

2、必须在方法onCreate中存在一条这样的语句:super.onCreate(也就是调用Activity的onCreate方法),对于super.onCreate方法放的位置要求不是很高,只要被调用了就可以了,super.onCreate主要是加载一些组件。

如下面:

import android.app.Activity;
import android.os.Bundle;

public class TargetActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

setContentView...
}
}

需要引起注意的是:

1、参数Bundle savedInstanceState来自何处?

2、为何super.onCreate(savedInstanceState)语句的缺失会带给应用致命要害。

也许熟悉源码的会发现,其实在Instrumentation类中的方法callActivityOnCreate方法,前面的调用过程略过,主要是在ActivityThread的方法performLaunchActivity中调用了Instrumentation类中的方法callActivityOnCreate方法,继而调用了TargetActivity中的onCreate方法。

步骤:

1、在ActivityThread中的方法performLaunchActivity调用了mInstrumentation.callActivityOnCreate(activity, r.state);

2、Instrumentation类中的方法callActivityOnCreate方法,源码如下:

/**
* Perform calling of an activity's {@link Activity#onCreate} method. The
* default implementation simply calls through to that method.

* @param activity
*            The activity being created.
* @param icicle
*            The previously frozen state (or null) to pass through to
*            onCreate().
*/
public void callActivityOnCreate(Activity activity, Bundle icicle) {
if (mWaitingActivities != null) {

synchronized (mSync) {
final int N = mWaitingActivities.size();
for (int i = 0; i < N; i++) {
final ActivityWaiter aw = mWaitingActivities.get(i);
final Intent intent = aw.intent;

if (intent.filterEquals(activity.getIntent())) {
aw.activity = activity;
mMessageQueue.addIdleHandler(new ActivityGoing(aw));
}
}
}
}
//?????activity引用是TargetActivity对象
activity.performCreate(icicle);

if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i = 0; i < N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);

am.match(activity, activity, activity.getIntent());
}
}
}
}

再次看方法activity.performCreate(icicle),其中的方法是通过activity,这个activity,形如:Activity activity = 子Activity的对象(其实也就是Java中的一种多态形式)。

在Activity类中的方法performCreate(icicle),源码如下:

final void performCreate(Bundle icicle) {

onCreate(icicle);

mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, false);

mFragments.dispatchActivityCreated();
}

注意:在performCreate方法中调用的onCreate方法是TargetActivity中的onCreate方法,那么到此TargetActivity中的方法onCreate方法中的参数Bundle savedInstanceState也就知道来源了,此时,TargetActivity中的方法也就被调用了。

再次看TargetActivity中的方法onCreate:

public class TargetActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

setContentView...方法
}

}

第一件事情便是super.onCreate(savedInstanceState),其实这条语句放在子类中的onCreate方法中的任何位置都可,问题只是super.onCreate(savedInstanceState)必须要被执行,所以,最好也就是放在第一行,看起来比较明确。还有就是调用了setContentView方法。在Activity中的setContentView方法,源码如下:

public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}

与WindowManager、PhoneWindow等等进行联系。

回到super.onCreate(savedInstanceState),来到Activity的onCreate(savedInstanceState)方法,源码如下:

/**
* Called when the activity is starting. This is where most initialization
* should go: calling {@link #setContentView(int)} to inflate the activity's
* UI, using {@link #findViewById} to programmatically interact with widgets
* in the UI, calling
* {@link #managedQuery(android.net.Uri , String[], String, String[], String)}
* to retrieve cursors for data being displayed, etc.

* <p>
* You can call {@link #finish} from within this function, in which case
* onDestroy() will be immediately called without any of the rest of the
* activity lifecycle ({@link #onStart}, {@link #onResume}, {@link #onPause}
* , etc) executing.

* <p>
* <em>Derived classes must call through to the super class's
* implementation of this method.  If they do not, an exception will be
* thrown.</em>
* </p>

* @param savedInstanceState
*            If the activity is being re-initialized after previously being
*            shut down then this Bundle contains the data it most recently
*            supplied in {@link #onSaveInstanceState}. <b><i>Note:
*            Otherwise it is null.</i></b>

* @see #onStart
* @see #onSaveInstanceState
* @see #onRestoreInstanceState
* @see #onPostCreate
*/
protected void onCreate(Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE)
Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
if (mLastNonConfigurationInstances != null) {
mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
}
if (mActivityInfo.parentActivityName != null) {
if (mActionBar == null) {
mEnableDefaultActionBarUp = true;
} else {
mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
}
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments
.restoreAllState(
p,
mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.fragments
: null);
}

mFragments.dispatchCreate();

getApplication().dispatchActivityCreated(this, savedInstanceState);
mCalled = true;
}

在TargetActivity中重写了onCreate方法,而在Activity中的onCreate方法中已经对一些基本的基础进行了操作,如果子类没有super.onCraete方法的调用,会导致子类中的onCreate方法功能不全,从而出现错误。

额外问题:onCreate中的savedInstanceState有何具体作用?具体例子?

在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!,被KILL掉了,,这时候,就需要有种机制,能保存当时的状态,这就是savedInstanceState的作用。

当一个Activity在PAUSE时,被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息(在paused状态时,要被KILLED的时候)。用来保存状态信息的Bundle会同时传给两个method,即onRestoreInstanceState() and onCreate().

示例代码如下:

package com.myandroid.test;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class AndroidTest extends Activity {

private static final String TAG = "MyNewLog";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// If an instance of this activity had previously stopped, we can

// get the original text it started with.

if(null != savedInstanceState)

{

int IntTest = savedInstanceState.getInt("IntTest");

String StrTest = savedInstanceState.getString("StrTest");

Log.e(TAG, "onCreate get the savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);

}

setContentView(R.layout.main);

Log.e(TAG, "onCreate");

}

@Override

public void onSaveInstanceState(Bundle savedInstanceState) {

// Save away the original text, so we still have it if the activity

// needs to be killed while paused.

savedInstanceState.putInt("IntTest", 0);

savedInstanceState.putString("StrTest", "savedInstanceState test");

super.onSaveInstanceState(savedInstanceState);

Log.e(TAG, "onSaveInstanceState");

}

@Override

public void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

int IntTest = savedInstanceState.getInt("IntTest");

String StrTest = savedInstanceState.getString("StrTest");

Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);

}

}

解析Activity中的onCreate方法相关推荐

  1. android oncreate调用,Android app启动activity并调用onCreate()方法时都默默地干了什么?...

    在AndroidManifest.xml文件中的元素中有这么两句: 当写好的应用发布到手机上之后,当双击"APP"应用的图标时,系统会将这个点击时间包装成一个Intent,该Int ...

  2. 【Android】Intent介绍及Intent在Activity中的使用方法

    本篇博文主要介绍Intent的相关概念,以及Intent在Activity中的使用方法. 1.Intent的实现过程 在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部 ...

  3. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  4. java oncreate_Android(java)学习笔记112:Activity中的onCreate()方法分析

    1.onCreate( )方法是android应用程序中最常见的方法之一: 翻译过来就是说,onCreate()函数是在activity初始化的时候调用的,通常情况下,我们需要在onCreate()中 ...

  5. java oncreate_Android(java)学习笔记169:Activity中的onCreate()方法分析

    标签: 1.onCreate( )方法是android应用程序中最常见的方法之一: 翻译过来就是说,onCreate()函数是在activity初始化的时候调用的,通常情况下,我们需要在onCreat ...

  6. Intent介绍及Intent在Activity中的使用方法

    1.Intent的实现过程 在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部的Activity/Service之间的交互. Intent负责对应用中一次操作进行描述, ...

  7. 解析activity之间数据传递方法的详解

    转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Int ...

  8. php addall,深入解析thinkphp中的addAll方法

    原因: 在做中控系统中遇到了一个给用户批量分配角色的问题,刚开始想到的是循环插入,但立马给否定了,循环操作数据库开发者的大忌啊,于是查找手册找到数据写入看到批量操作:addAll(),测试成功,以为万 ...

  9. JDK 8源码解析——String中的intern()方法

    String是最常用的类之一,也许就是太常见了,因此导致经常忽略它存在,即使在观察堆得时候发现String类以及char[]所占的内存比较多的时候,也潜意识的跳过了它们.其实,String类以及cha ...

最新文章

  1. linux下typora安装
  2. 怎么解决tomcat占用8080端口问题图文教程 端口被占用
  3. 单例模式 -- Java
  4. mysql查询cpu使用率100%_数据库CPU使用率100% 排查记
  5. C语言-求字符串长度-strlen()与sizeof()
  6. TCPIP / MTU 和 MSS 的区别和联系
  7. xargs命令和find的-exec
  8. 读取文件卡顿_CPU占用100%,电脑卡顿原来可以这样解决!多任务操作也运行如飞...
  9. 设计师常用网页小图标大全
  10. javascript 笔记--变量
  11. java则么实现md5解密_java的md5解密
  12. 在线可视化布局HTML
  13. 【读书笔记】-最优状态估计 Optimal State Estimation Kalman, H,, and Nonlinear Approaches 【Dan Simon】
  14. 小学计算机课打字游戏,小学信息技术打字游戏教案
  15. Linux系统启动分析
  16. 声呐直线阵正交混频实验(HEU信息与信号处理创新实践项目一)
  17. SView三维轻量化浏览器
  18. Sphnix + Markdown 记笔记之一目了然的搭建过程
  19. 小程序项目:基于微信小程序的科普之家小程序—计算机毕业设计
  20. python设置坐标轴刻度宽度_使用轴网格matplotlib时设置刻度宽度

热门文章

  1. Windows、Linux系统常用CMD命令大全
  2. 基于MFC开发的单文档画图(线段,多线段,矩形,椭圆,多边形),选中,变色,平移,线段长度,区域面积计算
  3. 基于PCF8591芯片的使用
  4. 【C++】set/multiset、map/multimap的使用
  5. OpenGL---GLUT教程(九) GLUT鼠标
  6. Qt使用两组RadioButton,两组之间相互独立
  7. 零输入响应和零状态响应
  8. 意想不到!这个神奇的bug让我加班到深夜
  9. EPC概念、EPC编码、EPC标签
  10. 雷达原理第五版微盘pdf下载_雷达原理(第5版电子信息类精品教材)