林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
本文主讲了什么是Activity,它的生命周期,不对的操作,调用了什么函数。以及不同的Activity之间的跳转、数据传递等。
Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是 android 应用程序的基本功能单元。Activity 本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道。
一、Activity的生命周期简介
1、操纵生命周期的七种方法:
2、Activity的运作流程
3、Activity生命周期的四种基本状态:
(1)Active/Runing:一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
(2)Paused:当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
(3)Stoped。当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped状态。
(4)Killed Activity。被系统杀死回收或者没有被启动时处于 Killed状态。
二、Activity生命周期代码范例
1: /**
2: *Activity生命周期学习
3: *@author 林炳文(博客 http://blog.csdn.net/evankaka/)
4: *@time 2015.3.19
5: */
6: package com.example.activitylearning;
7: import android.os.Bundle;
8: import android.app.Activity;
9: import android.util.Log;
10: public class MainActivity extends Activity {
11: private static final String TAG="AvtivityTest";
12: @Override
13: protected void onCreate(Bundle savedInstanceState) {
14: super.onCreate(savedInstanceState);
15: Log.d(TAG, "onCreate() called");
16: setContentView(R.layout.activity_main);
17: }
18: @Override
19: protected void onStart(){
20: super.onStart();
21: Log.d(TAG, "onStart() called");
22:
23: }
24: @Override
25: protected void onResume(){
26: super.onResume();
27: Log.d(TAG,"onResume() called");
28:
29: }
30: @Override
31: protected void onPause(){
32: super.onPause();
33: Log.d(TAG, "onPause() called");
34:
35: }
36: @Override
37: protected void onStop(){
38: super.onStop();
39: Log.d(TAG, "onStop() called");
40:
41: }
42: protected void onDestroy(){
43: super.onDestroy();
44: Log.d(TAG, "onDestroy() called");
45:
46: }
47:
48:
49: }
1、程序启动
2、程序启动后按下后退键
可以看到,程序已退出了。
3、程序启动后按下主屏幕键
再打开程序:
三、多个Activity管理
1、Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。
2、处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。
3、当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换
注意:
?在Android系统中,要使用Activity必须在AndroidManifest.xml文件中进行配置。
在<application…/>元素中添加<activity…/>子元素即可
?配置Activity通常指定如下三个属性:
–name:指定该Activity的实现类。
–icon:指定该Activity对应的图标。
–label:指定该Activity的标签。
四、由一个Activity启动另一个Activity(不带数据传递)
1、布局
activity_1.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent"
5: tools:context=".Activity1" >
6: <Button
7: android:id="@+id/id_button1"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:text="启动Activity2"
11: />
12: </RelativeLayout>
activity_2.xml
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent" >
5: <Textview
6: android:text="欢迎来到Activity2"
7: android:layout_centerInParent="true"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:textSize="30sp"
11: />
12: </RelativeLayout>
2、对应的代码:
Activity1.java
1: /**
2: *Activity生命周期学习
3: *@author 林炳文(博客 http://blog.csdn.net/evankaka/)
4: *@time 2015.3.19
5: */
6: package com.example.activitylearning;
7: import android.os.Bundle;
8: import android.app.Activity;
9: import android.content.Intent;
10: import android.util.Log;
11: import android.view.View;
12: import android.view.View.OnClickListener;
13: import android.widget.Button;
14: public class Activity1 extends Activity {
15: private static final String TAG="Avtivity1";
16: private Button mButton;
17:
18: @Override
19: protected void onCreate(Bundle savedInstanceState) {
20: super.onCreate(savedInstanceState);
21: Log.d(TAG, "onCreate() called");
22: setContentView(R.layout.activity_1);
23: mButton=(Button)findViewById(R.id.id_button1);
24: mButton.setOnClickListener(new OnClickListener() {
25: @Override
26: public void onClick(View arg0) {
27: startActivity(new Intent(Activity1.this,Activity2.class));
28:
29: }
30: });
31: }
32: @Override
33: protected void onStart(){
34: super.onStart();
35: Log.d(TAG, "onStart() called");
36:
37: }
38: @Override
39: protected void onResume(){
40: super.onResume();
41: Log.d(TAG,"onResume() called");
42:
43: }
44: @Override
45: protected void onPause(){
46: super.onPause();
47: Log.d(TAG, "onPause() called");
48:
49: }
50: @Override
51: protected void onStop(){
52: super.onStop();
53: Log.d(TAG, "onStop() called");
54:
55: }
56: protected void onDestroy(){
57: super.onDestroy();
58: Log.d(TAG, "onDestroy() called");
59:
60: }
61:
62:
63: }
Activity2.java
1: package com.example.activitylearning;
2:
3: import android.app.Activity;
4: import android.os.Bundle;
5: import android.util.Log;
6:
7: public class Activity2 extends Activity {
8: private static final String TAG="Avtivity2";
9: @Override
10: protected void onCreate(Bundle savedInstanceState) {
11: super.onCreate(savedInstanceState);
12: Log.d(TAG, "onCreate() called");
13: setContentView(R.layout.activity_2);
14: }
15: @Override
16: protected void onStart(){
17: super.onStart();
18: Log.d(TAG, "onStart() called");
19:
20: }
21: @Override
22: protected void onResume(){
23: super.onResume();
24: Log.d(TAG,"onResume() called");
25:
26: }
27: @Override
28: protected void onPause(){
29: super.onPause();
30: Log.d(TAG, "onPause() called");
31:
32: }
33: @Override
34: protected void onStop(){
35: super.onStop();
36: Log.d(TAG, "onStop() called");
37:
38: }
39: protected void onDestroy(){
40: super.onDestroy();
41: Log.d(TAG, "onDestroy() called");
42:
43: }
44:
45: }
3、Activity注册
Androidmanifest.xml中
增加:
1: <activity
2: android:name="com.example.activitylearning.Activity2"
3: android:label="@string/app_name">
4: </activity>
4、运行结果
(1)、在Activity中点击按钮:启动Activity2
从上面可以看出Activity1没被毁掉,而是变成Stop()了,当前变成不可见。
(2 )然后再点击后退键:
五、由一个Activity启动另一个Activity(带数据传递)
1、界面
activity_1.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent"
5: tools:context=".Activity1" >
6: <Button
7: android:id="@+id/id_button1"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:text="启动Activity2"
11: />
12:
13: <EditText
14: android:id="@+id/id_edittext1"
15: android:layout_below="@id/id_button1"
16: android:layout_width="match_parent"
17: android:layout_height="wrap_content"
18: />
19: <EditText
20: android:id="@+id/id_edittext2"
21: android:layout_below="@id/id_edittext1"
22: android:layout_width="match_parent"
23: android:layout_height="wrap_content"
24: />
25: </RelativeLayout>
activity_2.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent" >
5: <TextView
6: android:id="@+id/id_textview1"
7: android:layout_width="match_parent"
8: android:layout_height="wrap_content"
9: android:textSize="30sp"
10: />
11: <TextView
12: android:id="@+id/id_textview2"
13: android:layout_below="@id/id_textview1"
14: android:layout_width="match_parent"
15: android:layout_height="wrap_content"
16: android:textSize="30sp"
17: />
18: </RelativeLayout>
2、主要代码。
Activity1.java中
1: Intent mIntent=new Intent(Activity1.this,Activity2.class);
2: String mString1 = mEditText1.getText().toString();
3: String mString2 = mEditText1.getText().toString();
4: mIntent.putExtra("one",mString1);
5: mIntent.putExtra("two",mString2);
6: startActivity(mIntent);
Activity2.java中
1: mTextView1=(TextView)findViewById(R.id.id_textview1);
2: mTextView2=(TextView)findViewById(R.id.id_textview1);
3:
4: String mString1=getIntent().getStringExtra("one");
5: String mString2=getIntent().getStringExtra("two");
6:
7: mTextView1.setText(mString1);
8: mTextView2.setText(mString1);
3、运行结果
左边为Activity1,右边为Activity2.它会得到Activity1的结果并在TextView中显示出来
六、得到返回的Activity的数据
这里要实现在Activity1中的两个EditText中输入内容,打开Activity2,将Activity1中的两个EditText的内容显示在Activity2的两个TextView中。
在在Activity2中的两个EditText中输入内容,按下返回键,将Activity2中的两个EditText的内容显示在Activity1的两个TextView中。
1、布局
2、主要代码
Activity1.java中:
1: mButton=(Button)findViewById(R.id.id_button1);
2: mButton.setOnClickListener(new OnClickListener() {
3: @Override
4: public void onClick(View arg0) {
5: Intent mIntent=new Intent(Activity1.this,Activity2.class);
6: String mString1 = mEditText1.getText().toString();
7: String mString2 = mEditText2.getText().toString();
8: mIntent.putExtra("one",mString1);
9: mIntent.putExtra("two",mString2);
10: startActivityForResult(mIntent, 0);
11:
12: }
13: });
注意要用 startActivityForResult(mIntent, 0);//0表示标识,等下Activity也要标志为0
然后是处理Activity2返回后的事件
1: @Override
2: protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3: super.onActivityResult(requestCode, resultCode, data);
4: if(null==data)
5: return;
6: TextView mTextView3=(TextView)findViewById(R.id.id_textview3);
7: TextView mTextView4=(TextView)findViewById(R.id.id_textview4);
8:
9: String mString3=data.getStringExtra("three");
10: String mString4=data.getStringExtra("four");
11:
12: mTextView3.setText(mString3);
13: mTextView4.setText(mString4);
14: }
Activity2.java中:
在按下返回键的事件中,增加一些数据传递,其实这里主要是setResult(0,result);注意0要和上面的startActivityForResult(mIntent, 0);对应。
1: @Override
2: public boolean onKeyDown(int keyCode, KeyEvent event) {
3: if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
4:
5: EditText mEditText3=(EditText)findViewById(R.id.id_edittext3);
6: EditText mEditText4=(EditText)findViewById(R.id.id_edittext4);
7: String mData1 = mEditText3.getText().toString();
8: String mData2 = mEditText4.getText().toString();
9: Intent result = new Intent();
10: result.putExtra("three", mData1);
11: result.putExtra("four", mData2);
12: setResult(0, result);
13:
14: }
15: return super.onKeyDown(keyCode, event);
16: }
3、效果
从Activity1中启动Activity2,可以看到,数据传递过去了
Activity1 Activity2
从Activity2中返回到Activity1中,可以看到,数据返回了
Activity2 Activity1
八、额外内容
Activity返回值
使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。
可变通的,你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父 Activity中的一个事件处理函数。子Activity最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择一个项目)的场合。
子Activity的创建和普通Activity的创建相同,也必须在应用程序的manifest中注册。任何在manifest中注册的Activity都可以用作子Activity。
启动子Activity
startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID。
下面的代码显示了如何启动一个子Activity:
private static final int SHOW_SUBACTIVITY = 1;
Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);
和正常的Activity一样,子Activity可以隐式或显式启动。下面的框架代码使用一个隐式的Intent来启动一个新的子Activity来挑选一个联系人:
private static final int PICK_CONTACT_SUBACTIVITY = 2;
Uri uri = Uri.parse(“content://contacts/people”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
返回值
当子Activity准备关闭时,在finish之前调用setResult来给调用的Activity返回一个结果。setResult方法带两个参数:结果码和表示为Intent的负载值。结果码是运行子Activity的结果,一般是Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情况下,你会希望使用自己的响应代号来处理特定的应用程序的选择;setResult支持任何整数值。
作为结果返回的Intent可以包含指向一个内容(例如联系人,电话号码或媒体文件)的URI和一组用来返回额外信息的Extra。
接下来的代码片段节选自子Activity的onCreate方法,显示了怎样向调用的Activity返回不同的结果:
1: Button okButton = (Button) findViewById(R.id.ok_button);
2:
3: okButton.setOnClickListener(new View.OnClickListener() {
4:
5: public void onClick(View view)
6:
7: {
8:
9: Uri data = Uri.parse(“content://horses/” + selected_horse_id);
10:
11: Intent result = new Intent(null, data);
12:
13: result.putExtra(IS_INPUT_CORRECT, inputCorrect);
14:
15: result.putExtra(SELECTED_PISTOL, selectedPistol);
16:
17: setResult(RESULT_OK, result);
18:
19: finish();
20:
21: }
22:
23: });
24:
25: Button cancelButton = (Button) findViewById(R.id.cancel_button);
26:
27: cancelButton.setOnClickListener(new View.OnClickListener() {
28:
29: public void onClick(View view)
30:
31: {
32:
33: setResult(RESULT_CANCELED, null);
34:
35: finish();
36:
37: }
38:
39: });
处理子Activity的结果
当子Activity关闭时,它的父Activity的onActivityResult事件处理函数被触发。重写这个方法来处理从子Activity返回的结果。onActivityResult处理器接受好几个参数:
请求码
曾经用来启动子Activity的请求码。
结果码
结果码是由子Activity设置的,用来显示它的结果。它可以是任何整数值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。
如果子Activity非正常关闭或在关闭时没有指定结果码,结果码都是Activity.RESULT_CANCELED。
数据
一个Intent来打包任何返回的数据。依赖于子Activity的目的,它可能会包含一个代表特殊的从列表中选择的数据的URI。可变通的,或额外的,子Activity可以使用“extras”机制以基础值的方式返回临时信息。
下面的框架代码实现了一个Activity中的onActivityResult事件处理函数:
1: private static final int SHOW_SUB_ACTIVITY_ONE = 1;
2:
3: private static final int SHOW_SUB_ACTIVITY_TWO = 2;
4:
5: @Override
6:
7: public void onActivityResult(int requestCode, int resultCode, Intent data) {
8:
9: super.onActivityResult(requestCode, resultCode, data);
10:
11: switch(requestCode)
12:
13: {
14:
15: case (SHOW_SUB_ACTIVITY_ONE) :
16:
17: {
18:
19: if (resultCode == Activity.RESULT_OK)
20:
21: {
22:
23: Uri horse = data.getData();
24:
25: boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
26:
27: String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
28:
29: }
30:
31: break;
32:
33: }
34:
35: case (SHOW_SUB_ACTIVITY_TWO) :
36:
37: {
38:
39: if (resultCode == Activity.RESULT_OK)
40:
41: {
42:
43: // TODO: Handle OK click.
44:
45: }
46:
47: break;
48:
49: }
50:
51: }
52:
53: }
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
原文地址:http://blog.csdn.net/evankaka/article/details/44522943