Android第2讲:活动(Activity)

文章关于活动的创建,布局代码,控件绑定没有指出,可以先找到相关视频进行基础学习

1. 活动概述

活动是Android应用的重要组件,活动中可以包含若干个视图,它是一个视图的”容器“或”载体“,主要用于和用户进行交互。一个活动可以用来绘制用户界面窗口,这些窗口通常是填充整分屏幕,也可以作为对话框浮动在屏幕之上。

1.1 创建活动

首先,编写相应的活动类,要求集成android.app.Activity或其子类,并覆盖它的某些方法,活动类如图所示。
在这里插入图片描述

  • android.app.Activity。最基本的活动类
  • android.app.ListActivity。提供列表控件的活动类
  • android.aupport.v4.app.FragmentActivity。支持Fragment(碎片)功能的活动类
  • android.aupport.v7.app.AppCompatActivity。支持ActionBar的活动类,应用主题是Theme.AppCompat。

1.2 活动的生命周期

Android应用中可以有多个活动,这些活动是由任务(Task)管理的,任务将活动放到返回栈(Back Stack)中,处于栈顶的活动是当前活动,负责显示当前屏幕。
如下图是活动的生命周期,可以从三个不同的角度(三种状态、7种方法、三个嵌套循环)分析。
在这里插入图片描述

主要三种状态

  • 运行状态:活动进入前台,位于栈顶,此时活动处于运行状态。运行状态的活动可以获得焦点,活动种的内容会高亮显示。
  • 暂停状态:其他活动进入天台,当前活动不在处于栈顶,但仍可见只是变暗,此时活动处于暂停状态。暂停状态的活动不能获得焦点,活动中的内容会变暗。nieron当系统内存过低,其他应用需要内容,系统会回收暂停状态的活动
  • 停止状态:当活动不在处于栈顶,被其他活动完全覆盖,不可见时,此时活动处于停止状态。处于停止状态的活动虽然不可见,但是仍然保持所有状态(成员变量值)。当系统内存过低,其他应用需要内容,系统会回收暂停状态的活动

7种方法

活动的生命周期中活动的状态发送转移时会调用Activity类中的一些方法,根据自己的需要可以重写这些方法。

  • onCreate()。当活动初始化时候调用
  • onStart()。活动从不可见变为可见,但是颜色还是暗色,不能获得焦点,不能接收用户事件。此时调用此方法。
  • onResume()。活动从暗色变为高亮可见,活动获得焦点,接收用户事件。此时调用此方法。
  • onPause()。活动从运行状态到暂停状态调。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但是这个方法的执行速度一定要快,不然会影响到新的栈顶Activity的使用。
  • onStop()。活动从暂停状态变为停止状态调用此方法。
  • onRestart()。处于停止的活动,活动重新回到前台,变成活动状态时候调用
  • onDestroy()。活动被销毁时候调用。

三个嵌套循环

在上述的7种方法中,除了onRestart()方法,其他6种方法都是两两相对的,根据自己的情况实现这些方法监控活动的生命周期中的三个循环嵌套。

  • 整个生命周期循环:活动的整个生命周期发生在onCreate()和onDestory()调用之间。在onCreate()中初始化设置,在onDestroy()中释放所有资源。
  • 可见生命周期循环:活动的可见生命周期发生在onStart()调用和onStop调用之间。在此期间活动可见,用户能与之交互。活动会在可见和不可见两种状态中交替变化,系统会多次调用onStart()和onStop()。
  • 前台生命周期循环:活动的前台生命周期循环发生在onResume()调用与onPause()调用之间。在此期间活动位于屏幕上所有其他活动之前,但是尚未完全遮挡。活动可以频繁进入和退出前台,系统会多次调用onResume()和onPause()。由于频繁调用,这两个方法采用轻量级的代码,以避免程序运行缓慢。

1.3 Back和Home按钮的区别

back会使活动进入销毁状态,销毁栈顶活动。
home件会使活动进入停止状态。

2.多活动之间的跳转

一个应用肯定会有很多活动,那么就有多活动之间跳转的问题,主要为以下三个:

  • 从第一个活动进入到第二个活动
  • 从第二个活动进入到第一个活动
  • 活动之间的参数传递和返回

2.1 启动下一个活动

显示意图构造方法:Intent(Context packageContext,Class<?>cls),第一个参数 packageContext的类型是Context,他是一个抽象类,他的子类有很多,其中Activity和Service是比较常见的。第二个参数cls是具体的组件类名,通过这个类名可以启动并实例化该组件。

使用方法举例如下:

	Intent intent = new Intent(LoginActivity.this,FailureActivity.class);
	startActivity(intent);

实例:

从当前活动启动进入下一个活动可以采用如下方法:
void startActivity(Intent intent):启动下一个活动,intent一个意图对象。

public class LoginActivity extends AppCompatActivity{
	private final static String TAG = "LoginActivity";
	private EditText txtUserid;
	private EditText txtPwd;
	private Button btnLogin;

	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);

		Log.v(TAG."进入LoginActivity");
		btnLogin = (Button)findViewById(R.id.button_login);
		txtUserid = (EditText)findViewById(R.id.editText_userid);
		txtPwd = (EditText)findViewById(R.id.editText_password);
		btnLogin.setOnClickListener(new View.OnClickListener){
			@Override
			public void onClick(View v){
				if(txtUserid.getText().toString().equals("tony")&&txtPwd.getText().toSting().equals("123")){
					//显示意图
					Intent intent = new Intent(LoginActivity.this,SuccessActivity.class);
					···
					//启动活动
					startActivity(intent);
				}else{
					//显示意图
					Intent intent = new Intent(LoginActivity.this,FailureActivity.class);
					//启动活动
					startActivity(intent);
				}				
			}
		}
	}
}

