了解Android四大组件

本文详细介绍了Android开发中的四大核心组件:Activity、Service、BroadcastReceiver和ContentProvider。针对每个组件的特点、生命周期及其应用场景进行了深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解Android四大组件


Activity

了解android最基本知道4个"大人物",完整吃透这4个你就成功了一大半了.那么是哪4个呢?它们是Activity,Service,BroadCast Receiver,Content Proivder这些了.分别对应着界面(UI),服务,广播接收器,内容接收器,以上这些组件面试都是必问的.那么从Activity开始:

(1)什么是Activity?

  Activity原意思是活动,在android当中意思是就是一个界面,每一个界面都需要继承Activity,用SetContentView方法去加载布局文件,也可以设置主题如漂浮式,对话框式等,它的回调函数特别多.几乎每一个activity都要和用户交互.不交互就不是好的activity。

(2)生命周期

  组件都有自己周期,掌握生命周期也是必不可少的事情。不少公司就单独就问你生命周期怎么怎么样,

比如他首先问你哪几个生命周期:Create,Start,Pause,Restart,stop,resume,Destroy。接着会问一个activity到另一个activity生命周期的经过是怎么样的?此时你毫无犹豫问答:OnCreate OnStart-OnResume,被杀掉后是先Onpause,OnStop,OnDestroy,恢复了调用OnStart-OnResume

如果不信的话,请你不妨去做测试下。

(3)activity之间通信

Activity之间通信包括两种,一种是数据传递,第二种跳转到另一个activity,这两种需要另一个家伙-Intent本来意思目的不仅能启动Activity,还能启动服务,广播。跳转到另一个activity就是实例化Intent

对象,参数里放当前activity.this,目标activity.class。This和class顺序不能颠倒。传递数据是调用putExera方法参数是键,值,在前一个传递是int类型,接收也要int 类型,如getintent,String类型也是如此。否则报空指针异常。接收时用一个叫Bundle来接收那个值

(4)Activity 的 Intent Filter(Intent的过滤器)

Intent Filter 描述了一个组件愿意接收什么样的 Intent 对象,Android 将其抽象为 android.content.IntentFilter 类。在 Android 的 AndroidManifest.xml 配置文件中可以通过 <intent-filter >节点为一个 Activity 指定其 Intent Filter,以便告诉系统该 Activity 可以响应什么类型的 Intent。 当使用 startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 对象的 Component 属性,那么 Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent 的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。这个往往就是新建项目取消自动创建avtivity忘记了的原因。其实自动创建activity可以省去不必要的麻烦

 


 

Service

(一)大概叙述

Service意思地球人都知道,就是服务嘛。其实我认为服务比activity还要高级。服务是一直常驻在后台。你是看不到它的,因为它是不可见的。你非要看见它用别的代替吧。什么时候才用到它呢?其实有些操作太复杂了,可以交给服务去做,如播放音乐,后台下载。我们可以看到浏览器UC浏览器下载操作是交给服务,至于进度在通知栏显示,播放音乐也是一样。怎么播放,如开始播放,暂停,停止播放,上,下一首。这些操作扔后台最大好处在于,在Activity播放无意退出了音乐会停止。这对一边音乐一边在手机干其他事情来说就是不好的。所以,交给服务,就算秒了activity人家还是照样歌还是能放对吧。

(二)生命周期

Service也有生命的,最初创建的OnCreate,只调用一次。然后OnStart,android4.1时把OnStart方法给屏蔽了。只能StartCmmand方法以及OnDestroy,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法

Service与Activity通信:
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。

Service 启动方式:
context.startService()
context.bindService();
使用Service之前必须在androidMainfest.xml 中注册


BroadCastReceiver

 

广播是一种广泛运用的在应用程序之间传输信息的机制。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者可以通过 NotificationMananger 提醒用户,或者启动 Service 等等。

2.生命周期:广播当中一个OnReceiver方法,生命周期10秒,超过10秒没有完成任务,就会弹出异常,但在10秒内没有执行完毕,就会弹出ANR异常。也就是说广播里无法对UI耗时操作。

 

3.声明广播:分动态和静态。前者在activity直接注册。后者是声明一个标记而已

4.广播其他:

(1) ,他决定该广播的级别,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;
(2) ,同级别接收是先后是随机的;级别低的收到广播;
(3) ,在 android 系统中只要监听该广播的接收者,都能够收到 sendBroadcast(intent) 发出的广播 ;
(4) ,不能截断广播的继续传播,
(5) ,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。如果都没有优先级,代码注册收到为最先。

5.注销广播:既然有动态注册广播,那么当程序退出时,这个广播你要不要停止呢。如果不注销,系统仍然回报异常,会提示类似你是不是要注销掉广播?我是说大致意思.建议在 onPause()或者OStop 中注销;

 

ContentProivder

Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。我感觉它在通讯录或者查找系列用的比较广吧。重写方法包括增删改查。整一个加强版SQLite  。

Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。

   让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类)  或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。
   
   1.数据模型
    Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。

   2.URI
    URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的公开URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Provider 的URI 都以"content://" 开头,其中"content:"是用来标识数据是由Content Provider管理的 schema。

      在几乎所有的Content Provider 的操作中都会用到URI,因此一般来讲,如果是自己开发的Content Provider,最好将URI定义为常量,这样在简化开发的同时也提高了代码的可维护性。

      首先来介绍如何访问Content Provider中的数据,访问 Content Provider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对Content Provider 中的数据进行查询、插入、修改和删除等操作。 以查询为例,查询一个 Content Provider 需要掌握如下的信息。

 

转载来自:

http://www.apkbus.com/forum.php?mod=viewthread&tid=64009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值