您的位置:首页 > 移动开发 > Android开发

Android心得2.4--四大组件之一--Activity

2012-07-08 07:12 441 查看
1.Android四大组件之一----Activity:

情况一:点返回后退时,发生一个完整的生命周期。

创建:onCreate;

开始:onStart;

重新开始:onResume;

点返回键

暂停:onPause;

停止:onStart;

销毁:onDestory:

情况二:来了一个电话或不小心点了home键返回了主屏幕。

创建:onCreate;

开始:onStart;

重新开始:onResume;

来了一个电话或不小心点了home键

暂停:onPause;

停止:onStart

通话结束,或又重新进入这个Activity

重新开始:onResume;

开始:onStart;

重新开始:onResume;

2.Activity有四个状态:

l 当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。

l 当它失去焦点但仍然对用户可见时(如右图),它处于暂停状态。即在它之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。

l 完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。

l 销毁状态:activity结束。

当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:

voidonCreate(Bundle savedInstanceState)

voidonStart()

voidonRestart()

voidonResume()

voidonPause()

voidonStop()

voidonDestroy()

3.这七个方法定义了Activity的完整生命周期。实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:

l Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,而在
onDestroy()销毁线程。

l Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart()
和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

l Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause()
方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。

4.Activity的前台生命周期循环例子:

1》创建一个Activity,添加七个生命周期方法,方法内输出各个方法名称。再添加一个按钮用于打开下面新添加的Activity。

startActivity(new Intent(LifeActivity.this,CustomDialogActivity.class));

2》添加一个新Activity,代码如下:

publicclass CustomDialogActivity extends Activity {

@Override protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

//必须在调用setContentView()之前调用requestWindowFeature()

requestWindowFeature(Window.FEATURE_LEFT_ICON);//要标题栏显示图标

setContentView(R.layout.dialog_activity); //设置视图

getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,android.R.drawable.ic_dialog_alert);//设置图标

}

}

3》在AndroidManifest.xml文件配置Activity,并且通过主题指定该Activity以对话框样式显示。

<applicationandroid:icon="@drawable/icon"android:label="@string/app_name" >

.....

<activityandroid:name=".CustomDialogActivity" android:label="对话框activity"

android:theme="@android:style/Theme.Dialog"/>

</application>

5.Activity创建图解

6.对话框通知(DialogNatification)

当你的应用需要显示一个进度条或需要用户对信息进行确认时,可以使用对话框来完成。

下面代码将打开一个如右图所示的对话框:

newAlertDialog.Builder(context)

.setTitle("java培训")

.setCancelable(false) //设置不能通过“后退”按钮关闭对话框

.setMessage("浏览传智播客网站?")

.setPositiveButton("确认",

new DialogInterface.OnClickListener(){

public void onClick(DialogInterfacedialoginterface, int i){

Uriuri = Uri.parse("http://www.itcast.cn/");//打开链接

Intent intent = new Intent(Intent.ACTION_VIEW,uri);

startActivity(intent);

}

})

.setNegativeButton("取消", newDialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,int id) {

dialog.cancel();

}

})

.show();//显示对话框

上面代码采用的是一个链式调用,像setTitle()、setMessage()这些方法,他们的返回值都是当前对话框对象。

android:name属性值的前面加了一个点表示NewActivity是当前包cn.itcast.action下的类,如果类在应用的当前包下,可以省略点符号,如果类在应用的子包下必须加点,如:NewActivity类在cn.itcast.action.user包下可以这样写:<activity android:name=“.user.NewActivity“ />

7.Android传参问题

在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Activity传递参数:

(1)打开新的Activity ,不传递参数

publicclass MainActivity extends Activity {

protected void onCreate(Bundle savedInstanceState){ .......

Button button =(Button)this.findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity

public void onClick(View v) {

//新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类

startActivity(new Intent(MainActivity.this, NewActivity.class));

}});

}

}

(2)打开新的Activity,并传递若干个参数给它:

publicclass MainActivity extends Activity {

protectedvoid onCreate(Bundle savedInstanceState) {

button.setOnClickListener(newView.OnClickListener(){//点击该按钮会打开一个新的Activity

public void onClick(View v) {

Intent intent = new Intent(MainActivity.this, NewActivity.class)

Bundlebundle = new Bundle();//该类用作携带数据

bundle.putString("name","传智播客");

bundle.putInt("age",4);

intent.putExtras(bundle);//附带上额外的数据

startActivity(intent);

}}); }

}

在新的Activity中接收前面Activity传递过来的参数:

publicclass NewActivity extends Activity {

@Override protected voidonCreate(Bundle savedInstanceState) {

........

Bundle bundle = this.getIntent().getExtras();

String name = bundle.getString("name");

int age = bundle.getInt("age");

}

}

8.得到新打开Activity关闭后返回的数据

如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int
requestCode,int resultCode, Intent data)方法:

publicclass MainActivity extends Activity {

@Override protected void onCreate(BundlesavedInstanceState) {

Button button =(Button)this.findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener(){

//点击该按钮会打开一个新的Activity

public void onClick(View v) {

//第二个参数为请求码,可以根据业务需求自己编号

startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 1);

}});

}

//第一个参数为请求码,即调用startActivityForResult()传递过去的值;第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity

@Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

String result = data.getExtras().getString(“result”));//得到新Activity 关闭后返回的数据

}

} 当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity 的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

使用startActivityForResult(Intentintent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

publicclass NewActivity extends Activity {

@Override protected void onCreate(BundlesavedInstanceState) {

button.setOnClickListener(newView.OnClickListener(){

public void onClick(View v) {

Intent intent = new Intent();//数据是使用Intent返回

intent.putExtra(“result”,“传智播客的学生很可爱”);

//把返回数据存入Intent

NewActivity.this.setResult(RESULT_OK,intent);//设置返回数据

NewActivity.this.finish();//关闭Activity

}});

}

}

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:

publicclass android.app.Activity extends ......{

public static final int RESULT_CANCELED = 0;

public static final int RESULT_OK = -1;

public static final int RESULT_FIRST_USER =1;

}

9.请求码的作用

使用startActivityForResult(Intentintent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int
requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:

public void onCreate(BundlesavedInstanceState) {

button1.setOnClickListener(newView.OnClickListener(){

public void onClick(View v) {

startActivityForResult (new Intent(MainActivity.this,NewActivity.class), 1);

}});

button2.setOnClickListener(newView.OnClickListener(){

public void onClick(View v) {

startActivityForResult (new Intent(MainActivity.this,NewActivity.class), 2);

}});

@Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

switch(requestCode){

case 1:

//来自按钮1的请求,作相应业务处理

case 2:

//来自按钮2的请求,作相应业务处理

}

}

}

10.结果码的作用

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):

publicclass ResultActivity extends Activity {

ResultActivity.this.setResult(1,intent);

ResultActivity.this.finish();

}

publicclass NewActivity extends Activity {

NewActivity.this.setResult(2, intent);

NewActivity.this.finish();

}

publicclass MainActivity extends Activity {

// 在该Activity会打开ResultActivity和NewActivity

protected void onActivityResult(intrequestCode, int resultCode, Intent data) {

switch(resultCode){

case 1:

// ResultActivity的返回数据

case 2:

// NewActivity的返回数据

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: