一、Activity介绍

   在应用组件提供了一个屏幕,可以让用户做某些事情交互的(打电话,照相片),每一个Activity都是一个活动窗口。可以在Activity上画UI(图形页面设计:按钮,文本框,多选框)。

    一个应用程序由多个activities组成,每个应用程序都有一个主activity,比如登录或者展示界面。用户的一个窗口可以启动另一个窗口,当一个新的activity启动的时候,会把原先的activity压到栈(后进先出)里面。这个栈是系统内部维护的,不需要我们来创建。

    实例一:创建一个activity

       1,创建一个class,继承Activity

2,必须实现的回调方法:oncreate()

            当系统调用这个activity时,会调用这个回调方法。在这个方法体的内部,你应该初始化该Activity的一些组件。最重要的是你要调用一个setContentView(),该方法用来加载布局的。

Android 中activity中USE_FULL_SCREEN_INTENT_android

     另一个回调方法: onPause()

      当用户离开一个activity的时候,会调用这个方法。它通常会保存用户一些数据到本地,因为用户可能离开一个页面后,一去不复返了。

3,当创建一个窗体后,必须要在清单文件中声明。

Android 中activity中USE_FULL_SCREEN_INTENT_Text_02

andorid:name可以简写为:andorid:name=“.NextActivity”

     

Android 中activity中USE_FULL_SCREEN_INTENT_android_03


Android 中activity中USE_FULL_SCREEN_INTENT_xml_04


二、Activity页面跳转 + 值传递

     页面跳转:由一个窗体跳转到另一个窗体中。

值传递:当我们由一个窗体进入另一个窗体时,需要传递一些参数。

     实例需求:用户输入用户名xxx,点击登录,跳转到另一个页面,显示:欢迎您:xxx

运行结果:

Android 中activity中USE_FULL_SCREEN_INTENT_Text_05


Android 中activity中USE_FULL_SCREEN_INTENT_xml_06

程序清单:

/**
  * 登录页面:LoginActivity.java
  * @author 绝版-飞扬
  *
  */
 public class LoginActivity extends Activity {
     private EditText editText;    //用户名
     private Button button;        //登录按钮
     public LoginActivity() {
         // TODO Auto-generated constructor stub
     }
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.login);
         editText = (EditText)this.findViewById(.editText1);        //获取页面元素
         button = (Button)this.findViewById(.button1);            //获取页面元素
         //添加button的点击事件监听:跳转页面+传递参数
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View arg0) {
                   // TODO Auto-generated method stub
                 //创建意图方式一:Intent(意图)传递参数(推荐使用)
                 Intent intent = new Intent(LoginActivity.this,IndexActivity.class);
                 //将传递的参数putExtra到意图中
                 intent.putExtra("username", editText.getText().toString().trim());
                 //开启另一个activity,并将intent传递过去
                 startActivity(intent);
                 /*创建意图方式二:
                   Intent intent = new Intent();
                   intent.setClass(LoginActivity.this,IndexActivity.class);
                  */
                 /*创建意图方式三:
                  * com.example.hello.IndexActivity:意图过滤器的名字,在清单文件中声明
                  * Intent intent = new Intent("com.example.hello.IndexActivity");
                  */
             }
         });
     }
 }
 login.xml<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http:///apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >

     <TextView
         android:id="@+id/textView1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:layout_marginLeft="35dp"
         android:layout_marginTop="85dp"
         android:text="用户名:"
         android:textSize="30sp" />

     <EditText
         android:id="@+id/editText1"
         android:layout_width="110dp"
         android:layout_height="wrap_content"
         android:layout_alignTop="@+id/textView1"
         android:layout_toRightOf="@+id/textView1"
         android:ems="10" >
         <requestFocus />
     </EditText>
     <Button
         android:id="@+id/button1"
         android:layout_width="100dp"
         android:layout_height="wrap_content"
         android:layout_below="@+id/editText1"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="62dp"
         android:text="登录" />
 </RelativeLayout>
 /**
  * 主页面:IndexActivity.java
  * @author 绝版-飞扬
  */
 public class IndexActivity extends Activity {
     private TextView textView;
     public IndexActivity() {
         // TODO Auto-generated constructor stub
     }
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.index);
         // 获取页面上的文本标签
         textView = (TextView) this.findViewById(.textView2);
         // 得到上一个activity传递过来的intent
         Intent intent = getIntent();
         textView.setText(intent.getStringExtra("username"));
     }
 }
 index.xml<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http:///apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
     <TextView
         android:id="@+id/textView1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:layout_marginLeft="43dp"
         android:layout_marginTop="32dp"
         android:text="欢迎您:"
         android:textSize="30sp" />
     <TextView
         android:id="@+id/textView2"
         android:textSize="30sp" 
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignBaseline="@+id/textView1"
         android:layout_alignBottom="@+id/textView1"
         android:layout_marginLeft="22dp"
         android:layout_toRightOf="@+id/textView1"
         android:text="" />
 </RelativeLayout>
 清单文件:AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http:///apk/res/android"
     package="com.example.hello"
     android:versionCode="1"
     android:versionName="1.0" >
 <!-- 清单文件 -->
     <uses-sdk
         android:minSdkVersion="8"
         android:targetSdkVersion="18" />
 <!-- 应用:四大组件都会出现在这里 -->
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/AppTheme" >
         <!-- 在清单文件中注册activity -->
         <activity android:name=".IndexActivity">
             <intent-filter >
                 <action android:name="com.example.hello.IndexActivity"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>            
         </activity>
         <activity android:name=".LoginActivity">
               <intent-filter>
                    <!-- 当前的窗体为主窗体 --> 
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
     </application>
 </manifest>

