Android学习06Android应用程序的基本组件
一个Android应用程序可以由几个不同的组件构成,Android应用程序的基本组件包括:Activity,Service,BroadcastReceiver,ContentProvider和Intent.
不同的组件有不同的特性以及各自的生命周期,下面分别介绍:
1.Activity组件
Activity是最常见的一种Android组件,每个Activity都相当于一个屏幕,其为用户提供了进行交互的可视界面。应用程序可以根据需要包含一个或多个Activity,这些Activity一般都继承自android.app包下的Activity类,并且这些Activity之间的运行是相互独立的。
1.1运行态(running state)
此时Activity显示在屏幕前台,并且具有焦点,可以和用户操作进行交互,比如向用户提供信息,捕获用户单击按钮的事件并作处理。
1.2暂停态(paused state)
此时Activity失去了焦点,并被其他的运行态的Activity取代在屏幕前台显示。如果掩盖暂停态Activity的运行态Activity并不能铺满整个屏幕窗口或者具有透明效果,则该暂停态的Activity对用户依然可见,但是不可以与其进行交互
暂停态的Activity仍然保留其状态和成员其他信息,当前系统的内存非常匮乏时,暂停状态下的Activity会被结束掉以获得更多的资源。
1.3停止态(stopped state)
停止态的Activity不紧米有焦点,而且是完全不可见的,虽然其他也保留状态和成员等信息,停止态的Activity会在系统需要的时候杯结束。
Activity生命周期如下图:

