zoukankan      html  css  js  c++  java
  • 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.

        
       

  • 相关阅读:
    SQL Server 2008 如何查看与创建约束
    Hibernate的主键生成策略
    sql server的id字段设置为自动生成的,那么该怎么写insert语句呢?
    org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity() defined: com.bjsxt.model.Student.courses
    INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。
    在排序数组中查找符合条件的数
    求二叉树中节点的最大距离
    设计包含min 函数的栈
    寻找链表的倒数第K个节点
    翻转句子中单词的顺序
  • 原文地址:https://www.cnblogs.com/bugzone/p/IntroductionToActivities.html
Copyright © 2011-2022 走看看