生命周期
生命周期状态
Activity的生命周期是指一个Activity从启动到销毁的过程,包括五个状态:启动状态,运行状态,暂停状态,停止状态,销毁状态,其中启动和销毁是过渡状态,Activity不会在这两个状态停止
生命周期方法
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具有四种启动模式,分别是standard,singleTask,singleTop,singleInstance,在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) startActivity(intent);
|
2.隐式意图
隐式意图并没有明确指明要开启的目标组件,而是通过指定action和category等属性信息,系统根据这些信息来寻找目标Activity。
1 2 3 4
| Intent intent = new Intent();
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"); 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