什么是Activity

Activity是Android应用程序核心组件中最基本的一个,是用户和程序交互的窗口,一个activity通常对应一个单独的视图,一个APP由一个或者多个activity构成,activity用于显示信息给用户,并且之间可以相互进行跳转,activity之间的跳转有返回值。

每一个activity都被定义为一个独立的类,他继承了Android中的android.app.Activity,在Activity类中将使用setContentView方法来显示由视图控件组成的用户界面,并对用户通过这些视图控件所出发的时间做出响应。

activity的四种状态

  1)激活状态,此时activity运行在屏幕前台

  2)暂停状态,此时activity失去焦点,但是用户仍然可以看到(例如这个activity上遮盖了一个透明的或者非全屏的activity)

  3)停止状态,此时activity被其他activity完全覆盖

  4)销毁状态,此时activity将会被系统清理出内存

activity的回调函数

android系统根据生命周期的不同阶段唤起对应的回调函数来执行代码,从启动到销毁一个activity有着一套有序的回调函数。

onCreate()        创建,activity初次创建时被调用,该方法中一般进行一些静态设置。

onStart()           运行,activity对用户即将可见的时候调用

onResume()     获取焦点,当activity将要与用户进行交互时候调用

onPause()         失去焦点,当系统要启动一个其他的activity时调用(在其他activity显示之前调用)

onStop()            暂停,当另外一个activity恢复并遮盖当前activity,导致其对用户不可见时调用。

onDestroy()      销毁,在activity被销毁前所调用的最后一个方法

onRestart()      重新启动

这七个方法贯穿整个activity的生命周期。

一张图来表示

activity的启动与销毁

大多数的APP都包含多个activity,不论这些activity是主activity还是为了响应用户行为而新建的,系统都会调用新的activity实例中的onCreate()方法,通常情况下我们会在onCreate()方法内声明一些UI元素或者定义一些成员变量等基本操作,但onCreate()方法中劲量少做事情,以免程序启动太久都看不到界面。

一旦onCreate()操作结束,系统会立即执行这个activity的onStart()方法和onResume()方法,最终使得activity停留在Resumed状态,直到一些因素发生变化才会改编这个状态,例如切换到另外一个activity或者退出程序。

一旦我们退出软件,系统会执行activity的onDestroy()方法,将activity从系统中完全移除,我们通常是在执行了 onPause() and onStop() 之后再调用onDestroy() 。

activity的暂停与恢复

在使用app的过程中,运行的activity经常会被其他组件挡住,例如提示电量不足的提示框等, activity可见但不可操作,这个时候activity就会调用onPause()方法进去Pause状态,这个方法会停止当前activity进行的操作,并保存那些有可能需要长期保存的信息,如果用户从暂停状态返回到activity,系统会恢复那些数据并执行onResume()方法。

activity的停止与重启

当我们从APP-A切换到APP-B之后,APP-A会调用onStop()方法,在onStop()方法中我们一般释放一些不再需要的资源

当我们从stop状态回到前台时候,会调用onRestart()方法,系统再调用onStart()方法,

activity的生命周期

activity的生命周期可以根据不同的标准分为完整生命周期、可见生命周期和前台生命周期。

从activity最初调用onCreate()方法到最终调用onDestroy()方法的整个过程称之为完整生命周期,在onCreate()方法中设置全局状态,在onDestroy()方法中释放所有资源。

从activity调用onStart()方法到调用对应的onStop()方法的过程称之为可见生命周期,在这个过程中,activity都是对用户可见的(但不一定可以操作)

从activity调用onResume()开始到调用onPause()的整个过程称之为前台生命周期,这段时间内这个activity处于其他所有activity的前面,用户可以与之进行交互。

演示

