您的位置:首页 > 移动开发 > Android开发

Android四大组件

2016-03-31 23:35 483 查看
四大组件:

Activity

*Activity提供一个与用户交互的界面,通过setContentView(View)来指定需要显示的控件

*Activity的使用:

1、继承Activity并在清单文件中配置<activity> 以及intent—filter意图过滤,action、category。

 Lable 属性:Activity 页面的标题,界面的名字,如果此界面被创建快捷方式,则快捷方式的名字就是lable 值。

Name 属性:指定的值为:包名.Activity 类名。包名如果与mainfest 的package 一致可以用“.”代替或者不写。

 Intent-filter 子节点:添加意图过滤,可以通过隐式意图启动。可以在桌面生成快捷方式,应用程序的入口。

Icon 属性指定应用程序的图标

 android:theme 属性,指定主题:android:theme="@android:style/Theme.Dialog"。

*意图:Android中的组件都可以通过意图intent激活,意图分为显示和隐式意图两种

显示意图:Intent intent = new Intent(Context,XXXActivity.class或者全路径名);用于本应用中跳转

intent.setClassName("应用全路径名","类全路径名");可以用于不同应用中的跳转

隐式意图:能够被隐式意图跳转的Activity的清单配置中需要intent-filter并且拥有action和category

<category android:name="android.intent.category.LAUNCHER" />配置了这个属性的,将会创建快捷图标,程序将会多一个入口

<category android:name="android.intent.category.DEFAULT"/>这两者是有区别的

Intent intent = new Intent();

intent.setAction("类全路径名")

intent.addCategary("categary")

data 中还可以设置type 属性,那么激活时,也就必须setType()

<data android:mimeType=""></data>

*使用startActivityForResult(intent,requestcode)方式打开activity,可以传递数据

*被打开的Activity使用setResult(int resultCode,Intent data);该Activity被关闭之后,

*原Activity中的onActivityResult(int requestCode,int resultCode,Intent data)将被调用并获取传回来的Intent

*Activity的生命周期:onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory

| | |-- LiveLifeTime --| | |

| |--- VisibleLifeTime ---| |

|--- EntireLifeTime ---|

*任务栈:一个程序开启时,系统将分配一个任务栈,用于存储和记录Activity的信息

让用户可以有序的选择使用的Activity,当退出应用程序时所有Activity清除出栈,栈销毁。

每开启一个页面便在栈中添加一个Activity,会造成数据冗杂,重复数据多,导致OOM异常,为此,引入了Activity的开启模式

*Activity开始模式: 需要在activity节点中配置android:launchMode属性

Standard:默认方式

SingleTop: 当一个Activity位于栈顶,再次调用时,服用已存在的,而不是重新创建

SingleTask:当一个已存在的Activity被再次调用时,位于它上面的所以Activity将被清空,使当前Activity位于栈顶

SingleInstance:一个Activity使用一个单独的栈。

-------------------------------------------------------------------------------------------------------

BroadcastReceiver

* broadcast被广泛用于程序间传输信息的机制,而BroadcastReceiver是对Broadcast进行过滤并响应的一类组件

* 使用:

广播接收者(BroadcastReceiver)用于接收广播Intent 的, 广播Intent 的发送

是通过调用sendBroadcast/sendOrderedBroadcast 来实现的。通常一个广播Intent

可以被订阅了此Intent 的多个广播接收者所接收。

1、定义类继承BroadcastReceiver,重写onReceive方法

2、注册广播接受者:通常有两种方式,以SD卡卸载为例

* 静态注册:添加配置文件

<receiverandroid:name="com.itheima.broadcastReciver.SDCardUnmountedReceiver">

<intent-filter>

<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>

<data android:scheme="file"></data>

</intent-filter>

</receiver>

**动态注册:IntentFilter intentFilter = new IntentFilter("android.intent.action.MEDIA_UNMOUNTED");

intentFilter.addDataScheme("file");

registerReceiver(new SDCardUnmountedReceiver(),intentFilter);

不同注册方式的区别:动态注册属于非常驻型广播,程序退出,广播便失效

静态广播所在的程序一旦部署,便长时间生效。3.2版本以上需要启动一次广播所在的程序界面

才能生效。

*广播接收者和Service一样是运行在主线程中,如果有耗时操作,将会产生ANR异常。生命周期短,不能开子线程

*广播分为无序广播,和有序广播两种

1、无序广播:所有订阅了该广播的接收者同时收到广播,不可能广播信息进行更改。

2、有序广播:订阅了该广播的接收者依靠清单文件receiver中的priority等级(-1000~1000)顺序接收,系统默认等级为0

先接收者可以修改数据,也可以通过abortBroadcast将广播拦截。

*系统广播:低电量,手机重启,接收短信,拨打电话,sd卡挂载,一个apk 的安装成功

