Android Activity(一)初识

       Activity,在Android开发中,经常使用到,出境频率是相当高的。今天就来仔细研究一下Activity。

一、概述。

       以下描述信息来自Android官网。

      Activity是单独的,用于处理用户操作。几乎所有的Activity都与用户交互,因此Activity类可以创建一个窗口,使用setContentView()来设置UI。Activity经常呈现给用户是全屏窗口,它们也可以以其他方式使用:浮动窗口,通过设置一个主题;或者嵌入另外一个Activity。

      有两个方法几乎所有的Activity子类都会实现:

1.onCreate()。

在该方法中初始化Activity。最重要的是,这里通常会调用setContentView()来加载布局文件为设置UI,并且使用findViewById()方法取回你在UI中交互的组件。

2.onPause()。

当用户离开Activity时需要处理的地方。最重要的是,用户进行的任何更改都应该在此提交。

      为了能够使用Context.startActivity(),所有的Activity类都必须在AndroidManifest.xml文件中定义有相关的“Activity”项。

      从上面的简单描述中,可以得知,Activity主要是用来与用户交互,它可以加载UI布局。Activity是Android系统特有的类,我们在使用时不能‘new’。

      下面介绍Activity生命周期。

二、Activity生命周期。

首先看一张图


该图是Android官方文档中的Activity生命周期图。

由上图可以得知,(场景是A-Activity有一个按钮,点击后会启动B-Activity)

1.A-Activity从启动到运行,会依次调用onCreate() -> onStart() -> onResume();

2.此时点击按钮启动B-Activity,将依次执行A:onPause() -> B:onCreate() -> B:onStart() -> B:onResume() -> A:onStop();

3.此时如果点击Back键,将依次执行B:onPause() -> A:onRestart() -> A:onStart() -> A:onResume() -> B:onStop() -> B:onDestroy();

4.此时如果再次点击Back键,将依次执行A:onPause() ->  A:onStop() -> A:onDestroy();

下面仔细介绍这几个生命周期的方法;

1.onCreate();表示Activity正在被创建。

该方法是Activity创建时第一个调用的方法,用于初始化,例如加载布局、显示数据等。

2.onStart();表示Activity正在被启动。

该方法表示Activity已经可见了,但是还未显示,用户还看不到,没有获取到焦点;该方法可能会执行多次。

3.onResume();表示Activity已经可见。

该方法表示Activity已在前台可见,可以与用户交互了,该方法常用于重新加载数据(刷新数据),当Activity重新回到前台时,会调用该方法;该方法可能会执行多次。

4.onPause();表示Activity正在停止。

该方法表示Activity失去焦点,但是对用户仍然可见;该方法可能会执行多次;可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause()必须先执行,新Activity的onResume()才会执行。

5.onStop();表示Activity即将停止。

该方法表示Activity不可见;该方法可能会执行多次;可以做一些稍微重量级的回收工作,同样不能太耗时。

6.onDestroy();表示Activity即将销毁。

Activity正常销毁时会调用,一般在这个方法中释放资源以及回收。

7.onRestart() ;表示Activity正在重新启动。

Activity从后台重新显示到前台,由不可见变为可见状态。

如果当前Activity的Theme为Translucent(半透明) 或者启动的B-Activity是Dialog ,那么中断就只调用A-Activity的onPause() ,恢复的时候只调用A-onResume()。onStop()和onStart()是成对出现的,onPause()和onResume()是成对出现的。

PS:

1.onSaveInstanceState( Bundle outState)

当某个Activity变得“容易”被系统销毁时,该Activity的onSaveInstanceState()就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。

outState 参数作用 :
-- 数据保存 : Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中;
-- 恢复数据 : 在 Activity 的 onCreate()方法 创建 Activity 的时候会传入一个 Bundle 对象, 这个 Bundle 对象就是这个 outState 参数;(1).当用户按下HOME键时。

调用时机 : Activity 容易被销毁的时候调用, 注意是容易被销毁, 也可能没有销毁就调用了;
-- 按下Home键 : Activity 进入了后台, 此时会调用该方法;
-- 按下电源键 : 屏幕关闭, Activity 进入后台;
-- 启动其它 Activity : Activity 被压入了任务栈的栈底;
-- 横竖屏切换 : 会销毁当前 Activity 并重新创建;

总而言之,onSaveInstanceState()的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的Activity,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。

onSaveInstanceState()方法调用注意事项 :
-- 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
-- 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
-- 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存;
-- 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;

2.onRestoreInstanceState( Bundle savedInstanceState)

  需要注意的是,onSaveInstanceState()方法和onRestoreInstanceState()方法“不一定”是成对的被调用的
  方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
-- Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;
-- 位于生命周期位置吧 : 该方法在 onResume() 方法之前保存信息;

三、启动模式。

首先我们需要知道的是,一个应用中所有的Activity都是在一个栈中维护的,这个栈叫做任务栈(Task Stack)

(1).一个应用程序一般都是由多个Activity组成的;

(2).一个应用程序一旦启动,系统就会给它分配一个任务栈,当该应用中所有的Activity都退出后,任务栈就清空了;

(3).在Android系统中存在多个任务栈,一个应用程序一个任务栈;

启动一个Activity有两种方式:

首先SecondActivity需要在 AndroidManifest.xml 中注册,

(1).Activity.startActivity()方法,

...
<activity
            android:name=".SecondActivity"
            android:label="@string/app_name"/>
...
在代码中启动新的Activity方法,

        Intent intent =new Intent(MainActivity.this,SecondActivity.class);
        startActivity(intent);

该启动方式,无返回结果,也就是说不需要把数据从新启动的Activity返回给上个Activity。其实startActivity()方法最终还是调用了下面的startActivityForResult()方法。

(2).startActivityForResult (Intent intent, int requestCode)方法,

requestCode的值是自定义的,用于识别跳转的目标Activity。跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。

Activity的启动模式有4中,分别是:

1.standard,

标准模式,也是默认的启动模式,每次都会启动一个新的Activity实例加入到任务栈中;

2.singleTop,

栈顶模式,如果要开启的Activity在任务栈的顶部已经存在,就不会创建新的实例,那么将会调用Activity的newInstance()方法,否则将创建一个新的Activity实例加入到任务栈中;

3.singleTask,

如果要开启的Activity在任务栈中已经存在,则复用该Activity,将调用Activity的newInstance()方法,并且会清空任务栈中该Activity的之上的所有Activity;否则将创建一个新的Activity实例加入到任务栈中;

4.singleInstance

单例模式,该Activity会独享一个单独的任务栈,该任务栈中只能有这个Activity,不能有其他实例;

这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置中的launchMode属性。

四、数据传递。

      两个Activity之间想要传递数据、信息,要怎么操作呢?那就得使用Intent(运输大队长)。

      例如,从MainActivity需要传递数据至新启动的SecondActivity,

          Intent intent =new Intent(MainActivity.this,SecondActivity.class);
          intent.putExtra("info", 12);
          startActivity(intent);
Intent还可以启动一个Activity,启动一个Service,发起一个广播Broadcasts,

startActvity( ),startService( ),bindService( ),sendBroadcasts( )

      Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。

如果我们要打电话,可以这样写,

        Intent intent =new Intent(Intent.ACTION_CALL);
        startActivity(intent);

有关Intent的使用,还有很多,此处就不详说了!请读者自行查阅文档!


好了,有关Activity的认识、生命周期、任务栈等基础知识就介绍到这里!下篇文章就着手通过Activity的源码,对其进行分析!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值