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所需要的资源,有个更深刻的印象:

  1. 手动创建activity

不勾选Generate Layout File 和 Launcher Activity;

Activity模式 android 安卓activity类_Activity模式 android

  1. 创建和加载布局资源

在layout目录下创建Layout resource file。
当布局文件创建完成后,我们在第一步创建好activity的onCreate()方法中调用setContentView()方法,为当前activity加载一个布局。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
  1. 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
  1. 创建对象实现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;
    }
}
  1. Intent传入对象
Intent intent = new Intent(MainActivity.this, IntentActivity.class);
intent.putExtra("test", new Test("test", 18));
startActivity(intent);
  1. 获取Intent中的对象
Test test = (Test) getIntent().getSerializableExtra("test");
Parcelable
  1. 创建对象实现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);
    }
}
  1. Intent传入对象
Intent intent = new Intent(MainActivity.this, IntentActivity.class);
intent.putExtra("test", new TestParcelable("test_Parcelable", 10));
startActivity(intent);
  1. 获取Intent中的对象
TestParcelable test = (TestParcelable) getIntent().getParcelableExtra("test");

三、activity的生命周期

掌握activity的生命周期是很重要的,了解熟悉它后,对我们的开发中资源的创建和释放很有帮助。

活动状态

其中有4个状态,如下:

  1. 运行状态
  2. 暂停状态
  3. 停止状态
  4. 销毁状态

activity的生存期

activity生命周期官网说明.

Activity模式 android 安卓activity类_ide_02

方法名

描述说明

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共同管理时。