android框架

基本框架


1、Activity前台界面,入口
2、Service 后台服务
3、组件间的事件响应: Broadcast Resolover。
4、组件间的复杂数据传递:ContentProvid。


组件的生成方式:编写继承各个组件类(接口)的类,实现相应的方法。编完后要在Android中注册IntentFilter,用来被调用。


Intent表示一个意图(一种语言规范)。原理:当开发者调用startActivity(Intent),startSerive(Intent),sendBroadcast(Intent)后,Android会在IntentFilter中查找与调用Intent匹配的IntertFilter,从而启动相应的组件。

 

 



 

 

 

 

 

 

Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起。在manifest中,描述了每一个组件以及组件的作用。

这里有6个组件,它们是Android应用程序的基石:

? Activities(活动)

应用程序的显示层。每一个画面对应于你的应用程序,将会是Activity类的扩展。Activity使用Views去构建UI来显示信息和响应用户的行为。就桌面开发而言,一个Activity相当于一张Form。你在这章中将会学习到更多关于Activities。

? Services(服务)

Android应用程序中不可见的“工人”。 Service组件运行时不可见,但它负责更新的数据源和可见的Activity,以及触发通知。它们常用来执行一些需要持续运行的处理,当你的Activity已经不处于激活状态或不可见。你将在第8章学习怎样创建Service。

? Content(内容)

提供共享的数据存储。Content Provider(内容提供器)用来管理和共享应用程序的数据库。在应用程序间,Content Provider是共享数据的首选方式。这意味着,你可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据。Android设备本身包含了几个Content Provider来访问像联系人信息等有用的数据库。你将在第6章学习怎样创建和使用Content Provider。

? Intents(意图)

简单的消息传递框架。使用Intent,你可以在整个系统内广播消息或者给特定的Activity或者服务来执行你的行为意图。系统会决定那个(些)目标来执行适当的行为。

? Broadcast Receivers(广播接收器)

Intent广播的“消费者”。通过创建和注册一个Broadcast Receiver,应用程序可以监听符合特定条件的广播的Intent。Broadcast Receiver 会自动的启动你的Android应用程序去响应新来的Intent。Broadcast Receiver是事件驱动程序的理想手段。

? Notifications(通知)

用户通知的框架。Notification用来在不需要焦点或不中断它们当前Activity的情况下提示用户。它们是Service或Broadcast Receiver获得用户注意的首选方式。例如,当设备收到文本信息或外部来电时,它通过闪光,发声,显示图标或显示对话框信息来提醒你。在第8章里,你可以使用Notification来触发这些事件。


解除Android应用程序组件间的依赖关系,你可以和其他应用程序共享和交换一些个别的组件单元,例如Content Provider或Service——你的和其他的都是第三方的。

我们曾经在相关文章中对Android系统中的组件进行了详细的介绍,相信一直关注我们51CTO的编程爱好者们会对这方面的知识有一个充分的掌握。那么下面将要为大家带来的则是Android组件交互的相关方式。

Android应用中,由一些基本元素构成,但如何交互呢?

Activity->Activity: Activity之间通过Intent进行交互,可以通过直接类名直接跳转,也可以通过Intent Filter进行匹配分析,然后找到对应的Activity进行切换,这是一种松散的藕合。

Internal Activity: 在Activity 内部,View,Button 等UI组件通过设定Listener对UI事件进行监听处理。

