前面我们已经学习,Android开发的项目结构、Android开发的几个常用控件以及Android开发的四个基本布局。好了,接下来,我们来讲讲activisty,概念比较多,理解就好。
度娘是这样说的,Activity是最基本的模块,一般称之为“活动”,在应用程序中,一个Activity通常就是一个单独的屏幕。简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如监听系统事件,为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法来实现各种功能。
其实简单来讲,一个 Activity 包含了用户能够看到的界面,从而于用户进行交互。一个应用程序中可以有零个或者多个Activity。零个 Activity 就表示,这个应用程序不包含与用户交互的界面。
这个我们暂时不细讲,后面一期我会单独讲,你们懂得,一次性讲清楚太累了。哈哈哈。
主要是下面几个操作:
下图为返回栈工作示意图
Android 使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,后进先出,这个栈也被称为返回栈。
每个活动在其生命周期中最多可能会有四种状态。
当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。
当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。
当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
当一个活动从返回栈中移除后就变成了销毁状态。
Activity 类中定义了七个回调方法,覆盖了活动生命周期的每一个环节。
它会在活动第一次被创建的时候调用。
这个方法在活动由不可见变为可见的时候调用。
这个方法在活动准备好和用户进行交互的时候调用。
这个方法在系统准备去启动或者恢复另一个活动的时候调用。
这个方法在活动完全不可见的时候调用。
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
以上七个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
活动在 onCreate() 方法和 onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法中完成释放内存的操作。
活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而在 onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
活动在 onResume() 方法和 onPause() 方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。
启动模式一共有 4 中:standard、singleTop、singTask 和 singleInstance,可以在 AndroidManifest.xml 中通过 标签指定 android:launchMode 属性来选择启动模式。
standard 模式是 Activity 的默认启动模式,在不进行显示指定的情况下,所有 Activity 都会自动使用这种启动模式。这种模式下,每当启动一个新的 Activity,它就会在返回栈的栈顶位置。对于使用 standard 模式启动的 Activity,系统不会在乎这个 Activity 是否已经存在在栈中了。每次启动的时候都会创建一个新的实例。
谁启用了这个模式的 Activity,那么这个 Activity 就属于启动它的 Activity 的任务栈。
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参数,启动活动
}
});}
[video(video-Fgit7o6S-1617798347230)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=629885115)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/57192cd9d1c4056395c1e7586dabfe7bbf6dda2e.jpg)(title-standard 模式演示)]
如果 Activity 指定为 singleTop,在启动 Activity 的时候发现返回栈的栈顶已经是该 Activity 了。则认为可以直接使用它,就不会再创建新的 Activity 实例了。
因为不会创建新的 Activity 实例,所以 Activity 的生命周期就没有什么变化了。但是它的 onNewIntent 方法会被调用。
<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>
@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);
}
});
}
@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);
}
});
}
[video(video-AjEy0Hds-1617800036102)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=459972266)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/d7b685efad35c9ab42087962e6aa41631f12b078.jpg)(title-singleTop模式演示)]
singleTop 很好的解决了重复创建栈顶 Activity 的问题。如果 Activity 没有处于栈顶的位置,还是可能会创建多个 Activity 实例的。如何解决这种问题呢?那就需要借助 singleTask 了。当 Activity 的启动模式为 singleTask 的时候,每次启动该 Activity 的时候系统会首先在返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例。并把这个 Activity 之上的所有 Activity 全部出栈,如果没有就会创建一个新的 Activity 实例。
生命周期正常调用,onNewIntent 也会被调用。
<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>
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: ");
}
}
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 ");
}
}
[video(video-4SgCKvYQ-1617805314522)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=757487122)(image-https://ss.csdn.net/p?http://i1.hdslb.com/bfs/archive/24d86939dee83c50ec49a6bd9f4d1947dad30d97.jpg)(title-singleTask模式演示)]
singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity (其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。意义:假如我们的程序中有一个 Activity 是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个 Activity 实例。那么如何实现呢?假如使用前面 3 中启动模式,肯定不行。因为,我们每个应用程序都有自己的返回栈,虽然是同样这个 Activity,但是在不同的返回栈入栈的时候肯定是创建了新的实例了。而 singleInstance 可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个 Activity,不管是那个应用程序来访问这个 Activity,都共用的同一个返回栈,也就解决了共享 Activity 实例的问题。
<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>
@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);
}
});
}
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);
}
});
}
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());
}
}
[video(video-DnXXcWP8-1617805512686)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=502453955)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/4b014f953f451a2aae22535fa1c312e40fd2b621.jpg)(title-singleInstance模式演示)]
以上就是今天要讲的内容,本文仅仅简单介绍了Android的activity。
博主写作整理不易,点赞加关注一下嘛,三连也可以,嘿嘿。
题目Part-aware Attention Network for Person Re-Identification 作者Wangmeng ...
通过前面两章的介绍,我们已经对XSLT的基本概念和它的转换过程有了一些了解。下...
动机: 排序功能让我们页面上的数据显的更人性化,是我们在网站上见过的很普遍的...
3月22日消息 据外媒 Windows Latest 报道,微软在周五停止了 Windows 10 KB50016...
java的基本数据类型与运算符 这里写目录标题 java的基本数据类型与运算符 数据类...
语法说明: Filter 函数 返回下标从零开始的 数组,其中包含以特定过滤条件为基...
正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串...
引言 在前端项目开发过程中,el-table展示的结果列使用组件形式引入,其中某些字...
复制代码 代码如下: public function fillzero(l1) if len(l1)=1 then fillzero=...
JAVA基础 2021学习理解 前言 一、JVM和GC 1.java跨平台运行原理 2 JVM理解 3 GC(...