zoukankan      html  css  js  c++  java
  • 安卓四大组件总览

            在安卓中四大组件 (Component)指的是:Activity,Service,BroadcastReceiver,ContentProvider。此博客仅仅对安卓中四大组件从整体上进行简单的分析,了解他们在安卓系统框架中处的位置与作用,各组件详细介绍将单独讲解。

    首先,我们来看一下这几个类之间各自的继承关系



    从上述可以看出四大组件中的Activity,Service组件都继承自Context,即它们都可看做是一个Context(事实上,安卓中的Context包括三种情况,即Application,Service与Activity),而BroadcastReceiver与ContentProvider相对独立,与其它组件在继承上没太大关联。

    (一)下面我们看一下安卓官方文档Context的类的描述

    从文档描述我们可以知道,Context是一个抽象类,它用来访问特定的资源或者类,是安卓系统中用来管理与操作application-level operations的类。例如,启动Activity,Service组件、注册广播接收者和启动Content Provider组件,接收Intent等。也正因为如此,所以安卓中常用的一些方法都位于Context类中,分别对应对相关组件的操作,比如startActivity对应启动一个Activity,startService/stopService,bindService/unBindService对应Service组件的操作,registerReceiver/unregisterReceiver,sendBroadcast,sendOrderdBroadcast对应BroadcastReceiver的操作,obtainStyledAttributes对应对View的操作(该函数在仔定义View属性集时会用到),openFileInput,openFileOutput,openOrCreateDatabase对应文件及数据库的操作。

    注意

    1)Context中存在一个重要的方法abstract Context getApplicationContext(),它返回的是一个Context对象,而Context的子类Activity,Service中存在一个类似的方法final Application getApplication(),它返回的是一个Application对象,在安卓四大组件中只有Activity与Service这两大组件中存在getApplication()方法。

    2)Context的子类Activity重写了Context的startActivity()方法,一般情况下我们都是在一个Activity中启动另一个Activity,即形成所谓的Activity任务栈,但是如果在Service中调用startActivity()时,因为Service没重写Context的startActivity()方法,所以本质上它调用的是Context的startActivity()方法,此时则必须添加FLAG_ACTIVITY_NEW_TASK flag即

    使用intent.setFlag(FLAG_ACTIVITY_NEW_TASK );语句。

    3)在使用四大组件时经常需要指定Context参数,该参数本质上是ContextImpl对象,ContextImpl类继承自Context类,它是安卓系统框架自动管理的。



    (二)维系安卓四大组件的Intent

    首先看一下官方文档对Intent类的描述


    从上述文档中可以看出,Intent作为一个动作的抽象描述被执行,Intent是为了降低安卓系统组件交互耦合度而采取的一种通信机制,也正因为如此,所以启动安卓各组件的方法非常相似。

    1)Intent用来启动Service与Activity用法一般都相同,即通过Intent intent=new Intent(Context context,Class<?>class);,startActivity(intent)/startService(intent)来启动对应的组件

    2)对BroadcastReceiver的启动与上述不同,因为对于BroadcastReceiver一般事先不用指定具体的组件名(这也正是BroadcastReceiver存在的意义)而是通过
    intent.setAction(String action)或Intent intent=new Intent(String action)的方式来指定启动对action“感兴趣”的广播,即

    Intent intent=new Intent();

    intent.setAction(Constants.ACTION_MSG);

    sendBroadcast(intent);或

    Intent intent=new Intent(Constants.ACTION_MSG);

    sendBroadcast(intent);

    3)对于上述三种组件传递数据方式都相同,一般通过intent.putExtra(String name,Serializable value);来传递对象或使用其它相应方法传递基本类型数据,

    例如在启动广播时,

    Intent intent=new Intent();

    intent.setAction(Constants.ACTION_MSG);

    intent.putExtra(Constants.MSG, msg);

     sendBroadcast(intent);

    4)Intent详细介绍请参考博文http://www.cnblogs.com/engine1984/p/4146621.html


  • 相关阅读:
    Apple的App Analytics统计平台你必须知道的Q&A整理与翻译
    WWDC2014总结---For产品经理们
    AppStore占坑注意事项
    Mac上的终端(Terminal)启动缓慢
    iOS推送失败的可能问题汇总
    Mac OS X 10.9 Mavericks安装后,Xcode调试时模拟器黑屏的处理方法
    MySql批处理的小窍门:排行榜类数据生成
    升级OSX 10.9 Mavericks后,会导致Finder始终无响应的一个问题
    拉面馆中的移动互联网——无线KPI探讨
    Weak is not weak,Strong is not strong
  • 原文地址:https://www.cnblogs.com/hainange/p/6334100.html
Copyright © 2011-2022 走看看