我们创建一个android工程,然后重写那些方法。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.Menu;
  4. import android.view.MenuItem;
  5.  
  6. public class MainActivity extends Activity {
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. System.out.println("执行onCreate...");
  13. }
  14.  
  15. @Override
  16. protected void onStart() {
  17. // TODO Auto-generated method stub
  18. super.onStart();
  19. System.out.println("执行onStart...");
  20. }
  21.  
  22. @Override
  23. protected void onResume() {
  24. // TODO Auto-generated method stub
  25. super.onResume();
  26. System.out.println("执行onResume...");
  27. }
  28.  
  29. @Override
  30. protected void onPause() {
  31. // TODO Auto-generated method stub
  32. super.onPause();
  33. System.out.println("执行onPause...");
  34. }
  35.  
  36. @Override
  37. protected void onStop() {
  38. // TODO Auto-generated method stub
  39. super.onStop();
  40. System.out.println("执行onStop...");
  41. }
  42.  
  43. @Override
  44. protected void onDestroy() {
  45. // TODO Auto-generated method stub
  46. super.onDestroy();
  47. System.out.println("执行onDestroy...");
  48. }
  49.  
  50. @Override
  51. protected void onRestart() {
  52. // TODO Auto-generated method stub
  53. super.onRestart();
  54. System.out.println("执行onRestart...");
  55. }
  56. }

  在模拟器中运行,查看日志

然后我们按home返回到桌面

按菜单键,选择回到刚才的界面

按返回键退出activity

如何创建一个activity

新建一个activity步骤如下

1)在src中新建一个类继承activity,并重写其onCreate()方法

  1.  
  1. MyActivity.java
  1.  
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4.  
  5. public class MyActivity extends Activity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. // TODO Auto-generated method stub
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.my_activity_layout);// 使用setContentView方法显示一个布局文件
  11. }
  12. }

2)在res---layout中创建一个布局文件,用以显示界面内容

  1.  
  1. my_activity_layout.xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" >
  7.  
  8. <TextView
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="这是一个TextView" />
  12.  
  13. </LinearLayout>

3)在AndroidManiFest.xml中注册这个activity

  1. AndroidManiFest.xml
  2.  
  3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  4. package="com.example.activitytest"
  5. android:versionCode="1"
  6. android:versionName="1.0" >
  7.  
  8. <uses-sdk
  9. android:minSdkVersion="19"
  10. android:targetSdkVersion="19" />
  11.  
  12. <application
  13. android:allowBackup="true"
  14. android:icon="@drawable/ic_launcher"
  15. android:label="@string/app_name"
  16. android:theme="@style/AppTheme" >
  17. <!-- 注册一个activity -->
  18. <activity android:name="com.example.activitytest.MyActivity" >
  19. <!-- 如果是主activity,需要添加如下过滤器来告诉系统这是入口 -->
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22.  
  23. <category android:name="android.intent.category.LAUNCHER" />
  24. </intent-filter>
  25. </activity>
  26. </application>
  27. </manifest>

  这样,一个activity就创建成功了。

如何关闭一个activity

只要按下返回键就可以销毁当前activity,但是假如我们希望通过代码方式来销毁activity,可以使用activity类提供的finish()方法来实现。

修改一下上面的代码

  1. MyActivity.java
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8.  
  9. public class MyActivity extends Activity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. // TODO Auto-generated method stub
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.my_activity_layout);// 使用setContentView方法显示一个布局文件
  15.  
  16. Button button = (Button) findViewById(R.id.finishActivity); // 找到这个按钮
  17. button.setOnClickListener(new OnClickListener() { // 给这个按钮添加一个点击事件
  18.  
  19. @Override
  20. public void onClick(View v) {
  21. finish(); // 当点击按钮时,销毁这个activity
  22. }
  23. });
  24. }
  25.  
  26. @Override
  27. protected void onDestroy() {
  28. // TODO Auto-generated method stub
  29. super.onDestroy();
  30. System.out.println("onDestroy方法被调用");
  31. }
  32. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <TextView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="这是一个TextView" />
  11.  
  12. <Button
  13. android:id="@+id/finishActivity"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:text="关闭这个activity" />
  17.  
  18. </LinearLayout>

   这时候运行该程序,点击按钮,这个activity就会被关闭。

