Android 开发指南 [翻译] [一] Activities 介绍

原文地址:https://developer.android.google.cn/guide/components/activities/intro-activities

一.Activities介绍

    Activity 是Android app的重要组件(四大组件之一),Android应用程序可以说是由多个Activity组成.不像其他编程方式是由main()方法启动.在Android系统里的Activity每一个启动代码对应着Activity的一个生命周期.
    
    这篇文档介绍了activities的概念,并简单介绍如果使用它们.

二.activities概念

    移动应用程序用户体验不同于桌面应用程序,用户与移动应用程序交互,往往并不都是开始于同一个地方,相反,用户的开始操作经常是不确定性的.例如:你要在手机主界面打开一个邮件app,启动邮件app后,一般显示的是邮件列表.相比之下,如果是用社交媒体app,在社交媒体的app内打开邮件app,你也许会直接跳转到邮件app的编写邮件页面.
    
    使用Activity 类来构建app,更有利于实现上面的案例.当一个app调用另一个app.其实是调用另一个app的某个activity,而不是把app当做一个原子整体,以这种方式,activity就是用户与app应用程序交互的一个入口了.可以通过继承activity将你写的activity作为Activity类子类,给用户交互提供入口.
    
    一个Activity通常包含一个布局文件,用于绘制UI的窗口.这个UI布局通常是填充屏幕的,也可能小于该窗口或者是浮动在其他窗口之上.一般来说,在app中一个Activity实现一个布局屏幕.比如:一个app程序会有设置界面这样的填充整个window的Activity,也存在选择相册的一个浮动弹窗Activity.
    
    大多数app应用程序包含多个布局屏幕,意味着大多数app包含多个activity.通常,一个app应用程序都有一个特殊的activity作为入口 activity,就是我们通常从桌面点击启动app看到的第一个界面.每一个activity可以启动另一个activity完成不同的一些操作.例如:一个简单的邮件app,主界面一般是一个邮件收件列表,在主界面的列表页面,同样能启动其他的activity页面完成一些其他操作,像邮件编写界面Activity.
    
    虽然无数个activity同时相互调用工作来形成一个与用户交互的app应用程序,每一个activity与其他activity都是低耦合松散的绑定;这些activity通常对整个app应用程序是最小的依赖关系.事实上,activity检查要启动其他app应用中的activity.例如:一个浏览器app可能会启动社交媒体app的共享activity.
    
    在app中使用activity,你必须要在app的manifest清单文件注册,并且你需要适当的管理你的activity的生命周期.本文档的余下部分介绍了这些知识点.

三.配置清单文件

    在app中使用activities,必须要在清单文件manifest中定义,和申明它的一些属性.

    1.声明activities    

    要声明activity,在清单文件中的<application>子项中添加<activity>元素. 例如:
    

<manifest ... >
      <application ... >
          <activity android:name=".ExampleActivity" />
          ...
      </application ... >
      ...
</manifest >

     
    <activity>元素唯一需要设置的属性是 android:name,它指明了activity的类名.你还可以定义activity的其他属性,比如标签label,图标icon,或者ui的主题theme.如果想了解更多<activity>标签其他属性,你可以查看相关参考文档.
    
    注意:你发布你的app应用程序后,你不能改变你的activity名字,如果这样做,你可能会破坏某些功能.如app的快捷方式,

   2.声明intent filters    

    intent filters 是android平台的一个非常强大的功能.支持显示的启动activity,而且支持隐式启动activity.例如:一个显示的请求会告诉系统"在邮件app应用程序中去启动一个发送邮件的activity界面".相比之下,一个隐式的请求会告诉系统"启动一个能发送邮件的activity界面",这时候系统界面让用户自己去选择某个app去执行发送邮件任务的app,这其实就是intent filters所做的.
    
    你可以通过在<activity>内声明一个<intent-filter>属性标签,来使用该属性.在声明的<intent-filter>中包含一个<action>,还可以包含<category>,<data>属性,这些属性结合起来,指定了你的activity能过滤和接收那些响应.例如:下面的代码片段,展示了如何配置一个activity发送数据和接收来自其他activity的请求.
    

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
</activity>

 
    本例中,<action>元素指定了该activity发送数据.声明<category>属性为DEFAULT,接收启动的请求.声明<data>属性来指定此activity发送数据的类型.下面的代码片段展示了如果调用activity.
     

  // Create the text message with a string
    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
    // Start the activity
    startActivity(sendIntent);

 

    如果你想让你的app是独立的,并且不被其他app应用程序启动,如果你不想你app里的activity被其他应用程序访问,你就不需要配置intent filters,你可以通过显示启动该activity.如果想了解更多的信息,可以查看 Intents 和 IntentFilters 介绍.
    
    声明权限
    在清单文件manifest里你可以使用<activity>标签来控制启动某个特定的activity.父activity不能启动子activity,除非两个activity在配置清单中配置了相同的权限.如果为被调用的activity设置了<uses-permission>权限,则调用者应该也具备一个匹配的<uses-permission>.
    
    例如:如果你的app应用程序想通过一个假设名字为SocialApp的app应用程序在社交媒体分享一个帖子.那么被调用者SocialApp本身就必须定义相应的权限,如下所示:

