文章目录Android的activity前言一、Activity是什么?二、活动的基本用法1.手动创建活动2.创建和加载布局3.在AndroidManifest文件中注册4.在活动中使用Toast5.在活动中使用Menu6.销毁一个活动三、活动的生命周期1.返回栈2.活动状态2.1 运行状态2.2 暂停状态2.3 停止状态2.4 销毁状态活动的生存期1. onCreate()2. onStart()3. onResume()4. onPause()5. onStop()6. onDestroy()7. onRestart()1. 完整生存期2. 可见生存期3. 前台生存期生命周期示意图:四、活动的启动模式1.standard 模式1.1模式示意图:1.2FirstActivity的代码1.3APP效果的视频演示2.singleTop 模式2.1模式示意图:2.2ActivityManifest.xml的代码2.3FirstActivity的代码2.4SecondActivity的代码2.5APP效果的视频演示3.singleTask 模式3.1模式示意图:3.2ActivityManifest.xml的代码3.3FirstActivity的代码3.4SecondActivity的代码3.5APP效果的视频演示4.singleInstance 模式4.1模式示意图:4.2ActivityManifest.xml的代码4.3FirstActivity的代码4.4SecondActivity的代码4.5ThirdActivity的代码4.6APP效果的视频演示总结
前言
前面我们已经学习,AndroID开发的项目结构、AndroID开发的几个常用控件以及AndroID开发的四个基本布局。好了,接下来,我们来讲讲activisty,概念比较多,理解就好。
一、Activity是什么?
度娘是这样说的,Activity是最基本的模块,一般称之为“活动”,在应用程序中,一个Activity通常就是一个单独的屏幕。简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如监听系统事件,为用户显示指定的VIEw,启动其他Activity等。所有应用的Activity都继承于androID.app.Activity类,该类是AndroID提供的基层类,其他的Activity继承该父类后,通过父类的方法来实现各种功能。
其实简单来讲,一个 Activity 包含了用户能够看到的界面,从而于用户进行交互。一个应用程序中可以有零个或者多个Activity。零个 Activity 就表示,这个应用程序不包含与用户交互的界面。
二、活动的基本用法
这个我们暂时不细讲,后面一期我会单独讲,你们懂得,一次性讲清楚太累了。哈哈哈。
主要是下面几个 *** 作:
三、活动的生命周期1.返回栈
下图为返回栈工作示意图
2.活动状态AndroID 使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,后进先出,这个栈也被称为返回栈。
每个活动在其生命周期中最多可能会有四种状态。
2.1 运行状态2.2 暂停状态当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。
2.3 停止状态当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。
2.4 销毁状态当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
活动的生存期当一个活动从返回栈中移除后就变成了销毁状态。
1. onCreate()Activity 类中定义了七个回调方法,覆盖了活动生命周期的每一个环节。
2. onStart()它会在活动第一次被创建的时候调用。
3. onResume()这个方法在活动由不可见变为可见的时候调用。
4. onPause()这个方法在活动准备好和用户进行交互的时候调用。
5. onStop()这个方法在系统准备去启动或者恢复另一个活动的时候调用。
6. onDestroy()这个方法在活动完全不可见的时候调用。
7. onRestart()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
以上七个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
1. 完整生存期2. 可见生存期活动在 onCreate() 方法和 onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate() 方法中完成各种初始化 *** 作,而在 onDestroy() 方法中完成释放内存的 *** 作。
3. 前台生存期活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而在 onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
生命周期示意图:四、活动的启动模式活动在 onResume() 方法和 onPause() 方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。
启动模式一共有 4 中:standard、singletop、singTask 和 singleInstance,可以在 AndroIDManifest.xml 中通过 标签指定 androID:launchMode 属性来选择启动模式。
1.standard 模式1.1模式示意图:1.2FirstActivity的代码@H_22_403@@H_933_404@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效果的视频演示<iframe allowfullscreen="true" data-mediaembed="bilibili" ID="Fgit7o6S-1617798347230" src="https://player.bilibili.com/player.HTML?aID=629885115"></iframe>standard 模式是 Activity 的默认启动模式,在不进行显示指定的情况下,所有 Activity 都会自动使用这种启动模式。这种模式下,每当启动一个新的 Activity,它就会在返回栈的栈顶位置。对于使用 standard 模式启动的 Activity,系统不会在乎这个 Activity 是否已经存在在栈中了。每次启动的时候都会创建一个新的实例。
谁启用了这个模式的 Activity,那么这个 Activity 就属于启动它的 Activity 的任务栈。
standard 模式演示
2.singletop 模式2.1模式示意图:2.2ActivityManifest.xml的代码@H_22_403@如果 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>
2.3FirstActivity的代码@H_22_403@@H_933_404@ @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的代码@H_22_403@@H_933_404@@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效果的视频演示<iframe allowfullscreen="true" data-mediaembed="bilibili" ID="AjEy0Hds-1617800036102" src="https://player.bilibili.com/player.HTML?aID=459972266"></iframe>singletop模式演示
3.singleTask 模式3.1模式示意图:3.2ActivityManifest.xml的代码@H_22_403@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>
3.3FirstActivity的代码@H_22_403@@H_933_404@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的代码@H_22_403@@H_933_404@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效果的视频演示<iframe allowfullscreen="true" data-mediaembed="bilibili" ID="4SgCKvYQ-1617805314522" src="https://player.bilibili.com/player.HTML?aID=757487122"></iframe>singleTask模式演示
4.singleInstance 模式4.1模式示意图:4.2ActivityManifest.xml的代码@H_22_403@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>
4.3FirstActivity的代码@H_22_403@@H_933_404@ @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的代码@H_22_403@@H_933_404@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的代码@H_22_403@@H_933_404@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效果的视频演示<iframe allowfullscreen="true" data-mediaembed="bilibili" ID="DnXXcwp8-1617805512686" src="https://player.bilibili.com/player.HTML?aID=502453955"></iframe>singleInstance模式演示
总结
以上就是今天要讲的内容,本文仅仅简单介绍了AndroID的activity。
博主写作整理不易,点赞加关注一下嘛,三连也可以,嘿嘿。 总结
以上是内存溢出为你收集整理的Android的activity(Android学习第四课)全部内容,希望文章能够帮你解决Android的activity(Android学习第四课)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)