一、Activity
概念:活动面板 应用程序组件 可以绘制Ui界面 可以和用户进行交互
默认展示全屏 其他情况 界面比其他窗口小 悬浮在其他窗口上方
创建一个Activity的步骤:
1.创建一个类继承Activity
2.给Activity 添加生命周期方法 oncreate()
3.要在清单文件进行注册 ,Application里进行注册 <activity name="包名.类名">
二、启动其他的Activity
* 得到Intent(意图对象) Activity Fragment Service BroadCastReceiver* 参数1:上下文对象 当前是Activity
* 参数2:目标Activity SecondActivity.class
Intent intent = new Intent(MainActivity.this,FourActivity.class);
startActivity(intent);
【注】:1.FourActivity 要加载一个布局setContentView(R.layout.activity_second);
2.FourActivity 要到AndroidManifest.xml中进行注册
三、Intent传值
1.直接进行传值 传基本数据类型
传递时的写法(MainActivity):
// 获得edname(EditText)的值String name = edname.getText().toString().trim();
// 获得RadioButton的值
int sexInt = -1;
// 判断选择的RadioButton
if (rgMale.isChecked()) {
sexInt = 0;
} else if (rgFemale.isChecked()) {
sexInt = 1;
}
//添加意图 用于页面跳转和传值
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//将数据直接添加到intent里
intent.putExtra("name", name);
intent.putExtra("sexInt", sexInt);
//启动页面跳转
startActivity(intent);
跳转后的写法(SecondActivity):
setContentView(R.layout.activity_second);tvName = (TextView) findViewById(R.id.tv_name);
tvSex = (TextView) findViewById(R.id.tv_sex);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int sex = intent.getIntExtra("sexInt", -1);
//给控件设置传递过来的值
tvName.setText(name);
if (0==sex) {
tvSex.setText("女");
}else if (1==sex) {
tvSex.setText("男");
}
2.通过Bundle对象 传递基本数据类型
传递时的写法(MainActivity):
// 获得edname(EditText)的值String name1 = edname.getText().toString().trim();
// 获得RadioButton的值
int sexInt1 = -1;
// 判断选择的RadioButton
if (rgMale.isChecked()) {
sexInt = 0;
} else if (rgFemale.isChecked()) {
sexInt = 1;
}
//添加意图 用于页面跳转和传值
Intent intent2 = new Intent(MainActivity.this, ThreeActivity.class);
// 获取Bundle对象 打包数据 bundle:一束,一捆
Bundle bundle = new Bundle();
//将数据添加到bundle对象中
bundle.putString("name1", name1);
bundle.putInt("sexInt1", sexInt1);
//将数据通过bundle对象加入到intent2中
intent2.putExtra("bundle", bundle);
//启动跳转
startActivity(intent2);
跳转后的写法(ThreeActivity):
tvName = (TextView) findViewById(R.id.tv_name);tvSex = (TextView) findViewById(R.id.tv_sex);
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bundle");
String name = bundle.getString("name1");
int sex = bundle.getInt("sexInt",-1);
tvName.setText(name);
if (0==sex) {
tvSex.setText("女");
}else if (1==sex) {
tvSex.setText("男");
}
3.直接传递对象 对象要进行序列化
传递时的写法(MainActivity):
// 获得edname(EditText)的值String name = edname.getText().toString().trim();
// 获得RadioButton的值
int sexInt = -1;
// 判断选择的RadioButton
if (rgMale.isChecked()) {
sexInt = 0;
} else if (rgFemale.isChecked()) {
sexInt = 1;
}
//添加意图 用于页面跳转和传值
Intent intent = new Intent(MainActivity.this,FourActivity.class);
//创建person对象 将数据添加到person对象中
Person person = new Person(name, sexInt);
// 使用Object(person)传值 Person类必须实现Serializable接口
intent.putExtra("person", person);//第二个参数是Serializable类型的对象
//启动页面跳转
startActivity(intent);
跳转后的写法(SecondActivity):
tvName = (TextView) findViewById(R.id.tv_name);tvSex = (TextView) findViewById(R.id.tv_sex);
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
String name = person.getName();
int sex = person.getSex();
tvName.setText(name);
if (0==sex) {
tvSex.setText("女");
}else if (1==sex) {
tvSex.setText("男");
}
4.通过Bundle对象 传递Object对象 对象要进行序列化
传递时的写法(MainActivity):
// 获得edname(EditText)的值String name = edname.getText().toString().trim();
int sexInt = -1;//设置默认值-1:代表不男不女 1:男 0:女
if (rgMale.isChecked()) {
sexInt = 1;
}else if (rgFemale.isChecked()) {
sexInt = 0;
}
//创建person对象 将数据添加到person对象中
Person person = new Person(name,sexInt);
//添加意图 用于页面跳转和传值
Intent intent = new Intent(MainActivity.this,FiveActivity.class);
// 获取Bundle对象 打包数据 bundle:一束,一捆
Bundle bundle = new Bundle();
bundle.putSerializable("person",person);
//将数据通过bundle带有Object(person)对象加入到intent中
intent.putExtra("bundle", bundle);
//启动页面跳转
startActivity(intent);
跳转后的写法(SecondActivity):
tvName = (TextView) findViewById(R.id.tv_name);tvSex = (TextView) findViewById(R.id.tv_sex);
//获得传过来的意图
Intent intent = getIntent();
//从intent里获取bundle
Bundle bundle = intent.getBundleExtra("bundle");
//从bundle得到Person对象
Person person = (Person) bundle.getSerializable("person");
String name = person.getName();
int sexInt = person.getSex();
//将的到的数据展示到控件上
tvName.setText(name);
if (0==sexInt) {
tvSex.setText("女");
}else if(1==sexInt){
tvSex.setText("男");
}
四、startActivityForResult传值
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends Activity {
//请求码
private static int REQUEST_CODE =1001;
private static int REQUEST_CODE1 =REQUEST_CODE+1;
private EditText et;
private ImageView ivShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
}
public void initView() {
et = (EditText) findViewById(R.id.et);
ivShow = (ImageView) findViewById(R.id.iv_show);
}
//按钮的点击事件
public void MyClick(View v){
String name = et.getText().toString().trim();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("name", name);
/**
* 参数1:意图对象
* 参数2:请求码
*/
startActivityForResult(intent, REQUEST_CODE);
}
/**
* 处理返回结果的
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
//判断请求码
if(requestCode == REQUEST_CODE){
//判断结果码
if(resultCode == SecondActivity.RESULT_CODE){
//获取图片的R文件
int imgId = data.getIntExtra("imgId", R.drawable.ic_launcher);
//将图片展示到控件上
ivShow.setImageResource(imgId);
}
}
}
}
</pre><p></p><pre name="code" class="java">import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends Activity {
//结果码
public static final int RESULT_CODE = 2001;
private TextView tv;
private String name = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
// 得到传递过来的Intent
Intent intent = getIntent();
name = intent.getStringExtra("name");
tv.setText(name);
}
public void initView() {
tv = (TextView) findViewById(R.id.tv);
}
public void MyClick(View v) {
// 默认的图片的id
int imgId = R.drawable.ic_launcher;
if ("deer".equals(name)) {
imgId = R.drawable.deer;
} else if ("panda".equals(name)) {
imgId = R.drawable.panda;
} else if ("sheep".equals(name)) {
imgId = R.drawable.sheep;
}
Intent intent = new Intent();
intent.putExtra("imgId", imgId);
//将结果返回上个界面 参数1:结果码 参数2:intent
setResult(RESULT_CODE, intent);
//关闭Activity
finish();
}
}
五、使用Application 实现传值功能
创建MyApplication类后要到清单文件中设置
import android.app.Application;
/**
*
* 自定义一个Application
* 需要在清单文件 将系统的Application替换了
*
*/
public class MyApplication extends Application{
private String name;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取Application对象
MyApplication myApplication = (MyApplication) getApplication();
myApplication.setName("张三");
}
public void Onclick(View v){
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//获取Application对象
MyApplication myApplication = (MyApplication) getApplication();
String name = myApplication.getName();
//动态获取View
TextView tv = new TextView(SecondActivity.this);
tv.setText(name);
//设置布局 View
setContentView(tv);
}
}
六、Activity的生命周期
例题运行结果:
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
//静态标记
private static final String TAG = "MainActivity";
/**
* 程序第一次启动时调用
* 作用:加载界面 初始化控件 事件监听
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "======onCreate=====");
}
/**
* UI界面显示时调用 现阶段用户没有获取焦点(点击没有作用)
*/
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e(TAG, "======onStart=====");
}
/**
* 用户获取焦点调用(点击有作用) 重新获取数据
*/
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG, "======onResume=====");
}
/**
* 用户失去焦点是调用
*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e(TAG, "======onPause=====");
}
/**
* 用户界面被完全遮挡
*/
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e(TAG, "======onStop=====");
}
/**
* 用户界面被完全遮挡之后,重新回到当前的Activity
*/
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.e(TAG, "======onRestart=====");
}
/**
* Activity被销毁时调用 关闭资源
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e(TAG, "======onDestroy=====");
}
public void MyClick(View v){
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
}
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class SecondActivity extends Activity {
//静态标记
private static final String TAG = "SecondActivity";
/**
* 程序第一次启动时调用
* 作用:加载界面 初始化控件 事件监听
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "======onCreate=====");
}
/**
* UI界面显示时调用 现阶段用户没有获取焦点(点击没有作用)
*/
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e(TAG, "======onStart=====");
}
/**
* 用户获取焦点调用(点击有作用) 重新获取数据
*/
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG, "======onResume=====");
}
/**
* 用户失去焦点是调用
*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e(TAG, "======onPause=====");
}
/**
* 用户界面被完全遮挡
*/
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e(TAG, "======onStop=====");
}
/**
* 用户界面被完全遮挡之后,重新回到当前的Activity
*/
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.e(TAG, "======onRestart=====");
}
/**
* Activity被销毁时调用 关闭资源
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e(TAG, "======onDestroy=====");
}
}
七、Activity现场保护
存数据:onSaveInstanceState()
取数据:
方法一; 在onCreate()
方法二; onRestoreInstanceState()
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
//用于计数
private int progress = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// //获取现场保护中值的方法:方法1:
// //判断savedInstanceState中的值是否为空
// if (savedInstanceState!=null) {
// //取出现场保护里保存的数值
// savedInstanceState.getInt("progress");
// }
}
public void MyClick(View v){
Toast.makeText(MainActivity.this, "progress"+(progress++), Toast.LENGTH_SHORT).show();
}
/**
* 用于现场保护
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
//将值保存起来
outState.putInt("progress",progress);
}
//获取现场保护中值的方法:方法2:
//调用获取值的方法
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
//判断savedInstanceState中的值是否为空
if (savedInstanceState!=null) {
//取出现场保护里保存的数值
progress = savedInstanceState.getInt("progress");
}
}
}