三、Activity页面跳转 + 回传值

回传值:新页面关闭后,将一些参数值传回给上一个页面中。

           我们之前启动一个新的activity时,用的是startActivity(intent),为了得到新activity传回的值,我们要使用startActivityForResult(intent,requestCode); 第一个参数是意图(传递参数的),第二个参数是请求码:即调用startActivityForResult() 传递过去的一个标识。

          我们还要在第一个页面中重写onActivityResult(int requestCode, int resultCode, Intent data)

          requestCode请求码,传递给第二个页面的标识。

          resultCode:结果码,用于标识返回数据来自哪个新Activity

          data:第二个页面返回个第一个页面的意图(携带着回传的数据)

举个列子:第一个页面中,有三个文本框,一个计算按钮,前两个是“加数”文本框,后一个是“和”文本框。

                  第二个页面中,有一个标签,一个文本框,一个确定按钮。

             用户填写第一个页面中的前两个文本框,点击计算,跳转到第二个页面中,将填写在第二个页面中的文本框的值传回给第一个页面中的“和”文本框。

运行结果:

  一,填写3,5,点击计算

Android 中activity中USE_FULL_SCREEN_INTENT_Text_07

  二,填写8,点击确定

Android 中activity中USE_FULL_SCREEN_INTENT_Text_08

   三,将8,传递给第一个页面中

Android 中activity中USE_FULL_SCREEN_INTENT_xml_09

清单文件:

MainAcitivity.java:
    public class MainActivity extends Activity {
     private Button button;
     private Button button2;
     private EditText editText1;
     private EditText editText2;
     private EditText editText3;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         // 测试一:测试页面跳转+值传递()Indent Bundle
         button = (Button) this.findViewById(.button1);
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View arg0) {
                 // 开启另一个窗体
                 // 第一种方式
                 Intent intent = new Intent(MainActivity.this,
                         NextActivity.class);
                 intent.putExtra("username", "小飞扬");
                 Bundle bundle = new Bundle();
                 bundle.putString("code", "100000");
                 intent.putExtra("bundle", bundle);
                 startActivity(intent);
             }
         });
         // 测试二:测试页面跳转+值回传
         button2 = (Button) this.findViewById(.button2);
         editText1 = (EditText) this.findViewById(.editText1);
         editText2 = (EditText) this.findViewById(.editText2);
         editText3 = (EditText) this.findViewById(.editText3);
         button2.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View arg0) {
                 // TODO Auto-generated method stub
                 Intent intent = new Intent(MainActivity.this,
                         CaculateActivity.class);
                 String a = editText1.getText().toString().trim();
                 String b = editText2.getText().toString().trim();
                 intent.putExtra("message", a + "+" + b + "=?");
                 startActivityForResult(intent, 1000);
             }
         });
     }
     /**
      * 从子activity中,回传结果回来给他
      */
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         // TODO Auto-generated method stub
         super.onActivityResult(requestCode, resultCode, data);
         if(requestCode==1000&&resultCode==1001){
             //从子窗口中获取结果
             String result_value=data.getStringExtra("result");
             editText3.setText(result_value);
         }
     }
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.main, menu);
         return true;
     }
 }
