一、Activity介绍
在应用组件提供了一个屏幕,可以让用户做某些事情交互的(打电话,照相片),每一个Activity都是一个活动窗口。可以在Activity上画UI(图形页面设计:按钮,文本框,多选框)。
一个应用程序由多个activities组成,每个应用程序都有一个主activity,比如登录或者展示界面。用户的一个窗口可以启动另一个窗口,当一个新的activity启动的时候,会把原先的activity压到栈(后进先出)里面。这个栈是系统内部维护的,不需要我们来创建。
实例一:创建一个activity
1,创建一个class,继承Activity
2,必须实现的回调方法:oncreate()
当系统调用这个activity时,会调用这个回调方法。在这个方法体的内部,你应该初始化该Activity的一些组件。最重要的是你要调用一个setContentView(),该方法用来加载布局的。
另一个回调方法: onPause()
当用户离开一个activity的时候,会调用这个方法。它通常会保存用户一些数据到本地,因为用户可能离开一个页面后,一去不复返了。
3,当创建一个窗体后,必须要在清单文件中声明。
package:是存放activity的包,我们每次在清单文件中注册activity时,andorid:name可以简写为:andorid:name=“.NextActivity”
二、Activity页面跳转 + 值传递
页面跳转:由一个窗体跳转到另一个窗体中。
值传递:当我们由一个窗体进入另一个窗体时,需要传递一些参数。
实例需求:用户输入用户名xxx,点击登录,跳转到另一个页面,显示:欢迎您:xxx
运行结果:
程序清单:
/**
* 登录页面: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(R.id.editText1); //获取页面元素
button = (Button)this.findViewById(R.id.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://schemas.android.com/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(R.id.textView2);
// 得到上一个activity传递过来的intent
Intent intent = getIntent();
textView.setText(intent.getStringExtra("username"));
}
}
index.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/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://schemas.android.com/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,点击计算
二,填写8,点击确定
三,将8,传递给第一个页面中
清单文件:
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(R.id.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(R.id.button2);
editText1 = (EditText) this.findViewById(R.id.editText1);
editText2 = (EditText) this.findViewById(R.id.editText2);
editText3 = (EditText) this.findViewById(R.id.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://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/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 android.app.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(R.id.button1);
textView = (TextView) this.findViewById(R.id.textView1);
Intent intent = getIntent();
String message = intent.getStringExtra("message");
textView.setText(message);
editText = (EditText)this.findViewById(R.id.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://schemas.android.com/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://schemas.android.com/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为程序入口)
执行结果:
---onCreate()---方法
---onStart()---方法
---onResume()---方法
二:用DDMS 模拟打电话
测试结果:
---onPause()---方法
---onStop()---方法
三:挂断电话
测试结果:
---onRestart()---方法
---onStart()---方法
---onResume()---方法
四:退出应用程序:点击虚拟机的返回键
---onPause()方法---
---onStop()方法---
---onDestory()方法---
Activity的生命周期的状态图:
程序清单
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 )方法中读取。