Activity

生命周期

生命周期状态

Activity的生命周期是指一个Activity从启动到销毁的过程,包括五个状态:启动状态,运行状态,暂停状态,停止状态,销毁状态,其中启动和销毁是过渡状态,Activity不会在这两个状态停止

20180613172450735

生命周期方法

onCreate()方法

在Activity创建时调用,通常做一些初始化的设置

1
2
3
4
5
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.relavite);
}

onStart方法

在Activity即将可见时调用

1
2
3
4
5
@Override
protected void onStart() {
super.onStart();
System.out.println("ActivityA is start");
}

onResume方法

在Activity获取焦点开始与用户交互时调用

1
2
3
4
5
6
@Override
protected void onResume() {
super.onResume();
System.out.println("ActivityA is Resume");

}

onPause方法

在当前Activity被覆盖或锁屏时调用

1
2
3
4
protected void onPause() {
super.onPause();
System.out.println("ActivityA is Pause");
}

onStop方法

在Activity对用户不可见时调用

1
2
3
4
5
@Override
protected void onStop() {
super.onStop();
System.out.println("ActivityA is Stop");
}

onDestroy

在Activity销毁时调用

1
2
3
4
protected void onDestroy() {
super.onDestroy();
System.out.println("Activity is Destroy");
}

onRestart

在Activity从停止状态到再次启动时调用

1
2
3
4
protected void onRestart() {
super.onRestart();
System.out.println("ActivityA is restart");
}

启动模式

Activity具有四种启动模式,分别是standardsingleTasksingleTopsingleInstance,在AndroidManifest.xml中通过标签的android:launchMode属性设置

1.standard

这是Activity的默认启动模式,每当启动一个Activity时都会在栈顶创建一个新的实例,在实际开发中,闹钟通常使用这种模式

2.singleTop

当Activity位于栈顶时,如果采用standard模式,则仍然需要创建一个新的实例,不能直接复用,采用singleTop模式则会先判断Activity是否位于栈顶,如果是则直接复用,不是则创建新的实例,实际开发中,浏览器的数千通常采用这种模式

3.singleTask

而singleTask模式在启动Activity时会检查栈中的所有元素,若存在则直接复用该Acivity并且将上面的元素全部弹出,若不存在则重新创建实例

4.singleInstance

这种模式中启动Activity时会自动启动一个新的任务栈来管理Activity实例,无论从那个任务栈中启动该Activity,该实例在整个系统中只有一个,意义在于在不同的程序中共享同一个Activity实例。当启动的Activity不存在时,系统先创建一个任务栈然后再创建Activity实例,若存在则将该实例所在的任务栈移到前台,从而使Activity显示。

Activity的跳转

intent被称为意图,是程序中各个组件直接进行交互的一种重要方式。不仅可以指定当前组件要执行的动作,还能再不同组件之间进行数据传递。一般用于启动Activity,service以及发送广播,intent分为显示意图和隐式意图。

1.显示意图

直接通过名称来开启知道的目标组件,构造方法为Intent(ContextpackageContext,Class<?>cls)来实现,第一个参数为Context表示当前的Activity对象,第二个参数Class表示要启动的目标Activity。

1
2
Intent intent = new Intent(this,Activity02.class)//创建intent对象
startActivity(intent); //开启Activity02

2.隐式意图

隐式意图并没有明确指明要开启的目标组件,而是通过指定action和category等属性信息,系统根据这些信息来寻找目标Activity。

1
2
3
4
Intent intent = new Intent();
//设置action动作
intent.setAction("cn.itcast.START_ACTIVITY");
startActivity(intent);

这里只指定了action,并没有指定category,这是因为在目标Activity的清单文件中配置的category是一个默认值,在调用startActivity()方法自动将这个category添加到Intent中。

只有上面的代码还不足以开启指定的Activity,还需要在目标Activity的清单文件中配置

1
2
3
4
5
6
7
<activity android:name="cn.itcast.Activity02">
<intent-filter>
<!--设置action属性,需要这代码中根据所设置的name打开指定的组件-->
<action android:name="cn.itcast.START_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

在清单文件中目标组件Activity02指定了可以响应的信息,当action和category属性和目标组件设置的内容相同时,目标组件才会被开启。并且每个Intent只能指定一个action但可以指定多个category。

实战演练(打开浏览器)

首先是xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:background="@drawable/p1"
tools:context=".MainActivity">

<Button
android:id="@+id/main_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="30dp"
android:text="原神,启动!" />
</LinearLayout>

关于tools:Tools Attributes - Android Studio Project Site

然后是MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package cn.itcast.openbrowser;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.linerlayout);
Button button =(Button) findViewById(R.id.main_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction("android.intent.action.VIEW");//setAction开启Activity的动作为"android.intent.action.VIEW",这是Android系统内置的一个动作,通过这个动作可以和浏览器进行匹配,然后通过Uri.parse()方法将一个网址字符串解析为Uri对象,在调用intent的setData()方法将这个Uri对象传进去
intent.setData(Uri.parse("http://3jh7.com"));
startActivity(intent);
}
});
}
}

数据传递

Intent具有一系列重载的putExtra(string.name,string value)方法,通过这些方法将数据暂存到intent中,启动另一个Activity之后再从intent中取出

例如

1
2
3
Intent intent = new Intent(this,Activity02.class);
intent.putExtra("extra_data","Hello Activity02");
startActivity(intent);

先通过intent开启Activity,利用putExtra方法传递了一个字符串,其中第一个参数是键用于后面从intent中取值,第二个参数是传递的数据内容

在Activity02中取出数据如下

1
2
Intent intent = getIntent();
string Data = intent.getStringExtra("extra_data");

先通过getIntent方法获取Intent对象,再调用geiStringExtra方法根据传入的键值取出相应的数据,根据数据类型采用不同的方法,这里是字符串,因此用getStringExtra()方法


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3049155267@qq.com

💰

×

Help us with donation