activity_main.xml
<RelativeLayout xmlns:android="http:///apk/res/android"
     xmlns:tools="http:///tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingBottom="@dimen/activity_vertical_margin"
     android:paddingLeft="@dimen/activity_horizontal_margin"
     android:paddingRight="@dimen/activity_horizontal_margin"
     android:paddingTop="@dimen/activity_vertical_margin"
     tools:context=".MainActivity" >

     <Button
         android:id="@+id/button1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="37dp"
         android:text="启动下一个Activity活动窗体" />

     <EditText
         android:id="@+id/editText1"
         android:layout_width="70dp"
         android:layout_height="wrap_content"
         android:layout_alignParentLeft="true"
         android:layout_below="@+id/button1"
         android:layout_marginTop="30dp"
         android:ems="10" >

         <requestFocus />
     </EditText>

     <EditText
         android:id="@+id/editText2"
         android:layout_width="70dp"
         android:layout_height="wrap_content"
         android:layout_alignBaseline="@+id/editText1"
         android:layout_alignBottom="@+id/editText1"
         android:layout_centerHorizontal="true"
         android:ems="10" />

     <TextView
         android:id="@+id/textView1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignBottom="@+id/editText2"
         android:layout_toLeftOf="@+id/editText2"
         android:text=" + "
         android:textSize="30sp" />

     <TextView
         android:id="@+id/textView2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignBottom="@+id/editText2"
         android:layout_toRightOf="@+id/editText2"
         android:text=" = "
         android:textSize="30sp" />

     <EditText
         android:id="@+id/editText3"
         android:layout_width="60dp"
         android:layout_height="wrap_content"
         android:layout_alignBaseline="@+id/textView2"
         android:layout_alignBottom="@+id/textView2"
         android:layout_alignParentRight="true"
         android:ems="10" />
     <Button
         android:id="@+id/button2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@+id/editText3"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="48dp"
         android:text="计算" />
 </RelativeLayout>
CaculateActivity.java
package com.example.hello;

 import .Activity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;

 public class CaculateActivity extends Activity {
     private Button button;
     private EditText editText;
     private TextView textView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.caculate);
         button = (Button) this.findViewById(.button1);
         textView = (TextView) this.findViewById(.textView1);
         Intent intent = getIntent();
         String message = intent.getStringExtra("message");
         textView.setText(message);
         editText = (EditText)this.findViewById(.editText1);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View arg0) {
                 // TODO Auto-generated method stub
                 String value = editText.getText().toString().trim();
                 Intent intent = new Intent();
                 intent.putExtra("result", value);
                 //设置回传的意图
                 setResult(1001, intent);
                 //结束activity的生命周期
                 finish();
             }
         });
     }
 }
caculate.xml
<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http:///apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >

     <Button
         android:id="@+id/button1"
         android:layout_width="100dp"
         android:layout_height="wrap_content"
         android:layout_below="@+id/textView1"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="90dp"
         android:text="确定" />

     <EditText
         android:id="@+id/editText1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignBaseline="@+id/textView1"
         android:layout_alignBottom="@+id/textView1"
         android:layout_alignParentRight="true"
         android:ems="10" />

     <TextView
         android:id="@+id/textView1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="30sp"
         android:layout_alignParentTop="true"
         android:layout_marginRight="16dp"
         android:layout_marginTop="54dp"
         android:layout_toLeftOf="@+id/editText1"
         android:text="结果" />
 </RelativeLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http:///apk/res/android"
     package="com.example.hello"
     android:versionCode="1"
     android:versionName="1.0" >
 <!-- 清单文件 -->
     <uses-sdk
         android:minSdkVersion="8"
         android:targetSdkVersion="18" />
 <!-- 应用:四大组件都会出现在这里 -->
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/AppTheme" >
         <!-- 窗体 -->
         <activity
             android:name="com.example.hello.MainActivity"
             android:label="@string/app_name" >
             <!-- 意图过滤器 -->
            <intent-filter>
                    <!-- 当前的窗体为主窗体 --> 
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
         <activity android:name=".NextActivity">
             <intent-filter >
                 <action android:name="com.example.hello.NextActivity" />
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
         </activity>
         <activity android:name=".CaculateActivity"></activity>
     </application>


