前言
众所周知,Android的四大组件包括:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Content Provider)。本文先来介绍一下活动以及服务,广播接收器与内容提供器在下一篇文章介绍。
活动
概述
活动是用户进行操作的可视化界面,它为用户提供了一个完成指令的窗口,在App中几乎所有可见的的内容都要依托Activity,所以Activity是开发中使用最频繁的一个组件。在这我们主要来讲解一下活动间的通信、活动的生命周期、活动的启动模式。
活动间的通信
Intent通常用于启动活动、启动服务以及发送广播等场景,这里就来介绍一下启动活动。
显示Intent:
Intent intent=new Intent(this,AnotherActivity.class);
startActivity(intent);
- 向下一个活动传递数据
例如此时我们有FirstActivity和SecondActivity两个活动
在FirstActivity:
String data="你好";
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);//extra_data相当于一个标识,在下一个活动我们也是通过extra_data来接收数据
startActivity(intent);
这样我们就将“你好”这个数据传递到了SecondActivity,接下来只需要在SecondActivity取出来即可
在SecondActivity:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
字符串类型数据使用getStringExtra()方法接收,整型数据使用getIntExtra()方法接收,布尔型数据使用getBooleanExtra()方法接收
- 返回数据给上一个活动
当我们从一个活动退出返回到上一个活动时,如果我们想传递数据给上一个活动,就可以使用到这里。
在启动活动时,我们不再使用startActivity()方法,而是使用startActivityForResult()方法,这个方法期望我们启动的活动在销毁时可以返回一个结果给上一个活动。
在FirstActivity:
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);// 设置请求码为1
在SecondActivity:
Intent intent=new Intent();
intent.putExtra("data_return","你好");
setResult(RESULT_OK,intent);
finish();
接着我们需要在FirstActivity中定义一个onActivityResult()方法来接收返回的数据:
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
//requestCode是我们在启动活动时传入的请求码
switch(requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnData=data.getStringExtra("data_return");
}
break;
default:
}
}
另外需要注意的是,如果我们是通过点击按钮返回FirstActivity,那么按钮的点击事件就和上面SecondActivity的代码那样即可,但如果我们是通过按下Back键返回到FirstActivity,那我们就要在SecondActivity重写onBackPressed方法了
@Override
public void onBackPressed(){
Intent intent=new Intent();
intent.putExtra("data_return","你好");
setResult(RESULT_OK,intent);
finish();
}
启动活动的最佳写法
在原本的启动活动的写法中,当我们要向启动的活动传数据时,我们可能并不知道传什么类型的数据,此时我们就可以换一种启动活动的写法。
在SecondActivity中定义一个actionStart()方法:
public static void actionStart(Context context,String data1,String data2){
Intent intent=new Intent(context,SecondActivity.class);
intent.putExtra("data_1",data1);
intent.putExtra("data_2",data2);
context.startActivity(intent);
}
这样一来,我们就清楚了,要启动SecondActivity要传递两个String类型的数据,接着在FirstActivity中启动SecondActivity:
SecondActivity.actionStart(FirstActivity.this