A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张老师 黑马粉丝团   /  2016-9-29 16:17  /  2034 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 就业部_安卓组 于 2016-11-25 15:57 编辑

       Activity 是 Android 四大组件之一 ,可以说一个Android手机里处处都是它的影子,个人认为,它的出现频率比另外三个组件的总和还要高。既然如此,那什么是Activity呢?今天我就稍微浅谈一下我对Activity的认识,由于笔者才疏学浅,有错误的地方还请各位多加指正。

       首先,学习Android我认为最有效的方式就是看官方文档,因为这是最权威的地方。官方文档是这么描述Activity的:
       An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface. The window typically fills the screen, but may be smaller than the screen and float on top of other windows.

       其实它的意思就是说Activity是一个应用程序的组件,可以和用户做交互,比如打电话、拍照啊等等。
       接下来我们来了解一下Activity的起源和用法。

一、Activity的生命周期

       就像一个人要经历从出生到死亡一样,Activity也有自己的生命周期,并且在特定的时候会走相应的生命周期。

       官方文档用一张图说明了Activity的生命周期,如下:

      

       当Activity启动的时候首先会走onCreate,销毁的时候会走onDestroy。Activity可以在多种形态间进行切换,并以此来控制自己的生命周期。


onCreate():

       文档说,这是你必须实现的一个方法,当创建了你的Activity时,这是系统第一个走的生命周期,你可以在这里做一些初始化工作,比如调用setContentView去加载界面布局或者初始化一些数据等等。


onStart():

       这表示当前Activity正在被启动,而这个时候其实Activity已经可见了,但是还不能与我们进行交互。因为它还没有出现在前台,只是在后台。


onResume():

       表示Activity已经出现在前台,并且可以跟我们进行交互。它跟onStart()的区别就是,一个在前台并且可交互而另一个在后台还不能交互。


onPause():

       这个状态,就是说当Activity被挡住一部分的时候会回调,注意:是挡住一部分。就是说,这个时候Activity已经没有焦点了,接受不到用户的输入了。一般情况下,走完这个生命周期接下来onStop()会被调用。后面会提到其他情况。


onStop():

       当Activity被完全覆盖,即不能被用户所看到的时候会回调这个方法,此时Activity已经不可见,仅仅在后台运行。我们可以在这里做一些回收的工作,比如数据的保存或者动画的停止,但不要太耗时。


onDestroy():

       表示Activity被销毁,这是Activity生命周期里的最后一个回调,如字面意思,就是销毁,在这里可以做一些回收工作以及资源的释放。


onRestart():

       也许你注意到上图右边还有一个生命周期,为什么这个在右边呢?它表示的意思是重新启动,也就是说当Activity从不可见的状态切换回可见时会回调这个方法。比如说当你突然接到了一个电话,挂了电话之后再回来时,这就经历了从可见变为不可见再变为可见的一个过程。就会回调这个方法。


       说了一大堆概念,是时候搞一搞代码了。

[Java] 纯文本查看 复制代码
public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        System.out.println("MainActivity.onCreate");  
    }  
  
    @Override  
    protected void onStart() {  
        super.onStart();  
  
        System.out.println("MainActivity.onStart");  
    }  
  
    @Override  
    protected void onResume() {  
        super.onResume();  
  
        System.out.println("MainActivity.onResume");  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
  
        System.out.println("MainActivity.onPause");  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
  
        System.out.println("MainActivity.onStop");  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
  
        System.out.println("MainActivity.onDestroy");  
    }  
  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
  
        System.out.println("MainActivity.onRestart");  
    }  
}


       当程序启动的时候,控制台的log如下:
[Java] 纯文本查看 复制代码
09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onCreate  
09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onStart  
09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onResume

       当我按Home键时,程序从前台切换到后台:
[Java] 纯文本查看 复制代码
09-12 18:59:13.476 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onPause  
09-12 18:59:14.040 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStop

       当我再次点击应用时:
[Java] 纯文本查看 复制代码
09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onRestart  
09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStart  
09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onResume

       为什么onDestroy不走呢?那我来试试点击后退键
[Java] 纯文本查看 复制代码
09-12 19:01:26.252 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onPause  
09-12 19:01:26.712 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStop  
09-12 19:01:26.712 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onDestroy  

基于以上现象,我们来总结一下:

       (1)当应用第一次启动,回调:onCreate->onStart->onResume。

       (2)当切换到后台时,回调:onPause->onStop。

       (3)当再次回来,回调:onRestart->onStart->onResume。

       (4)当我按返回键的时候,回调:onPause->onStop->onDestroy。