</manifest>

四、Activity生命周期介绍

     如果想关闭一个activity的话,调用finish()

     如果想关闭一个分离的activity,调用finishActivity()

     activity的生命周期能够被它关联的其他activities,它的任务,和回退栈(back stack)直接影响.

     activity存在三种状态:

     1、Resume:重新启动,表示activity重新回到屏幕的前面,或者得到用户的焦点。

     2、Paused:暂停,当另外一个activity得到用户的焦点时,当前的activity就会被暂停,其实依然是可现的,并且位于当前获取焦点的activity的下面,这个暂停的activity任然会保存在我们内存中,有可能被我们的system干掉(手机内存极低的情况下)。

     3、Stopped:停止,被另一个activity完全覆盖掉了,被停止的activity没有死,任然保存在内存中。不会再附加到我们的窗口中。可能会被系统干掉(系统需要内存的时候就会被干掉)。

     当activity处于暂停或停止的时候,系统能够干掉它通过调用finish()方法。

测试activity的执行过程:日志打印被调用的方法名(onCreate(),onStart(),onResume(),onPause(),onStop(),onRestart(),onDestory())

一、启动项目(TestActivity为程序入口)

Android 中activity中USE_FULL_SCREEN_INTENT_xml_10

      执行结果:

      ---onCreate()---方法

      ---onStart()---方法



      ---onResume()---方法

二:用DDMS 模拟打电话

Android 中activity中USE_FULL_SCREEN_INTENT_Text_11



Android 中activity中USE_FULL_SCREEN_INTENT_android_12

     测试结果:

      ---onPause()---方法

      ---onStop()---方法

三:挂断电话

      测试结果:

      ---onRestart()---方法

      ---onStart()---方法



      ---onResume()---方法

四:退出应用程序:点击虚拟机的返回键

      ---onPause()方法---

---onStop()方法---

      ---onDestory()方法---

Activity的生命周期的状态图:

    

Android 中activity中USE_FULL_SCREEN_INTENT_xml_13

程序清单

TestActivity.java
 public class TestActivity extends Activity {
     private final String TAG = "TestActivity";
     public TestActivity() {
         // TODO Auto-generated constructor stub
     }
     /**
      * 1、第一次被调用,仅仅调用一次
      * 2、初始化布局View或者绑定数据
      */
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         Log.i(TAG, "---onCreate 方法---");
     }
     /**
      * 
      */
     @Override
     protected void onStart() {
         // TODO Auto-generated method stub
         super.onStart();
         Log.i(TAG, "---onStart 方法---");
         
     }
     
     @Override
     protected void onResume() {
         // TODO Auto-generated method stub
         super.onResume();
         Log.i(TAG, "---onResume 方法---");
     }
     @Override
     protected void onPause() {
         // TODO Auto-generated method stub
         super.onPause();
         Log.i(TAG, "---onPause 方法---");
     }
     @Override
     protected void onRestart() {
         // TODO Auto-generated method stub
         super.onRestart();
         Log.i(TAG, "---onRestart 方法---");
     }
     @Override
     protected void onStop() {
         // TODO Auto-generated method stub
         super.onStop();
         Log.i(TAG, "---onStop 方法---");
     }
     @Override
     protected void onDestroy() {
         // TODO Auto-generated method stub
         super.onDestroy();
         Log.i(TAG, "---onDestroy 方法---");
     }


}

五、Activity现场保存状态

      当系统破坏了我们的activity后,activity被销毁了。当我们重新创建这个activity的时候,希望他回到某种状态下,那么我们需要把这个状态重新创建。通过调用onSaveInstanceState()去保存你的activity的状态。(保存持久化数据有两种方式:数据库,XML文件),并在onCreate(Bundle )方法中读取。