林炳文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: @Override13: protected void onCreate(Bundle savedInstanceState) {
14: super.onCreate(savedInstanceState);
15: Log.d(TAG, "onCreate() called");
16: setContentView(R.layout.activity_main); 17: } 18: @Override19: protected void onStart(){
20: super.onStart();
21: Log.d(TAG, "onStart() called");
22: 23: } 24: @Override25: protected void onResume(){
26: super.onResume();
27: Log.d(TAG,"onResume() called");
28: 29: } 30: @Override31: protected void onPause(){
32: super.onPause();
33: Log.d(TAG, "onPause() called");
34: 35: } 36: @Override37: 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: @Override19: 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: @Override26: public void onClick(View arg0) {
27: startActivity(new Intent(Activity1.this,Activity2.class));
28: 29: } 30: }); 31: } 32: @Override33: protected void onStart(){
34: super.onStart();
35: Log.d(TAG, "onStart() called");
36: 37: } 38: @Override39: protected void onResume(){
40: super.onResume();
41: Log.d(TAG,"onResume() called");
42: 43: } 44: @Override45: protected void onPause(){
46: super.onPause();
47: Log.d(TAG, "onPause() called");
48: 49: } 50: @Override51: 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: @Override10: protected void onCreate(Bundle savedInstanceState) {
11: super.onCreate(savedInstanceState);
12: Log.d(TAG, "onCreate() called");
13: setContentView(R.layout.activity_2); 14: } 15: @Override16: protected void onStart(){
17: super.onStart();
18: Log.d(TAG, "onStart() called");
19: 20: } 21: @Override22: protected void onResume(){
23: super.onResume();
24: Log.d(TAG,"onResume() called");
25: 26: } 27: @Override28: protected void onPause(){
29: super.onPause();
30: Log.d(TAG, "onPause() called");
31: 32: } 33: @Override34: 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: @Override4: 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: @Override2: 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: @Override2: 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