zoukankan      html  css  js  c++  java
  • 5、四大组件之一-Activity与Intent

    一、Activity的定义及作用

    1)官方定义:Activity是Android应用程序提供交互界面的一个重要组件 。 也是Android最重要的组件之一

    2)Activity是业务类 , 是承载应用程序的界面以及业务行为的基础 。 

    包括UI , Service ...... 类似于我们的JavaBean

    3)“脸”的表现都靠Activity了 。

    4)说Activity就不得不说View和Window。

     

    二、Intent和IntentFilter

    Intent在中文中是意图的意思 。

    那么既然叫做意图,就类似于一个男孩儿为了追一个女孩儿,传递纸条给她 ,向她要电话 ,女孩儿把电话写在纸条中传递给男孩儿 。(当然,现代社会都用微信了,最起码都是短信了)

    如此,我们认为Intent就是在不同组件之间传递值而设计的一个数据结构 

    intent :

    extras  - 加入附加信息

    category - IntentFilter 

    Action - 动作 : Data - 动作相关的值 

    ComponentName - Context

     CompnentName、Action、Data、Category、Extras、Flags。

     

    三、我们来讲一个故事(我们用用例图来描述一下这个过程)

    场景一:

    有个男孩儿叫Jakcy , 有个女孩儿叫Rose  。 

    他们来到美丽的成都,四川大学读书 。  

    先到我们的学校登记学籍  ,包括学籍相关属性 (性别,年龄 ,身份证号.....)

    Jacky想要邀请Rose看电影 ,知道Rose的寝室号,打扮一番,洗个脸。就跑过去,送了一张电影票外加一封情书 ,说晚上一起看电影吧 。 Rose说好啊

    晚上开始去开电影之前, Rose会好好准备,化妆 ,装扮自己的仪容和脸 。有必要的话还需要好好设计一下 。

    晚上一起看电影看完电影之后, Rose告诉Jacky  , 我接受你的邀请意味着我接受了你的情书 。 然后回家睡觉了

    Jacky得到这个反馈后欢天喜地的也回家睡觉了 。

     场景二:

    Jacky 相约 Rose 看电影 , 但是却不知道Rose的宿舍在哪儿也没有其他联系方式  。 

    Jacky 找到学生会,发出一个寻人启事 ,启事是这样写道:

    我想约你看电影 

    我记得你是**系**年级的女生 

    你的名字是Rose

    如果你收到这个消息请打手机:135******** 联系我 , 我是Jacky

    学生会没有把寻人启事贴到电线杆上,而是通过学校的学籍管理处去帮着查找这样条件的女孩儿 。结果一不小心查到了5,6位满足这个条件的女孩儿 。 就把启事全部发给她们了 。 

    这些女孩儿都收到了这个信息,晚上电影都去了 。 Jakcy晕了 ......

     

    四、如何编写Activity?

    1)创建Activity及相关视图文件Layout(View)。

    2)配置AndroidManifest.xml。

    3)重载onCreate() , 绑定Activity和Layout(View)。  setContentView()

    4)为View(Layout)添加必要组件。

       建立界面控件树的概念; findViewById();  addView();

    5)在onCreate()中实现初始业务逻辑。

      加入事件比如按钮事件

        扩展:Java匿名内部类

           new interfacename(){......}; 或 new superclassname(){......}; 

     

    五、Activity的切换及值传递

    启动一个新Activity  ------  Intent;

    启动一个新Activity并且返回值;

    通过源代码分析启动的机制;

    扩展:IntentFilter的应用;

    结束一个Activity(finish()、finishActivity());

    通过源代码分析结束机制;

     

    六、Activity生命周期

     

    http://www.cnblogs.com/mengdd/archive/2012/12/01/2797784.html

     

    七、存储Activity状态

    onSaveInstanceState()

    onRestoreInstanceState() , onCreate()

    如何选择用哪个函数?

    官方推荐和我的推荐来说,都使用onCreate来恢复

    因为有时候onRestoreInstanceState()不会被调用。

     

    八、处理设置改变 Configuration changes

    有时候会调用onConfigrationChanged  .

    屏幕翻转

    输入法的有效性切换

    语言的切换 

    1)   设置改变的时候恢复一个大对象

    onRetainNonConfigurationInstance (注意returnObject 不要用与Context关联对象,比如View,否则会引起内存泄露)与 getLastNonConfigurationInstance() 配合

    @Override

    public Object onRetainNonConfigurationInstance() {

        final MyDataObject data = collectMyLoadedData();

        return data;

    }

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    final MyDataObject data

       = (MyDataObject) getLastNonConfigurationInstance();

        if (data == null) {

            data = loadMyData();

        }

    }

     

    2) 自己处理配置改变

    onConfigurationChanged()

     

    <activity android:name=".MyActivity"

              android:configChanges="orientation|keyboardHidden"

              android:label="@string/app_name">

     

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();

        }

    }

     

    九、Activity的任务栈

    进程中的关系是纵向的;类似生活中的部门,一个公司中有很多部门。

    任务Task,可以理解为是横向关系;类似生活中的专案组,可以从每个部门抽调人手来去完成一个工作。

     

    十、Activity Manifest配置详解

    android:allowTaskReparenting

    email-task 启动一个link 

    然后切入到browser task

    如果设置为true , 则之前打开的页面任然存在

     

    android:alwaysRetainTaskState

    用来标记Activity所在的Task的状态是否总是由系统来保持。

    “true”,表示总是;“false”,表示在某种情形下允许系统恢复Task到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
        一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。
        然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。

     

    android:clearTaskOnLaunch

    一般情况下 , launch中重新启动这个任务都会清除底部以上的activity这个可以保留,

    Sample:某人从主页屏幕载入activity P,并从那儿到达activity Q。用户接下来按了HOME键,然后返回到activity P。通常,用户将看到activity Q,因为那时他在P的task里操作的地方。然而,如果P将该标志设为”true”,当用户按了HOME键,该task进到后台去的时候,其上的所有的 activity(Q也属于这种情况)将被移除。所以以后回到该task时看到的只有P。

     

    android:configChanges

    android:configChanges="keyboardHidden|orientation"配置,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了

     

    android:finishOnTaskLaunch

    当用户再次载入该task时(在主页屏幕上选择该task),一个既存的activity实例是否应该被关闭(结束) — “true”表示会被关闭,”false”表示不是。默认值为”false”。

     

    android:hardwareAccelerated

    由于硬件加速自身并非完美无缺,所以Android提供选项来打开或者关闭硬件加速,默认是关闭。可以在4个级别上打开或者关闭硬件加速:,在3.0才有的。

     

    android:launchMode

    Standard  标准的。

    2.B设置为SingleTop,启动A: 再启动A: 再启动B: 再启动B: 

    结论: 

    当B不在栈顶时,仍然会创建B的新实例。 

    当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent() 

    按Back键依次返回桌面,输出依次: 

    结论: 

    虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。 

    3.B设置为SingleTask,启动A: 启动B:启动A: 启动B: 

    结论: 

    当B已经存在时,再次请求B会触发已经存在的B1实例的onNewIntent; 

    并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。 

    一个任务只能有一个此Acitivty ,并且必须作为Root Activity  。

    它上面的Activity 只能是Standard & SingleTop

    如果它跑到front了 , 其它activity就会离栈

     4.B设置为SingleInstance,启动A: 

    启动B,此时新创建了任务栈13,和先前的A1并不在一个任务。 

    再启动B,没有创建新实例: 

    再启动A,再旧的任务12中创建了A的新实例 

    按下Back键: 

    signleInstance  , 独立成Taskstack ,并且有且仅有你自己 ,孤家寡人 。而且始终保持一个实例

    离栈的时候 , 先退当前的task ,再退另外的task

    一个任务有且仅有一个SingleInstance , 它作为唯一的activity存在与一个任务里面

     

    android:multiprocess

    activity的实例是否能够被载入到启动它的组件所在进程里 — “true”表示可以,”false”表示不行。默认值是”false”。

    通常,一个activity的新实例被载入到定义它的应用程序进程里,这样一来,该activity的所有实例运行在同一进程里。然而,如果本标识设为”true”的话,activity的实例就能够运行在多个进程里,允许系统只要使用它时就生成实例(提供的权限允许的话),某些几乎根本不需要或根本不合适。

     

    android:noHistory

    当用户离开它且它不再显示在屏幕上时,activity是否应该被从activity stack里移除并且结束掉(调用它的finish()方法) — “true”表示应该结束,”false”表示不。默认值是”false”。

     

    android:process

    activity应该运行的进程的名字。通常,一个应用程序的所有组件运行在为该应用程序生成的默认的进程里。它与应用程序包同名。元素的process属性能够给所有的组件设置一个不同的默认值。但是每个组件可以覆盖该默认值,允许你扩展你的应用程序到多个进程里。

    如果本属性指定的名字以冒号开始(‘:’),当需要的时候将会生成该应用程序的一个新的私有进程,activity将运行在那个进程里。如果进程名由一个小写字母开头,activity将运行在一个该名字的全局的进程里,如果它有那个许可的话。这样就允许不同的应用程序组件共享同一进程,从而降低资源消耗。

     

    android:stateNotNeeded

        是否activity被销毁和成功重启并不保存状态;

        这个属性默认情况为false,若设为true,则当Activity重新启动时不会调用onSaveInstanceState()方法,同样,onCreate()方法中的Bundle参数将会用null值传进去,也就是说,Activity每次启动都跟第一次启动一样。这样,在某种特殊场合下,由于用户按了Home键,该属性设置为true时,可以保证不用保存原先的状态引用,节省了空间资源,从而可以让Activity不会像默认设置那样Crash掉。

     

    android:screenOrientation

    android的应用中,有时候需要限制横竖屏切换

    android:screenOrientation="landscape"是限制此页面横屏显示, 

    android:screenOrientation="portrait"是限制此页面数竖屏显示。

     

    android:excludeFromRecents

    任务是否在发起这个活动应该被排除在最近使用的应用程序的列表("最近的应用程序")。那是,当这个活动是根活动的一个新任务,这个属性决定了任务不应该出现在列表中最近的应用程序。设置"true"如果这个任务应该被排除在名单,设置"false"如果它应该被包括。默认值为"false"。

     

    十一、扩展

    1}Android提供的专有Activity;

       MapActivity、ListActivity、ExpandableListActivity、TabActivity;

    2}Fragments-界面片段;

    3}Loaders-界面异步加载机制;

  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/androidsj/p/3972279.html
Copyright © 2011-2022 走看看