二、创建一个Activity

       讲了那么多偏概念性的东西,那么我们该怎么去使用它呢?

       打开官方文档看一下,发现是这么说的:


     To create an activity, you must create a subclass ofActivity(or an existing subclass of it). In your subclass, you need to implement callback methods that the system calls when the activity transitions between various states of its lifecycle, such as when the activity is being created, stopped, resumed, or destroyed. The two most important callback methods are:


onCreate():


      You must implement this method. The system calls this when creating your activity. Within your implementation, you should initialize the essential components of your activity. Most importantly, this is where you must callsetContentView() to define the layout for the activity's user interface.


       官方文档上说,首先你要创建一个类继承自Activity或者Activity的子类,这是第一步。其次,你要实现它的一些方法,比如onCreate()、onResume()、onStop()、onDestroy()等等,这是第二步。最后还要记得在manifest里声明。


       其实简而言之就是三部曲:一继承二重写三声明。

       好,开始搞代码,试一试

[Java] 纯文本查看 复制代码
public class MainActivity extends Activity {// 第一步 继承Activity或者其子类  

   // 第二步 重写onCreate方法(必须重写的)     
@Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        System.out.println("MainActivity.onCreate");  
    }  
  
}

第三步,清单文件声明

[XML] 纯文本查看 复制代码
<activity android:name=".MainActivity">// 声明的Activity的名字,全类名  
            <intent-filter> // 意图过滤器  
                <action android:name="android.intent.action.MAIN" /> // 动作  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
</activity>

       做了这些之后,我们就做好了创建Activity了。

       我们经常看到点击了某个按钮之后就切换了一个页面,接下来看一看如何进行页面之间的跳转。

       按照三部曲的形式再创建一个Activity,比如叫SecondActivity,然后给按钮写一个点击事件,当点击的时候,执行以下代码:

[Java] 纯文本查看 复制代码
Intent intent = new Intent(MainActivity.this, SecondActivity.class);  
          
startActivity(intent);

       这样就可以开启一个名为SecondActivity的页面了,这叫做通过intent意图开启一个Activity

       intent 意思是意图,上述的开启方式叫显示意图,还有另一种开启的形式叫隐式意图,如下:


[Java] 纯文本查看 复制代码
Intent intent = new Intent();  
// 这里的setAction就是AndroidManifest.xml中的action的name值        
intent.setAction("com.mesmerize.activity.SecondActivity");  
          
startActivity(intent);


       如果是用隐式意图的形式开启Activity,那么切忌清单文件中的category的值一定要为.DEFAULT,不然会导致匹配失败。

以上是两种启动Activity的形式。

       但是,有些时候可能是要搞一些系统的东西,比如说发短信、邮箱、打电话,这些可怎么办呢?其实Android已经提供了相应的方法了,比如说官方文档示例是以发邮件为例:

[Java] 纯文本查看 复制代码
Intent intent = new Intent(Intent.ACTION_SEND);  
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);  
          
startActivity(intent);[


       这个是官网文档上给的例子,recipientArray其实就是一个容器、数组,因为Android规定邮件必须以数组的形式传入,比如详细点来说:
[Java] 纯文本查看 复制代码
String[] email = {"50****[url=mailto:5@qq.com]5@qq.com[/url]"};                // 需要注意,email必须以数组形式传入    
Intent intent = new Intent(Intent.ACTION_SEND);    
intent.setType("message/rfc822");              // 设置邮件格式    
intent.putExtra(Intent.EXTRA_EMAIL, email);           // 接收人    
intent.putExtra(Intent.EXTRA_CC, email);         // 抄送人    
intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分");    // 主题    
intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分");        // 正文    
startActivity(Intent.createChooser(intent, "请选择邮件类应用")); 


       以上是关于发送邮件的,当然不止这么点功能,还有打电话发短信啊等等,我就不再一一列举了。

        点此进入:Android 浅谈Activity(中)

        点此进入:Android 人事+技术总贴
        点此进入:Android 基础篇总贴
        点此进入:Android 进阶篇总贴
        点此进入:Android 讨论区

        以上言论,如有错误或者表达不准确或者有纰漏的地方还请指正,同时欢迎大家在评论区留言给予一定的建议,我会根据大家的意见进行相应的改正,谢谢各位!


4 个回复

倒序浏览
好东西 顶一顶
回复 使用道具 举报
gyy 中级黑马 2016-10-23 00:32:06
藤椅
最好顺带着说说集中启动模式
回复 使用道具 举报
回复 使用道具 举报
gyy 发表于 2016-10-23 00:32
最好顺带着说说集中启动模式

有的,在 Activity 下 里面
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马