2.2 参数传递

多个活动直接参数的传递主要是通过意图,意图有一个附加数据(Extras)字段,可以保证存储多个形式的数据,意图通过putExtras(name,value)方法,以“键-值”对形式保存数据

保存单值参数方法如下。

  • putExtra(String name ,String value)
  • putExtra(String name ,int value)

保存多值参数方法如下。

  • putExtra(String name, int[] value)
  • putExtra(String name, Serializable value)。value是任何可序列化的数据。

活动通过getIntent()方法获得意图,附加的数据字段通过意图的getExtras()方法获取,返回值Bundle,Bundle是数据包是多个数据集合体。Bundle提供了很多Getter方法如下

  • int getInt(String key)。通过建获取Int类型数据。
  • int[] getIntArray(String key)。通过健获取Int数组类型的数据。
  • String getString(String key)。通过键获取字符串类型数据。
  • Serializable getSerializable(String key)。通过键获取可序列化类型的数据。

使用举例:

启动活动相关代码

Intent intent = new Intent(LoginActivity.this,SuccessActivity.class);
intent.putExtra("userid",txtUserid.getText().toSting());	//userid是键,后面的是值
startActivity(intent);

下一个活动中接收参数的相关代码如下

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
String userid = bundle.getString("userid")

相关参数传递部分,请看后续文章关于意图讲解部分。

2.3 返回上一个活动

多个活动之间的跳转,是将多个活动放到栈中,通过入栈和出栈实现。进行下一个活动是通过startAcivity(Intent)方法将意图所找到的活动入栈,使其处于栈顶,这样就实现了跳转。如果像返回上一个活动,可以使用活动的 void finish()方法。调用当前活动的finish()方法回到上一个活动
finish方法使用举例

		button.setOnClickListener(new View.OnClickListener){
			@Override
			public void onClick(View v){
					finish();
			}
		}

有时候返回的活动很多,上一活动想知道是从那个活动返回的,在启动下一个活动的时候可以采用如下方法:

void startActivityForResult(Intent intent ,int requestCode)

与startActivity类似,启动下一个活动。第二个参数是请求编码,它可以传递给下一个活动,再由活动finish()返回给上一个活动,因此他是用于判断从哪个活动返回。

为了接收活动的返回,需要重写onActivityResult(int requestCode,int resultCode,Intent data)方法,下一个活动调用finish()方法后,系统就会回调用onActivityResult方法。

第一个参数是当时startActivityForResult中的编码。第二个参数resultCode(结果编码)参数。

结果编码参数是在下一个活动中通过void setResult(int resultCode, Intent data )方法设置的。

带返回参数的举例:
接收返回参数的活动

public class LoginActivity extends AppCompatActivity{
	...
	@Override
	public void onCreate(Bundle savedInstanceState){
		...
		btnLogin.setOnClickListener(new View.OnClickListener){
			@Override
			public void onClick(View v){
				if(txtUserid.getText().toString().equals("tony")&&txtPwd.getText().toSting().equals("123")){
					//显示意图
					Intent intent = new Intent(LoginActivity.this,SuccessActivity.class);
					intent.putExtra("userid",txtUserid.getText().toString());
					//启动活动
					startActivityForResult(intent,1);
				}else{
					//显示意图
					Intent intent = new Intent(LoginActivity.this,FailureActivity.class);
					//启动活动
					startActivityForResult(intent,2);
				}	
			}
		}
	}
	@Override
	protected void onActivityResult(int requestCode,int resultCode,Intent data){
		switch(requestCode){
			case 1:
				Log.V(TAG,"从成功活动返回.resultCode="+resultCode);
				break;
			case 2:
				Log.V(TAG,"从失败活动返回.resultCode="+resultCode);
				break;
		}
		super.onActivityResult(requestCode,resultCode,data);
	}
}

返回时传递参数的活动

public class SuccessActivity extends Activity{
	...
	@override
	protected void onCreate(Bundle savedInstanceState){
		...
		bt.setOnClickListener(new View.OnClickListener){
			@override
			public void onClick(View v){
				setResult(4,(new Intent()).putExtra("userid",userid));//这里
				finish();
			}
		}
	}
}

在返回上一个活动finish方法前设置resultCode。setResult方法第一个参数是resultCode,第二个参数是意图对象,可以通过意图的附加数据(Extras)传递参数返回给上一活动。上一活动会在onActivityResult方法中接收,其方法的参数就是接收值。

2.4 活动任务与返回栈

在Android中有一个任务的概念,任务事将多个活动放在一起管理,这些活动可以是同一个应用中的,也可以是不同应用中的。任务通过一个返回栈管理这些活动。如果有两个活动A和B,当A处于运行状态时A处于返回栈顶,当A跳转到B时,B入栈处于栈顶。

单击Back键返回上一活动。但是,有时需要单击Back回到桌面。实现该效果可以通过设置意图标志(Flag)来改变默认的返回状态,与任务有关的标志有

  • FLAG_ACTIVITY_NEW_TASK。开始一个新的任务
  • FLAG_ACTIVITY_CLEAR_TOP.。清除返回栈中活动

举例

		button.setOnClickListener(new View.OnClickListener){
			@Override
			public void onClick(View v){
				//显示意图
				Intent intent = new Intent(LoginActivity.this,SuccessActivity.class);
				//设置意图的标志
				intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
				//启动活动
				startActivity(intent);
			}
		}

设置意图,开启一个新任务并清除返回栈,那么此时开启的活动成了栈中唯一。Back返回时就会回到桌面。

文章关于活动的创建,布局代码,控件绑定没有指出,可以先找到相关视频进行基础学习
文章还会持续更新。。。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值