-------------------------------------------------------------------------------------------------------

Serivce

*1、执行没有UI,不与用户交互的操作,周期长。

*2、和子线程类似,但更安全。

*3、运行在主线程中,不能执行耗时操作。

*4、Service可以长期在后台运行,可以再里面创建线程执行耗时操作,可以作为系统公用组件,为其他应用调用。

1.Service使用

直接启动:

创 建:定义ServiceDemo类,继承Service,同时在清单文件中配置<Service name...>节点.

开启服务:通过意图(在意图中指定要开启的Service),使用startService(intent)方式启动Service

停止服务:stopService(intent)。

避免杀死: 为了避免服务被杀死,可以设置服务为前台进程。在Service中调用setForground(true)---->未证实

绑定启动:使用bindService(intent,ServiceConnection,int flag)。自定义ServiceConnection中重写onServiceConnected

从该方法第二形参中获得IBinder对象,从而可以在其他组件中调用Service中的自定义方法。

解除绑定:unBindService(),在一个组件中,一个服务只能被解绑一次,否则出错。

进程种类:1,forground process

2,visible process

3,service

4,background process

5,empty process

(应用在启动时,系统会分配一个进程。当应用的所有界面被关闭,该进程并不会立即销毁,进入空进程状态)

完整生命周期方法:

onCreate :Service首次开启时执行,只执行一次。

标准开启模式:通过startService方法的开启模式,除非其他组件调用stopService或者自己调用stopSelf方法,否则一直运行。

onStartCommand (deprecated)

onStart :每次调用都会执行。

(绑定开始模式:)其他组件调用bindService方法开启,通过unBindService结束。一个服务和多个程序绑定,当这些绑定都解除了,才会结束。

onBind :该方法在服务被绑定时调用且只调用一次,该方法返回IBinder的子类对象,需要在Service中重新定义。

onUnBind:解除绑定时调用。之后调用onDestroy方法。

onDestroy :Service正常关闭(使用stop方法)时执行。如果后台暴力杀死,则不会执行;

混合生命周期:onDestroy在Service最后服务的方式关闭之后调用。其他方法在各自的活动周期时调用。

服务和广播接受者一样,在执行生命周期方法是,是前台进程,一般不会被杀死。

AIDL RPC (Android Interface Difinition Language||Remote Procedure Call)

编译器通过aidl文件生成一段代码,通过这段代码中的预定义接口达到不同进程服务间的通信的目的。

使用:定义aidl接口,将扩展名从.java改为.aidl,gen目录下会自动生成一个接口。将aidl文件和包一起复制到需要使用的组件中即可。

AIDL 默认只能使用Java 中基本数据类型和String、List、Map

Android 中的服务:

TELEPHONY_SERVICE TelephonyManager PhoneStateListener

-------------------------------------------------------------------------------------------------------

ContentProvider

1、应用程序之间共享数据的接口

2、使用:

*定义类,继承ContentProvider,并重写它的crud方法。(create retrieve update delete)

*配置清单文件节点<provider> name:包类名 authorities:访问provider的唯一标识。

*内容提供者通常和SQLite数据库一起使用,所以会使用到SQLiteOpenHelper

Uri组成:content://com.study.provider/person/10

|schema |授权authorities |path |ID

> schema : 用来说明schema控制数据content://

> authorities:定义由那个provider提供这些数据

> path :URI 下的某个Item (后面两部分可以没有)

> ID : 对应id的数据,#表示所有数据。

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

静态代码块中:matcher.addURI("authorities属性","数据库表名(可以自定义,只要和code匹配使用即可)",int code);

int code = matcher.match(uri); 如果没有匹配的,返回-1;拒绝访问。

3、外部调用Provider:

contentResolver = context.getContentResolver();

Uri insert = contentResolver.insert(uri, values);

Uri uri = Uri.parse("content://authorities/path/id");(path和id可以没有)

ContentValues values = new ContentValues();

values.add(key,value);

// System.out.println(insert);

// long id = ContentUris.parseId(insert);

// System.out.println("插入数据产生的id 是:"+id);

4、系统内容提供者:

短信内容提供者,在packages/providers/TelephonyProvider/SmsProvider.java

5、ContentObserver可以对数据变化进行监听

使用:定义一个ObserverDemo,继承ContentObserver 重写onchange方法,在该方法中实现主要业务逻辑

在MainActivity中注册Observer

Observer = new ObserverDemo(this,null);

Uri uri = Uri.parse("content://sms");

getContentResolver.registerContentObserver(uri,true,observer);

值得注意的是,自定义的ContentProvider中,需要调用

getcontent.getContentResolver().notifyChange(uri,null);通知数据变化

6、音乐、视频、图像、手机通信录联系人信息等)内置了一系列的Content Provider, 这些都位于android.provider 包下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: