Android的activity
文章目录
前言
前面我们已经学习,Android开发的项目结构、Android开发的几个常用控件以及Android开发的四个基本布局。好了,接下来,我们来讲讲activisty,概念比较多,理解就好。
一、Activity是什么?
度娘是这样说的,Activity是最基本的模块,一般称之为“活动”,在应用程序中,一个Activity通常就是一个单独的屏幕。简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如监听系统事件,为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法来实现各种功能。
其实简单来讲,一个 Activity 包含了用户能够看到的界面,从而于用户进行交互。一个应用程序中可以有零个或者多个Activity。零个 Activity 就表示,这个应用程序不包含与用户交互的界面。
二、活动的基本用法
这个我们暂时不细讲,后面一期我会单独讲,你们懂得,一次性讲清楚太累了。哈哈哈。
主要是下面几个操作:
1.手动创建活动
2.创建和加载布局
3.在AndroidManifest文件中注册
4.在活动中使用Toast
5.在活动中使用Menu
6.销毁一个活动
三、活动的生命周期
1.返回栈
下图为返回栈工作示意图
Android 使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,后进先出,这个栈也被称为返回栈。
2.活动状态
每个活动在其生命周期中最多可能会有四种状态。
2.1 运行状态
当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。
2.2 暂停状态
当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。
2.3 停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
2.4 销毁状态
当一个活动从返回栈中移除后就变成了销毁状态。
活动的生存期
Activity 类中定义了七个回调方法,覆盖了活动生命周期的每一个环节。
1. onCreate()
它会在活动第一次被创建的时候调用。
2. onStart()
这个方法在活动由不可见变为可见的时候调用。
3. onResume()
这个方法在活动准备好和用户进行交互的时候调用。
4. onPause()
这个方法在系统准备去启动或者恢复另一个活动的时候调用。
5. onStop()
这个方法在活动完全不可见的时候调用。
6. onDestroy()
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
7. onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
以上七个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
1. 完整生存期
活动在 onCreate() 方法和 onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法中完成释放内存的操作。
2. 可见生存期
活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而在 onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
3. 前台生存期
活动在 onResume() 方法和 onPause() 方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。
生命周期示意图:
四、活动的启动模式
启动模式一共有 4 中:standard、singleTop、singTask 和 singleInstance,可以在 AndroidManifest.xml 中通过 标签指定 android:launchMode 属性来选择启动模式。
1.standard 模式
standard 模式是 Activity 的默认启动模式,在不进行显示指定的情况下,所有 Activity 都会自动使用这种启动模式。这种模式下,每当启动一个新的 Activity,它就会在返回栈的栈顶位置。对于使用 standard 模式启动的 Activity,系统不会在乎这个 Activity 是否已经存在在栈中了。每次启动的时候都会创建一个新的实例。
谁启用了这个模式的 Activity,那么这个 Activity 就属于启动它的 Activity 的任务栈。
1.1模式示意图:
1.2FirstActivity的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState);
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式Intent
Intent intent=new Intent(FirstActivity.this,FirstActivity.class);
//构建一个intent,传入FirstActivity.this作为上下文,传入FirstActivity.class作为目标活动
startActivity(intent);//接受intent参数,启动活动
}
});}
1.3APP效果的视频演示
https://www.bilibili.com/video/BV1Tb4y1X7NC
2.singleTop 模式
如果 Activity 指定为 singleTop,在启动 Activity 的时候发现返回栈的栈顶已经是该 Activity 了。则认为可以直接使用它,就不会再创建新的 Activity 实例了。
因为不会创建新的 Activity 实例,所以 Activity 的生命周期就没有什么变化了。但是它的 onNewIntent 方法会被调用。
2.1模式示意图:
2.2ActivityManifest.xml的代码
<activity android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2.3FirstActivity的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "Task id is" + getTaskId());
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
2.4SecondActivity的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity",this.toString());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
2.5APP效果的视频演示
https://www.bilibili.com/video/BV1x5411A7XT
3.singleTask 模式
singleTop 很好的解决了重复创建栈顶 Activity 的问题。如果 Activity 没有处于栈顶的位置,还是可能会创建多个 Activity 实例的。如何解决这种问题呢?那就需要借助 singleTask 了。当 Activity 的启动模式为 singleTask 的时候,每次启动该 Activity 的时候系统会首先在返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例。并把这个 Activity 之上的所有 Activity 全部出栈,如果没有就会创建一个新的 Activity 实例。
生命周期正常调用,onNewIntent 也会被调用。
3.1模式示意图:
3.2ActivityManifest.xml的代码
<activity android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3.3FirstActivity的代码
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "onRestart");
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart: ");
}
}
3.4SecondActivity的代码
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity",this.toString());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity","onDestroy ");
}
}
3.5APP效果的视频演示
https://www.bilibili.com/video/BV1E64y1S74V
4.singleInstance 模式
singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity (其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。意义:假如我们的程序中有一个 Activity 是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个 Activity 实例。那么如何实现呢?假如使用前面 3 中启动模式,肯定不行。因为,我们每个应用程序都有自己的返回栈,虽然是同样这个 Activity,但是在不同的返回栈入栈的时候肯定是创建了新的实例了。而 singleInstance 可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个 Activity,不管是那个应用程序来访问这个 Activity,都共用的同一个返回栈,也就解决了共享 Activity 实例的问题。
4.1模式示意图:
4.2ActivityManifest.xml的代码
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
4.3FirstActivity的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "Task id is"+getTaskId());
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
4.4SecondActivity的代码
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity","Task id is"+getTaskId());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
4.5ThirdActivity的代码
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Log.d("ThirdActivity", "Task id is "+getTaskId());
}
}
4.6APP效果的视频演示
https://www.bilibili.com/video/BV18K411w7NQ
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Android的activity。
博主写作整理不易,点赞加关注一下嘛,三连也可以,嘿嘿。
转载:https://blog.csdn.net/kerio123/article/details/115481504