Activity显示的内容可以有两种声明方式,第一种是通过XML配置文件来声明,第二种则是将屏幕设置为某一个继承自View类的对象
*通过XML配置文件声明
Activity的配置文件位于res目录下的layout目录中,一个配置文件相当于一个View容器,其中可以添加Android平台下的一些内置的View,如TextView,ImageView,Button等,也可以添加继承自View类的子类对象,还可以继续添加View容器
布局文件还指定了View对象在View容器中的排布方式,如线性布局(LinearLayout),表格布局(TableLayout)等。
新建的Activity类代码中 :setContentView(R.layout.main); //设置所要显示的XML配置文件
*通过View的子类对象声明
通过XML配置的文件将不同的View整合到一起用非常方便,但是留给开发人员的自主性不够大,尤其是进行游戏编程时,往往Android系统中已经存在的View无法满足要求,这种情况下一般会通过继承好扩展View来开发自己想要的用户界面。下面给一个通过View的子类对象表决定Activity显示内容
例子比较简单不做演示
Activity类代码如下:
public class SetActivityView extends Activity {
MyContentView myContentView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myContentView = new MyContentView(this);
setContentView(myContentView);
}
}
新建的View类代码如下:
public class MyContentView extends View{
public MyContentView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) { //重写View类绘制时的回调方法
Paint paint = new Paint() ; //创建画笔
paint.setTextSize(18); //设置字体大小
paint.setAntiAlias(true); //设置抗锯齿
paint.setColor(Color.RED); //设置字体颜色
canvas.drawText("这是通过继承好扩展View类实现显示", 0, 50, paint); //绘制字体到屏幕
}
}
2. Service组件
与Activity不同的是,Service没有提供与用户进行交互的表示层。Service是运行在后台的一种Android组件,当应用程序需要进行某种不需要前台显示的计算或者数据处理时,就就可以启动一个Service来完成,每个Service都继承自android.app包下的Service类。
Service一般由Activity或其他Context对象来启动,当启动Service之后,该Service将会在后台运行,即使启动这个Service的Activity或者其他组件的生命周期已经结束,Service仍然会继续运行,直到自己的生命周期结束为止。每个Service都应该在AndroidMainfest.xml中进行声明。Service的启动方式有两种,对应的生命周期也各不相同
2,1 通过startService方法启动
当系统调用startService方法时,如果该Service还未启动则依次调用其onCreate方法和onStart方法来启动。当其他Context对象调用stopService方法,Service调用自身的stopSelt或stopService方法才会停止Service操作
2.2 通过bindService方法启动
当系统调用bindService方法时,如果该Service未启动,则会调用onCreate方法完成初始化工作,然后会将该Service和Context对象(如Activity)进行绑定,当被绑定的Context对象销毁时,与之绑在一起的Service也会停止运行。
需要注意的是,尽管两种方式启动Service,但无论Service是通过什么方式启动的,都可以将其与Context对象绑定。
3.Broadcast Receiver组件
Broadcast Reciver同Service一样,并不是提供与用户交互的表示层,其是一种负责接收广播消息并对消息做出反应的组件。在Android的系统中就存在还能多这样的广播,比如电池电量过低或信号过低,系统就会发出广播进行通知。
应用程序如果需要响应某一个广播消息,应该注册对应的Broadcast Receiver对象,该对象继承自BroadcastReceiver类,该类位于android.content包下。这样一来当系统或另外的应用程序发出特定广播时,该应用程序就可以接受并做出回应,比如启动Activity
3.1 BroadcastReceiver发布广播的方式
发布一个广播比较容易,只需要在需要的地方创建一个Intent对象,将信息的内存和用于过滤的信息封装起来,通过调用Context.sendBroadcast方法,Context.sendOrderedBroadcast方法或者Context.sendStickyBroadcast方法将该Intent对象广播出去。这三种发布广播的方式区别:
通常,使用sendBroadcast或sendStickyBroadcast发送出去的Intent,所有满足条件的BroadcastReceiver都会执行其onReceive方法。但若有多个满足sendOrderedBroadcast方法发送出去其执行onReceive方法的顺序都是没有保证的。而通过sendOrderedBroadcast方法发送出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行onReceive方法,相同优先级的BroadcastReceiver执行onReceive方法的顺序是没有保证的。
sendStickyBroadcast主要不同的是,Intent在发送后会一直存在,并且在以后调用registerReceiver注册相匹配的Receiver时会把这个Intent对象直接返回给新注册的Receiver
3.2 BroadcastReceiver接收广播的方式
发布的广播实体是Intent,那么接收广播的时候就需要通过IntentFilter对象来进行过滤。BroadcastReceiver的生命周期比较简单,其实只有一个回调方法---onReceive,该方法在应用程序接收到发给自己广播的时候调用,所以BroadcastReceiver的使用方法也相对简单,也需要对onReceive方法进行合理重写,在适当的地方注册该BroadcastReceiver即可
注册BroadcastReceiver对象的方式有一下两种:
3.2.1 在AndroidMainfest.xml文件中声明。注册信息包裹在<receiver> </receiver>标签中,并在<intent-filter>标签内设定过滤规则。
3.2.2 在代码中创建并设置IntentFilter对象。该IntentFilter对象包含了对广播的过滤规则,然后在需要的地方调用Context.registerReceiver方法和Context.unregisterReceiver方法进行注册和取消注册。如果采用这种方式注册的话,当Context对象被销毁时,该BroadcastReceiver也就不复存在了。
4 Content Provider组件
Content Provider 和其他的应用程序组件有很大的不同,Content Provider主要用于不同的应用程序之间进行数据共享。在Android平台下,每个应用程序都有独立的内存空间,如果某一个应用程序需要使用其他应用程序的数据,就必须采用ContentProvider对象。
每个ContentProvider都继承自android.content包下的ContentProvider类,其功能就是提供自己的数据给外部应用程序使用,被提供的数据可以存储为Android文件,SQLite数据库文件或其他合法的格式。
ContentProvider提供数据及访问数据的接口,真正访问数据的是ContentResolver对象,该对象可以与ContentProvider对象进行通信,以达到共享数据的目的。
5.Intent —— 连接组件的纽带
以上 4 种基本组件中,除了 Content Provider 是通过 Content Resolver 激活外,其他 3 种组件 Activity 、 Service 和 Broadcast Receiver 都是由 Intent 异步消息激活的。
Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此, Intent 是包含具体请求信息的对象。
针对不同的组件, Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递 Intent 的不同方式。
Intent 是一种运行时绑定( runtime binding )机制,它能够在程序运行的过程中连接两个不同的组件。通过 Intent ,你的程序可以向 Android 表到某种请求或者意愿, Android 会根据意愿的内容选择适当的组件来处理请求。
l 激活一个新的 Activity ,或者让一个现有的 Activity 执行一个新的操作,可以通过调用如下两种方法 ( 这两汇总方法需要传入的 Intent 参数称为 Activity Action Intent) :
1. Context.startActivity()
2. Activity.startActivityForResult()
l 启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:
1. Context.startService()
2. Context.bindService()
l 发送广播 Intent( 所有已注册的拥有与之相匹配 IntenFilter 的 BroadcastReceiv 就会被激活 ) ,可以调用如下三种方法:
1. Context.sendBroadcast()
2. Context.sendOrderBroadcast()
3. Context.sendStickBroadcast()
Intent 一旦发出, Android 都会准确找到相匹配的一个或多个 Activity 、 Service 或 BroadcastReceiver 作响应。所以,不同类型的 Intent 消息不会出现重叠, BroadcastIntent 消息只会发送给 BroadcastReceiver ,而绝不可能发送给 Activity 或 Server 。有 startActivity() 传递的消息也只可能发送给 Activity ,由 startService() 传递的 Intent 只可能发送给 Service 。
Android学习06Android应用程序的基本组件的更多相关文章
- Xamarin.Android学习之应用程序首选项
Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这一过程会非常的枯燥,而且耗时.我们可以看到Android系统的 ...
- Android学习——移植tr069程序到Android平台
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Android学习之基础知识十三 — 四大组件之服务详解第二讲(完整版的下载示例)
上一讲学习了很多关于服务的使用技巧,但是当在真正的项目里需要用到服务的时候,可能还会有一些棘手的问题让你不知所措.接下来就来综合运用一下,尝试实现一下在服务中经常会使用到的功能——下载. 在这一讲我们 ...
- Android学习(十四) Service组件
一.定义 运行在后台,没有页面,不可见.优先级高于Activity,当系统内存不足时,会先释放一些Activity.注意,Service同样是运行在主线程中,不能做一些耗时操作.如果一定要做一些耗时的 ...
- Android学习——第一个NDK程序
在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了.可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用, ...
- Android学习笔记(第一篇)编写第一个程序Hello World+Activity
PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序.. 学习Android,那么就需要有一个编译器来集 ...
- 【转】Android学习基础自定义Checkbox组件
原文网址:http://forum.maiziedu.com/thread-515-1-1.html heckbox组件是一种可同时选中多项的基础控件,即复选框,在android学习中,Checkbo ...
- Android 学习手札(一) 应用程序架构
1.资源列表 Android支持的资源列表 目 录 资源类型 描述 res/anim XML 该目录用于存放帧(frame).动画或补间(tweened)动画文件 res/drawable ...
随机推荐
- channel_id以及type_id的内容
- CreateExcel 导出Excel
public class CreateExcel { /// <summary> /// 用Excel组件导出Excel文件 /// </summary> /// <pa ...
- VS2010-安装包制作过程图解
最近做了winform相关程序,开始总结制作安装包过程. 1.首先在打开 VS2010 =>新建=>项目 2.创建一个安装项目 Setup1 在“目标计算机上的文件系统”下我们看见 ...
- 协程《三》gevent模块
一 gevent模块 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它 ...
- 并不能来一发50AC
本来想来一发50AC嗨一下 然后发现只有40+ 算了放弃了..
- Django权限控制进阶
一.一级菜单的排序 我们用字典存放菜单信息,而字典是无序的,当一级菜单过多时可能会出现乱序情况,因此需要给一级菜单排序 1.给一级菜单表的model中加一个weight权重的字段 ,权重越大越靠前 w ...
- Web Service入门
[IT168 技术文档] 一.什么是Web Service? Web Service是构建互联网分布式系统的基本部件.Web Services 正成为企业应用集成(Enterprise App ...
- 跟我一起读postgresql源码(三)——Rewrite(查询重写模块)
上一篇博文我们阅读了postgresql中查询分析模块的源码.查询分析模块对前台送来的命令进行词法分析.语法分析和语义分析后获得对应的查询树(Query).在获得查询树之后,程序开始对查询树进行查询重 ...
- 从图片中提取html格式的布局
制作界面的自动化 意义:对于程序设计人员来说,比较痛苦的是制作界面.从设计人员发送的稿件(通常为jpg格式),到完成html的布局,需要将图像转化为div标记,自动化这一过程十分有意义 1.设计一个工 ...
- Optimizing and caching browser bundles...
扎心了,老铁!!! 他妈的,弄了几天都是卡在这里!!上网查了一下.说是我的内存不够,好吧.我慢慢等,然而让我等了好几天都没什么反应..两天了,一直卡在这里.今天在虚拟机也是发狠了. 我直接把虚拟机的内 ...