活动(Activity)是一种可以包含用户界面的组件,主要用于和用户进行交互。活动可以嵌套,一个活动中可以包含另一个活动。几乎所有的应用程序中都包含活动。
在AndroidStudio中新建一个Empty Activity,代码如下:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
任何活动都要重写Activity类的onCreate()方法,这里系统已经自动写好了。
创建一个Layout后,需要在活动中调用setContentView()方法来加载布局,一般传入布局的id,引用布局的方式为:R.layout.first_layout,这样就可以得到first_layout.xml文件的布局id,传入setContentView()方法中即可。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
活动创建完成之后,需要在AndroidManifest文件中进行注册才能生效。
<application
...
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
活动的注册声明放在< application >标签内,在< activity >标签内用android:name来指定具体注册的活动名。如果要使程序运行,还要为其配置主活动,需要在< activity >标签内加入< intent-filter >标签,并添加主活动声明。
Intent是Android程序中各组件进行交互的重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。一般被用于启动活动、启动服务、发送广播等场景。Intent分为显式Intent和隐式Intent,下面通过使用这两种类型的Intent来启动活动。
Intent中有多个构造函数的重载,其中一个是Intent(Context packageContext,Class> cls)。Context参数要求提供一个启动活动的上下文,第二个参数class则是指定想要启动的目标活动。
Intent intent=new Intent(FirstActivity.class,SecondActivity.class);
startActivity(intent);
这里构建出一个Intent,用于在FirstActivity的基础上打开SecondActivity这个活动,然后调用startActivity()方法来执行这个Intent。
由于用这种方式启动活动的意图非常明显,故称之为显式Intent。
隐式Intent不明确指出要启动哪一个活动,而是指定一系列action和category等信息,交由系统判断合适的活动。
下面修改AndroidManifest文件中内容,指明SeceondActivity能够响应的action和category。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
< action >标签指明当前活动能够响应com.example.activitytest.ACTION_START这个action,< category >标签更精确地指明Intent可能携带的附加信息,只有二者都匹配上,这个活动才能响应Intent。
Intent intent=new Intent("com.example.activitytest.ACTION_START");
startActivity(intent)
这里在Intent构造函数中传入一个字符串,表明想要启动能响应com.example.activitytest.ACTION_START这个action的活动。如果不指定category内容,在调用startActivity()方法时会自动添加默认category至Intent中。也可以调用addCategory()方法来添加category。
Intent除了可以启动一个活动外,还能在启动活动的时候传递数据。具体思路为:调用putExtra()方法将数据以键值对的形式暂存在Intent中,启动另一个活动后,再将数据取出。
存data:
String data="hello world!"
Intent intent=new Intent(FirstActivity.class,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
取data:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
首先调用getIntent()方法获取用于启动活动的Intent,然后调用getStringExtra()方法来获取data,传入相应的键值。如果要取的是整型数据,就调用getIntExtra()方法。
Activity中有个**startActivityForResult()**方法也是用来启动活动的,并在活动销毁时能够返回一个结果给上一个活动。该方法有两个参数,第一个是Intent,第二个是请求码,用于在之后的回调中判断数据来源。
Intent intent=new Intent(FirstActivity.class,SecondActivity.class);
//调用startActivityForResult()方法来启动intent
startActivityForResult(intent,1);
上面的代码是在FirstActivity中调用startActivityForResult()方法启动SecondActivity,startActivityForResult()方法中的请求码只要是唯一值就可以了,这里传入了1。
在SecondActivity中添加返回数据的逻辑如下:
Intent intent=new Intent();
intent.putExtra("data_return","hello firstactivity");
setResult(RESULT_OK,intent);
finish();
首先创建一个intent用于传递数据,并把要传的数据存放其中。然后调用专门用于向上一个活动返回数据的setResult()方法,该方法有两个参数,第一个用于向上一个活动返回处理结果,一般使用RESULT_OK或者RESULT_CANCELED这两个值,第二个参数是把带有数据的intent传递回去,最后调用finish()方法销毁活动。
在活动销毁后,会回调上一个活动即FirstActivity中的onActivityResult()方法,因此需要重写该方法获取数据。
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
//判断数据来源,请求码为1
case 1:
//处理结果是否成功
if(resultCode==RESULT_OK){
String returnData=data.getStringExtra("data_return");
}
break;
default:
}
}
下图为活动从创建到销毁的周期图,参考菜鸟教程-Android活动。Activity类是ContextThemeWrapper类的子类,包含一系列方法,如onCreate()、OnStart()、OnResume()等等,分别在活动的各个时期调用。
每个活动在其生命周期中最多可能会有四种状态。分别为运行状态、暂停状态、停止状态、销毁状态。活动在不同状态会调用不同的方法,具体方法如下:
onCreate():在活动第一次创建时调用
onStart():在活动为用户可见时被调用
onResume():在应用程序与用户开始可交互的时候调用
onPause():当前活动将要被暂停,上一个活动将要被恢复时调用
onStop():当活动不在可见时调用
onDestroy(): 当活动被系统销毁之前调用
onRestart() :当活动被停止以后重新打开时调用