活动
活动,即Activity,是Android中的四大组件之一,它的功能主要是程序与用户之间进行交互。一个程序可以包含零个至多个活动。我们在新建的项目中找到main—java—com.example.activity,然后点击右键,选择new—activity—Empty Activity,之后会出现一个创建活动的界面:
创建活动
-
Activity Name
是指你要创建的活动的名称。 -
General Layout File
是指采用最基本的活动的配置,例如为活动创建布局,如果勾选了则这些配置系统都会自动帮你完成。 -
Launcher Activity
是否将该活动设定为主活动。 -
Backwards Compatibility
表示是否启用向下兼容模式来兼容那些低版本得android系统。
在finish之后,系统就会自动的帮我们重写Activity的OnCreate()方法,每一个活动创建之后都应该重写该方法:
重写方法
至此,最基本的活动我们就创建出来了,但是这个时候我们是无法运行该程序的,因为还没有为程序配置好主活动,所以当程序运行后不知道该首先启动哪一个活动,所以我们需要手动的配置该活动为程序的主活动:
打开src—main—AndroidManifest.xml,一般所有的活动都会在这里进行注册,当然强大的AS已经自动帮我们完成了注册,接下来就是在<activity>标签的内部加入<intent-filter>并且在这之中写入<actionandroid:name="android.intent.action.MAIN"/>
和<category android:name="android.intent.category.LAUNCHER"/>
即可设定好主活动。
活动之间的切换
在一个APP中不可能只有一个一个活动,一般我们都是会有多个活动串在一起来组成一个完整的程序。而要让每一个活动之间能够互相跳转,就需要使用Intent了。
1.显式Intent
首先来介绍显式Intent,我们再创建一个活动,叫做SecondActivity,然后我们在first_lay out.xml中创建一个按钮,然后回到FirstActivity.java中修改代码:
package com.example.yzbkaka.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button)findViewById(R.id.button_1); //创建一个按钮并将button1的id传入
button1.setOnClickListener(new View.OnClickListener(){ //为button1设置一个监听
@Override
public void onClick(View v){ //当点击button1时会执行以下代码
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); //建立Intent对象
startActivity(intent); //执行Intent
}
});
}
}
在上述代码中注释已经解释了一部分,这里需要重点介绍的是Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
,构造Intent对象的构造函数需要2个参数,一个是当前活动的Context',在这里就是FirstActivity,另一个就是要转入的活动,这里就是SecondActivity.class,最后是使用startActivity()的方法讲intent传进去就可以了。之后我们运行程序,然后点击按钮就会发现活动跳转了。
2.隐式Intent
因为上面的显式Intent的用法十分的明显,所以叫做显式Intent。而这里要介绍的隐式Intent则是含蓄了许多,它并不明确的指出我们想要跳转到哪个活动,而是通过指定一系列更为抽象的action和category来交给系统去分析然后找出合适的启动活动。
使用隐式Intent,我们首先要在AndroidManifest.xml中去配置<action>和<category>,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yzbkaka.activity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
可以看到在这里我们在SeconeActivity中加入了一段<intent-filter>,并在当中添加了两行代码,首先是在<action>标签中加上了<action android:name="com.example.activite st.ACTION_START"/>
,它是指当前的活动可以响应这个action;而在<category>标签中添加的<category android:name="android.intent.category.DEFAULT"/>
是指当前活动能够响应的Intent中还可能带有category。需要注意的是只有当<action>和<category>中的内容相匹配时,这个活动才能够响应Intent。
接着我们修改FirstActivity.java中的代码:
package com.example.yzbkaka.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button)findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("com.example.activitest.ACTION_START");
startActivity(intent);
}
});
}
}
在这里我们使用了Intent的另一个构造函数,在这个构造函数里面是传入的action字符串,这表明我们想要启动能够响应com.example.activitest.ACTION_START
这个action的活动。同时由于android.intent.category.DEFAULT
是一个默认的字符串,所以在使用startActivity(intent)的时候category会被默认添加到Intent当中,所以这个时候<action>和<category>就全部匹配了。
每个Intent中只能指定一个action,但是却可以指定多个category,我们可以对Intent使用addCategory()的方法来进行添加,但是要主要必须先在AndroidManifest.xml配置好才能添加,否则程序就会报错。
销毁活动
其实销毁一个活动是十分简单的,直接在手机上点击back建键就可以了,除此以外,我们还可以在代码中进行销毁,在为Button1设置的监听中我们加入代码:
......
public void onClick(View v){
finish(); //直接finish掉就可以销毁活动
}
活动的生命周期
在Android中是使用Task来管理活动的,而一个任务就是一个存放许多个活动的栈,而栈是一种后进先出的结构,所以当我们启动了一个活动,这个活动就会入栈并且位于栈顶的位置,而当我们按back键或者是使用finish()销毁的时候这个活动就会出栈,而它下面的活动就会被顶到栈顶成为新的主活动。
每个活动在生命周期中最多可能有4种生存状态,即运行状态、暂停状态、停止状态和销毁状态。而Activity类中定义了7个回调方法,这些方法覆盖了活动生命周期的每一种状态,下面来具体介绍这7个方法:
-
onCreate()
这个方法是创建活动之后的初始操作,一般在这个方法的内部我们会进行加载布局、绑定事件等操作。 -
onStart()
当事件活动出来之后我们就可以使用这个方法让活动由不可见变为可见(即将活动顶到栈顶)。 -
onResume()
这个方法是在活动准备和用户进行交互的时候调用。 -
onPause()
这个方法会在系统准备去启动或者恢复另一个活动的时候去调用。 -
onStop()
这个方法会在活动完全不可见的时候去调用。 -
onDestroy()
这个方法会在活动被销毁之前调用,之后活动状态将会变为销毁状态。 -
onRestart()
这个方法会在活动由停止状态变为运行状态之前调用。
了解了这7个方法,我们就可以用一张图来归纳出活动的生存周期了:
活动的生命周期
活动的启动模式
在Android中活动的启动模式是有4种:standard、singleTop、singleTask和singleInstance。我们可以在AndroidManifest.xml中修改<activity>标签中添加android:launchMode
来选择启动模式。
1.stadnard模式
standard模式是AS中活动的默认启动模式。我们知道当我们启动一个新的活动时,该活动就会入栈成为栈顶,但是如果使用standard模式启动活动的话,系统就不会检查栈中是否存在这个活动,而是会重新创建该活动的实例。
standard启动模式
2.singleTop模式
standard启动模式有一点“粗鲁”,因为每次回到重复的活动时都会重新创建一个该活动的对象,这样其实是很浪费资源的,但是singleTop模式就很好的解决了这个问题。singleTop模式的特点是当我们要启动活动时如果发现该活动已经是返回栈的栈顶,则就会让系统直接使用它,而不是重新创建一个。
singleTop启动模式
3.singleTask模式
singleTask模式相对于singleTop模式则更加极端一些,它的方式在当启动活动时系统会首先在栈中检查是否存在该活动的实例,如果发现则是直接使用该实例,并且把这个实例之上的所有活动实例都出栈,如果没有发现则会重新创建一个新的活动实例。
singleTask启动模式
4.singleInstance模式
singleInstance模式是这些启动模式中最复杂的一个,但也是最适合在复杂的APP中使用的。使用singleInstance模式的活动会启用一个新的栈来存放管理这个活动。而使用其他模式的活动则会放在另一个栈中。这样做的好处就是可以共享活动实例。
singleInstance启动模式
网友评论