Progress->Progress: 可以采用Braodcast Intent的方式进行与目标组件进行交互,也可以用一般的Intent。比如 Activity 调另一个Activity ,可以使用startActivity (new Intent(xx.this, yyy.class);方式。

Any -> BroadcastReceiver 由发起者发送一个PendingIntent, BroadcastReceiver的onReceive(Context context, Intent intent)被调用

Any-> ContentProvider 调用者使用 getContentResolver()方式取得 AndroidManifest.xml中配置的 ContentProvider 然后通过URi方式对其中的目标进行操作

Intent intent = getIntent();   if (intent.getData() == null) intent.setData(CONTENT_URI);   Cursor cur = getContentResolver().query(getIntent().getData(),   PROJECTION, null, null, null);   Any-> Service 由发起者 context.startService(new Intent(context, XXX.class))这种方式可以调用,也可以对 注册过的服务采用服务名称的调用方式。

程序由生到死:

选中程序文件映像,起动模块起动进程,并发送Intent到这个进程,这个进程通过Intent Filter匹配到一个Activity, 运行这个Activity的onCreate.当用户中止程序,或者由Android程序管理器由于内存等原理,按该进程优先级别,Kill掉该进程。

 

 

Activity主要包含六个方法,分别是onCreate,onStart,onResume,onPause,onStop,onDestory。

Start与Stop一对,表达的是可见与非可见这么一个过程;onStop-->onRestart -->onStart
Resume和Pause这一对表达的是否处于激活状态的过程。


onCreate函数:注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的,然后调用上

面那个用来初始化的函数初始化布局信息。

onStart函数:注册一些变量。这些变量必须在Android Activity类在前台的时候才能够被响应。

onResume函数:调用一些刷新UI的函数,每当Activity调用到这里时就要刷新一下UI各控件的状态。

onPause函数:一般是做一些变量的设置,因为这个时候Activity马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整。

onStop函数:反注册在onStart函数中注册的变量。

onDestory函数:反注册在onCreate函数中注册的变量。

 


主Activity和子Acitivity通信的方式有很多种这里介绍两种最简单的方法。

方法一:通过Intent来进行参数的传递,在Intent中有各种putXXX方法来存放各种参数,然后在子Activity接收到这个Intent时能够从这个Intent里

取出这个参数,利用getIntnet()。getXXXExtra()方法就可以了。

方法二:当一个主Activity想从一个子Activity接受消息时可以使用StartActivityforResult方法,例如这样启动一个Activity,

startActivityForResult(i, REQUEST_CODE); 然后在主Activity中的onActivityResult方法对requestCode进行判断来对子Android Activity类

不同的返回处理不同的情况,另外子Activity也可以利用setResult方法来设置主Activity方法中的resultCode,这样主Activity也可以根据子

Activity的不同的resultCode来处理不同的情况。

在内存不足的时候,Android是会主动清理门户的,那它又是如何判断哪个process是可以清掉的呢?文档中也提到了它的重要性排序:

1. 最容易被清掉的是empty process,空进程是指那些没有Activity与之绑定,也没有任何应用程序组件(如Services或者IntentReceiver)与之绑

定的进程,也就是说在这个process中没有任何activity或者service之类的东西,它们仅仅是作为一个cache,在启动新的 Activity时可以提高速度

。它们是会被优先清掉的。因此建议,我们的后台操作,最好是作成Service的形式,也就是说应该在Activity中启动一个Service去执行这些操作。

2.接下来就是background activity了,也就是被stop掉了那些activity所处的process,那些不可见的Activity被清掉的确是安全的,系统维持着

一个 LRU列表,多个处于background的activity都在这里面,系统可以根据LRU列表判断哪些activity是可以被清掉的,以及其中哪一个应该是最先

被清掉。不过,文档中提到在这个已被清掉的Activity又被重新创建的时候,它的onCreate会被调用,参数就是onFreeze时的那个Bundle。不过这里

有一点不明白的是,难道这个Activity被killed时,Android会帮它保留着这个Bundle吗?

3.然后就轮到service process了,这是一个与Service绑定的进程,由startService方法启动。虽然它们不为用户所见,但一般是在处理一些长时间

的操作(例如MP3的播放),系统会保护它,除非真的没有内存可用了。

4.接着又轮到那些visible activity了,或者说visible process。前面也谈到这个情况,被Paused的Activity也是有可能会被系统清掉,不过相对

来说,它已经是处于一个比较安全的位置了。

5.最安全应该就是那个foreground activity了,不到迫不得已它是不会被清掉的。这种process不仅包括resume之后的activity,也包括那些

onReceiveIntent之后的IntentReceiver实例。

在Android Application的生命周期的讨论中,文档也提到了一些需要注意的事项:因为Android应用程序的生存期并不是由应用本身直接控制的,而

是由 Android系统平台进行管理的,所以,对于我们开发者而言,需要了解不同的组件Activity、Service和IntentReceiver的生命,切记的是:如

果组件的选择不当,很有可能系统会杀掉一个正在进行重要工作的进程。

Intent:意图:包括action和一些要传递的数据的集合。
Intent的使用。
1、生成Intent
2、并设置动作标记(AndroidManifest注册IntentFilter的action)或直接指定组件:setComponent(ComponentName) ,setClass(Context, Class)。
3、设置Intent的数据,如:设置需要传递的数据putExtras()
4、执行Intent:   
   startActivity(Intent),startActivityForresult(Intent,int),startService(Intent),sendBoradcast(Intent)(需要在AndroidManifest注册IntentFilter的action)
PendingIntent扩展Intent让Intent具有启动指定组件的功能。
生成PendingIntent:
getActivity(Context context, int requestCode, Intent intent, int flags)
getBroadcast(Context context, int requestCode, Intent intent, int lags)
getService(Context context, int requestCode, Intent intent, int flags)

 

 

ContentProvider组件间数据共享,ContentResolver访问所有的ContentProvier
使用:
ContentProvider封装了:
1、一个要共享的数据源:数据源可以是任意数据
2、定位数据资源的URI树
通过UriMatcher将URI与一指定的标识联系起来。需要时可以通过UriMatcher的math(URI uri)返回标识
static{
 UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 sUriMatcher.addURI(Diary.AUTHORITY,"diaries",DIRAIES);
 sUriMatcher.addURI(Diary.AUTHORITY,"diaries/#",DIARY_ID);
}
 3、增删改查数据源的抽象方法,方法体内先要用UriMatcher对Uri进行解析
insert(Uri uri, ContentValues values)
delete(Uri uri, String selection, String[] selectionArgs)
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

ContentResolver:
调用ContextWrapper的getContentResolver()得到所一个可以访问所有ContentProvider的resolver
调用ContentResolver的insert() delete() query() update()方法里的URI参数来定位ContentProvider

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岩-悠然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值