<manifest>
        <activity android:name="...."
           android:permission=”com.google.socialapp.permission.SHARE_POST”

        />       

    然后,调用者需要声明具备上面再SocialApp中定义的该相应权限. 

<manifest>
       <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

    如果想了解常用的一些权限和安全相关属性,可以查看:Security and Permissions.

四.管理Activity的生命周期

    在Activity的生命周期,Activity经历了一系列的状态.你可以使用一系列的回调来控制这些状态之间的切换.下面部分就是介绍这些生命周期回调.      

  1. onCreate()      

   你必须要实现这个回调,这是在系统创建Activity时候回调,在该方法中,你可以初始化Activity里的一些基本组件.例如:app应该创建视图并且将数据绑定到列表.最重要的是,你必须调用setContentView()来定义activity的用户界面布局.
    
    当onCreate()完成时候,下一个回调是onStart().

  2. onStart()  

    当onCreate()完成,activity进入启动状态,并且对用户是可见的.这个回调包含了activity最终展现给用户并且与用户进行交互的最后准备工作.

 3. onResume()

    系统在与用户开始与activity交互之前会调用该回调,此时,该activity处于activity的栈顶.并且捕获所有用户的输入,应用程序的核心功能大部分是在onResume()方法中实现.
    
    onPause()方法回调是经常跟随在onResume()回调之后.

 4.onPause()    

    当activity失去焦点并进入暂停状态时候,系统会调用onPause()回调.这种情况发生在,例如,当用户按下物理后退按键或者回退任务栈按钮,当系统调用onPause()回调时候,意味着你的activity仍然是可见的,但通常是用户离开activity的标志,并且该activity将很快进入停止或者恢复状态.
    
    如果用户期望一个activity在暂停状态继续更新ui.类似的例子有,显示导航地图或者媒体播放器的activity.尽管activity失去了焦点,用户还是希望他们的ui继续更新.
    
    不应该在onPause()回调里保存应用程序和用户数据,进行网络调用,或者执行数据库事务,有关保存数据的信息,请参考保存和恢复activity状态.
    
    当onPause()完成执行,下一个回调就是onStop()或者onResume().这取决于activity进入onPause()之后发生的状态.

 5. onStop()    

    当activity对用户不可见的时候,系统会调用onStop()回调.发生的原因,可能是因为activity被破坏,新的activity开始,或者现有的activity进入恢复状态并覆盖了该activity.所有这些情况下,该activity对于用户来说是不可见的.
    
    下一步回调,可能是其他activity进入onRestart()与用户进行交互,或者回调onDestory(),该activity完全终止.

 6. onRestart()    

    当activity处于onStop()状态,并即将重启时,系统会调用onRestart()回调.onRestart()是activity从停止状态恢复启动时候回调的方法.
    
    该回调总是跟在onStart()之后.     

7. onDestory()       

    当activity销毁的时候,系统会调用该回调.
    
    onDestory是activity接收到的最后一个生命周期的回调,onDestory()通常在该activity或者进程被销毁时候,用于确保该activity中所有的资源都被释放.
    
    

  该文档更新于:2018.04.17.

    
   

posted @ 2018-08-13 19:46  FreeFunCode  阅读(645)  评论(0编辑  收藏  举报