安卓学习日记——Activity(一)

本文介绍Android四大组件之一的Activity,包括其概念、状态、生命周期及数据传递方式。讲解了Activity如何通过不同方法响应生命周期变化,并演示了两种传递数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四大核心组件——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自带的,相较于前者,后者的性能方面会比较高,但是代码相对复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值