finish()和onDestroy()有什么区别

从上面的代码运行结果来看,控制台上输出了“onDestroy方法被调用”,由此可见,在执行finish()时执行了onDestroy()方法。

实际上他们的区别在于 onDestroy()是生命周期方法,是你的Activity结束的时候由Android系统调用的,你不能直接调用onDestroy()来结束你的Activity,一般做法是调用finish()

Android笔记 (二) Android的核心---Activity的更多相关文章

  1. Android 笔记之 Android 系统架构

    Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...

  2. Android笔记二十七.Service组件入门(一).什么是Service?

    转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Service 1.Service简单介绍     Service为Android四大组件之中 ...

  3. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  4. Android Studio安卓学习笔记(二)Android项目结构

    上一篇代码,我们学习了Android的功能以及如何用Android Studio开发第一个安卓程序.下面就要介绍Android项目结构.为日后学习打基础. 一:Android项目结构 打开MyFris ...

  5. Android笔记(三) 使得Activity之间可以跳转---Intent

    什么是Intent 一个APP肯定不单单由一个Activity构成,我们在使用过程中,经常需要在多个Activity中跳转,Android中Intent可以帮我们来完成在各个Activity中跳转的功 ...

  6. Android笔记: Android版本号

    由于有2套版本号 总是对应不准 记下来做过标记 Android 4.3 ----18 Android 4.2---17 Android 4.1---16 Android 4.0.3---15Andro ...

  7. Android入门(二):Android工程目录结构

    首先我们来看看Android工程的目录结构,如下图: 下面我们来看看每个文件夹都是用来做什么的? 1.src:这个不用多说,它就是保存Java源文件的目录: 2.gen:该文件夹用来保存自动生成的R. ...

  8. Java基础学习笔记二十三 Java核心语法之反射

    类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...

  9. Android笔记:android的适配

    public int Dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayM ...

随机推荐

  1. ABAP DEMO so批量导入

    *&---------------------------------------------------------------------* *& Report YDEMO_015 ...

  2. C#给图片加水印,可设置透明度

    C#给图片加水印,可设置透明度,设置水印的位置可以看一下上一篇哈 /// <summary> /// Creating a Watermarked Photograph with GDI+ ...

  3. 【linux学习笔记四】文件搜索命令

    一 文件搜索 locate //在后台数据库中按文件名搜索 搜索速度更快 locate 文件名 //locate命令所搜索的后台数据库 /var/lib/mlocate //更新数据库 updated ...

  4. 【WAP触屏】YouKu视频弹窗播放组件

    (function(window){ /* youku api : http://open.youku.com/tools 调用方法 : LM_youkuPop.open('XODI5Mzk3MDAw ...

  5. 龙六网络科技有限公司(Dragon six Network Technology Co., Ltd.)

    龙六网络科技有限公司(Dragon six Network Technology Co., Ltd.)

  6. redis 部署

    wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxvf redis-4.0.14.tar.gz mv redis-4. ...

  7. 好消息!iconfont+开始支持彩色图标

    想必关注iconfont的同学都知道,iconfont最近做出了一次重大升级,升级成为iconfont+了,而这次更新,iconfont+居然开始支持彩色图标,这意味着我们能够使用更具有特色更形象的全 ...

  8. LeetCode 179. 最大数(Largest Number) 21

    179. 最大数 179. Largest Number 题目描述 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 每日一算法2019/5/24Day 21LeetCode179. La ...

  9. Duration和Period的区别--通俗易懂

    在jdk1.8以后,对表示日期时间的类型进行了重新分类,这里出现了2个新的类,Duraction 和Period Duraction表示:时间的区间,用来度量秒和纳秒之间的时间值 Period表示:一 ...

  10. [转帖]理解k8s 的 Ingress

    理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...