四大核心组件——Activity
简介:一个Activity代表一个界面,即一个活动。活动开始,则Activity组件启动,活动结束,则代表一个Activity组件生命周期结束
- 内部概念
1)Application
2)Activity
3)Activity栈
4)task
一整个应用就是一个Application,即平时说的APP
图解
其中123代表的是一个个Activity,3表示是另一个APP里的Activity,Activity都存放在Activity栈里,先进后出。两个APP进行切换,就形成了任务之间的关系。
- Activity状态
1)Resumed 一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可交互的激活状态。
2)Paused当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
3)Stoped 当Activity被另外一个Activity覆盖、失去焦点并不可见时处于Stoped状态。 - Activity生命周期
七大方法
public class MyActivity extends Activity{
//Activity创建时被调用
protected void onCreate(Bundle savedlnstanceState);
//Activity可见时被调用
protected void onStart();
//Activity重新可见时被调用,接着会调用onStart()
protected void onRestart();
//Activity获得焦点,可进行输入时被调用
protected void onResume();
//Activity失去焦点,但可见时被调用(在其它应用需要内存时,可能会被kills)
protected void onPause();
//Activity完全不可见时被调用(会被系统kills)
protected void onStop();
//Activity被销毁时被调用(会被系统kills)
protected void onDestroy();
}
图解
运行过程示例
应用启动后
点击home点后
重新点击应用
关闭应用
- 七大方法详解
onCreate:Activity创建时第一个调用的方法,通常我们在该方法中加载布局文件,初始化UI组件,事件注册等等
onStart:在onCreate方法之后调用,用于显示界面,但用户还不能进行交互
onRestart:当一个stoped状态的Activity被返回时调用,之后再调用onStart进入运行状态
onResume:在onStart之后调用,该方法执行完成后,用户可以进行交互,当前Activity进入resumed状态。当一个paused状态的activity被重新返回时,会再次调用该方法,让Activity进入运行状态
onPause:当其它Activity(透明或窗口模式)进入时,该方法会被调用,让当前Activity进入paused状态(暂停状态)。当前Activity还可见但不可交互,如果其它更高优先级的APP需要内存时,当前Activity可能会被销毁(kill)。当前Activity被返回时会调用onResume方法
onStop:当其它Activity覆盖该Activity时,会被调用,当前Activity进入stoped状态(停止状态)。不可见,如果其它更高优先级的APP需要内存时,当前Activity可能会被销毁(kill)。 当前Activity被返回时会调用onRestart方法
onDestroy:当前Activity被销毁时调用,通常在该方法中用来释放资源,当前Activity killed
- Activity传递数据
方法一:
intent与Bundle使用
关键代码块
/**
* 启动ActivityB,并且传递数据
* @param v
*/
public void sendClick(View v){
//创建一个意图(想干什么)参数(上下文,要跳转的组件的字节码)
Intent intent=new Intent(this,MainActivityB.class);
String info=editText_info.getText().toString();
//封装要传递的数据
Bundle data=new Bundle();
data.putString("info",info);
intent.putExtra("data",data);
startActivity(intent);
}
MainActivityB 接受传递过来的数据并显示
private TextView textView_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_b);
textView_info=findViewById(R.id.info);
Intent intent=getIntent();
Bundle data=intent.getBundleExtra("data");
String info=data.getString("info");
textView_info.setText(info);
}
方法二:
使用Intent直接传递数据
public void sendClick(View v){
//创建一个意图(想干什么)参数(上下文,要跳转的组件的字节码)
Intent intent=new Intent(this,MainActivityB.class);
String info=editText_info.getText().toString();
intent.putExtra("info",info);
startActivity(intent);
}
接收数据代码
private TextView textView_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_b);
textView_info=findViewById(R.id.info);
Intent intent=getIntent();
String info=intent.getStringExtra("info");
textView_info.setText(info);
}
效果图
- 传递对象
方法一
使用Serializable序列化方式传递对象。(消耗性能和资源较大)
新建一个类,确定要传递的对象的属性
public class Cat implements Serializable {
String name;
int age;
String type;
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
}
传递对象
public void sendObjClick(View v){
//要传递的对象
Cat cat=new Cat();
cat.name="皮卡丘";
cat.age=2;
cat.type="无上传说";
Intent intent=new Intent(this,MainActivityB.class);
intent.putExtra("cat",cat);
startActivity(intent);
}
接收对象
Cat cat= (Cat) intent.getSerializableExtra("cat");
textView_info.setText(cat.toString());
方法二
使用Parcelable序列化方式传递对象。(性能比较高,使用系统自带的打包方式传递数据)
创建一个类用于确定对象的属性
import android.os.Parcel;
import android.os.Parcelable;
public class Dog implements Parcelable {
String name;
int age;
String type;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(type);
}
//对象的创建器
public static final Parcelable.Creator<Dog>CREATOR
=new Parcelable.Creator<Dog>(){
public Dog createFromParcel(Parcel in){
Dog dog=new Dog();
dog.name=in.readString();
dog.age=in.readInt();
dog.type=in.readString();
return dog;
}
public Dog[] newArray(int size){
return new Dog[size];
}
};
}
传递数据
public void sendObj2Click(View v){
Dog dog=new Dog();
dog.name="哮天犬";
dog.age=1;
dog.type="看门犬";
Intent intent=new Intent(this,MainActivityB.class);
intent.putExtra("dog",dog);
startActivity(intent);
}
接收对象
Dog dog=intent.getParcelableExtra("dog");
textView_info.setText(dog.toString());
两种方法的区别在于类的继承不同,Serializable采用的是Java的IO方式传递数据,Parcelable则是as自带的,相较于前者,后者的性能方面会比较高,但是代码相对复杂。