Android学习(一)activity
- 什么是activity?
- 一、activity的基本用法
- 二、探索Intent在activity中的使用
- 使用显式Intent进行activity跳转
- 使用隐式Intent进行activity跳转
- 向下一个activity传递数据
- 返回数据给上一个activity
- 进阶使用Intent传递对象
- Serializable
- Parcelable
- 三、activity的生命周期
- 活动状态
- activity的生存期
- 四、活动的启动模式
- standard
- singleTop
- singleTask
- singleInstance
什么是activity?
Activity 类是 Android 应用的关键组件。它是直接被用户观察并进行交互使用。activity官网简介。
Activity 提供窗口供应用在其中绘制界面。此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面。要在应用中使用 Activity,您必须在应用的清单中注册关于 Activity 的信息,并且必须适当地管理 Activity 的生命周期。
一、activity的基本用法
我们可以直接为项目添加一个Empty Activity,这样Android Studio会自动帮我们创建好一个activity需要的全部资源,我们就可以直接进行开发。
我们也可以自己手动创建activity,这样对一个完整activity所需要的资源,有个更深刻的印象:
- 手动创建activity
不勾选Generate Layout File 和 Launcher Activity;
- 创建和加载布局资源
在layout目录下创建Layout resource file。
当布局文件创建完成后,我们在第一步创建好activity的onCreate()方法中调用setContentView()方法,为当前activity加载一个布局。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
- 在 AndroidManifest文件中注册
在< activity >标签中使用android:name声明具体注册哪一个activity
<activity android:name=".MainActivity">
</activity>
注意:如果该activity为程序的主活动,还需要额外声明,否则程序无法运行。在 < activity >标签中加入< intent-filter >标签并添加:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
二、探索Intent在activity中的使用
使用显式Intent进行activity跳转
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
使用隐式Intent进行activity跳转
在AndroidManifest文件中的< activity >中加入< intent-filter >标签并添加如下:
<action android:name="com.test.activity.secondActivity">
<category android:name="android.intent.category.DEFAULT">
然后在代码中添加如下:
Intent intent = new Intent("com.test.activity.secondActivity");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
区别在于,不需要指定具体跳转activity,可以使用在AndroidManifest文件中声明的消息进行跳转。
向下一个activity传递数据
跳转前进行数据存储,代码如下:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("test_string", "hello world");
startActivity(intent);
跳转后进行数据读取,代码如下:
Intent intent = getIntent();
String data = intent.getStringExtra("test_string");
返回数据给上一个activity
其中主要使用的是启动activity的startActivityForResult()方法。该方法会在启动的activty销毁时,将需要的数据返回给上一个activity。
首先,在FirstActivity内部调用startActivityForResult()方法,代码如下:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
其次,在SecondActivity内部调用setResult()方法存储需要返回的数据,再结束当前activity,代码如下:
Intent intent = new Intent();
intent.putExtra("test_string", "hello world");
setResult(RESULT_OK, intent);
finish();
最后,在FirstActivity内部重写onActivityResult()方法来接收来自SecondActivity返回的数据。
注意,其中的requestCode和resultCode要对应。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case 1:
if (requestCode == RESULT_OK) {
String s = data.getStringExtra("test_string");
}
break;
default:
break;
}
}
进阶使用Intent传递对象
Serializable
- 创建对象实现Serializable
package com.example.testapplication;
import java.io.Serializable;
public class Test implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Test(String name, int age) {
this.name = name;
this.age = age;
}
}
- Intent传入对象
Intent intent = new Intent(MainActivity.this, IntentActivity.class);
intent.putExtra("test", new Test("test", 18));
startActivity(intent);
- 获取Intent中的对象
Test test = (Test) getIntent().getSerializableExtra("test");
Parcelable
- 创建对象实现Parcelable
重写writeToParcel()和createFromParcel()
package com.example.testapplication;
import android.os.Parcel;
import android.os.Parcelable;
public class TestParcelable implements Parcelable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public TestParcelable(String name, int age) {
this.name = name;
this.age = age;
}
public static final Creator<TestParcelable> CREATOR = new Creator<TestParcelable>() {
@Override
public TestParcelable createFromParcel(Parcel in) {
TestParcelable testParcelable = new TestParcelable(in.readString(), in.readInt());
return testParcelable;
}
@Override
public TestParcelable[] newArray(int size) {
return new TestParcelable[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
- Intent传入对象
Intent intent = new Intent(MainActivity.this, IntentActivity.class);
intent.putExtra("test", new TestParcelable("test_Parcelable", 10));
startActivity(intent);
- 获取Intent中的对象
TestParcelable test = (TestParcelable) getIntent().getParcelableExtra("test");
三、activity的生命周期
掌握activity的生命周期是很重要的,了解熟悉它后,对我们的开发中资源的创建和释放很有帮助。
活动状态
其中有4个状态,如下:
- 运行状态
- 暂停状态
- 停止状态
- 销毁状态
activity的生存期
方法名 | 描述说明 |
onCreate() | 当activity第一次创建时,最先执行一次。适用于初始化布局、控件等等。 |
onRestart() | 当activity在不可见情况下,重新获取焦点后,活动重新运行。从停止状态变为运行状态时,调用此方法。 |
onStart() | 当activity可见时调用此方法。 |
onResume() | 当activity开始与用户交互时调用此方。注意,此时activity位于其活动堆栈的顶部 |
onPause() | 当activity失去前台状态,不再可聚焦,该activity对用户仍然可见时调用。注意,如果activity返回到前台,则紧跟着执行onResume()。如果用户看不到,则紧跟着执行onStop()。 |
onStop() | 当activity对用户不再可见时调用此方法。这通常用于停止动画和刷新UI等。注意,如果该activity返回与用户交互,则执行onRestart(),如果该activity消失,则执行onDestroy()。 |
onDestroy() | 在activity被销毁之前最后调用此方法。发生这种情况的原因可能是activity即将结束。 |
四、活动的启动模式
Android提供了4种启动模式,在开发中,我们需要根据实际情况对activity配置不同启动模式。
配置方法,在AndroidManifest文件中在< activity >标签中使用android:launchMode声明使用模式类型。
standard
该模式是默认模式,未声明的activity默认使用此模式。
该模式下,每启动一次activity,它就会入栈,并处于栈顶位置。即时栈中已经存在该activity,它也会创建新的实例并入栈。
singleTop
该模式下,启动一个activity时,会判断栈顶是否已经是该activity。如果是,则不创建新的activity。如果不是,则创建新的activity并入栈。
singleTask
该模式比较常用,在启动一个activity时,会判断栈中判断是否已经存在该activity。如果存在,则将该activity之上的其他activity全部出栈,直到该activity处于栈顶结束。如果不存在,则创建新的activity并入栈。
singleInstance
该模式比较特殊。在启动一个activity时,会启动一个新的栈来管理该activity。适用场景是需要和其他app共同管理时。