第4章android主要开发组件_第1页
第4章android主要开发组件_第2页
第4章android主要开发组件_第3页
第4章android主要开发组件_第4页
第4章android主要开发组件_第5页
已阅读5页,还剩47页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲人:温春水1Activity2Intent4Service3Content

Provider课程目录4Broadcast

Receiver5理解Android应用中四大重要组件及BroadcastReceiver熟练使用Android四大组件及BroadcastReceiver进行项目开发1Activity2Intent4Service3Content

Provider课程目录4Broadcast

Receiver5对开发者而言,Activity是Android应用程序的入口。在Activity类中定义了一系列的生命周期方法,比如

onCreate()、onResume()、onStart()、onPause()、onStop()和onDestroy(),Android系统会在适当的时候调用对应的生命周期方法。运行当Activity位于堆栈的顶部时,它就处于运行状态(active)。暂停当Activity失去了焦点,但是依然可见时,Activity就处于暂停状态(paused),维持着成员信息和所有状态。停止当Activity完全被其他的Activity覆盖时,它就处于停止状态(stopped),处于停止状态的Activity依然维持着成员信息和所有状态,只是变得不可见了。销毁当Activity处于停止或者暂停状态时,系统可能要求它结束生命周期,或者直接把它所在的进程杀死,进而从内存中删除它,此时的Activity就被销毁了。public

class

ActivityextendsApplicationContext

{protected

voidonCreate(){}protected

voidonStart(){}protected

voidonRestart(){}protected

voidonResume(){}protected

voidonPause(){}protected

voidonStop(){}protected

voidonDestroy(){}}package

com.chinasofti.etc;import

android.app.Activity;import

android.os.Bundle;public

class

HelloActivity

extendsActivity

{@Overridepublic

void

onCreate(BundlesavedInstanceState)

{super.onCreate(savedInstanceState);setContentView(R.layout.main);}}<?xml

version="1.0"

encoding="utf-8"?><manifest

xmlns:android="

"package="com.chinasofti.etc"android:versionCode="1"android:versionName="1.0"><application

android:icon="@drawable/icon"android:label="@string/app_name"><activity

android:name=".HelloActivity"android:label="@string/app_name"><intent-filter><action

android:name="ent.action.MAIN"

/><categoryandroid:name="ent.category.LAUNCHER"

/></intent-filter></activity></application><uses-sdk

android:minSdkVersion="7"

/></manifest>startActivity(Intent)方法用于启动一个新的Activity当Activity位于堆栈的顶部时,它就处于运行状态(active)。startActivityForResult(Intent,int)可以用于启动Activity并返回结果 其中参数int代表本次调用

onActivityResult(int,int,Intent)方法返回数据Activity

AintentActivity

Bprotected

void

onListItemClick(ListView

l,

View

v,

int

position,

long

id)

{super.onListItemClick(l,

v,

position,

id);Intent

intent

=

new

Intent(this,

DetailActivity.class);intent.putExtra("name",

peoples[position]);startActivity(intent);}protected

void

onCreate(Bundle

savedInstanceState)

{super.onCreate(savedInstanceState);//获得Intent并从中读取附带的数据

Intent

intent=getIntent();String

name

=

intent.getStringExtra("name");TextView

view

=

new

TextView(this);view.setText("您选择了"+name);setContentView(view);}Activity是与用户交互最主要的机制,当设备的配置(屏幕方向、语言)等发生变化时,系统应该采取必要的措施处理此状况。在AndroidManifest.xml中通过定义android:configChanges属性来指明监听的配置变化,当配置发生变化时,Activity的onConfigurationChanged()方法会被调用,开发者可以在这里处理。如果未做任何处理,由于设备的配置变化往往需要应用重新装载资源,因此系统会销毁Activity并重新启动。演示Activity的生命周期本节的例子代码是demo\activity运行此案例,ContactsActivity和DetailActivity界面分别如下图所示,我们可以在Eclipse开发工具中切换到DDMS页面查看ContactsActivity及DetailActivity的生命周期情况。Intent是对执行某项动作的抽象封装startActivity(Intent)广播一个Intent给BroadcastReceiverstartService(Intent)暂停Intent可以看做是Activity之间的桥梁Action

:

ACTION_VIEW,

ACTION_EDIT,

ACTION_MAINData:封装的数据,以Uri格式表示Category:标志动作执行的分类,例如CATEGORY_LAUNCHERType:MIMEComponent:标明Intent指向的classExtras:用于在Intent中携带一些数据信息ComponentName的含义ComponentName是处理此Intent的组件的名字,例如

com.chinasofti.etc.HelloActivity。ComponentName是可选的,如果被设定,那么系统将直接将其值作为处理Intent的组件。可以通过Intent.setClass(),Intent.setComponent()等方法设置

ComponentName。Action的含义本质上,Action就是一个字符串常量Action可以是对执行动作的直接描述,通常用在Activity中Action也可以是在Intent广播中对已发生动作的描述,通常用在BroadcastReceiver中可以通过Intent.setAction()设置常量目标组件描述ACTION_CALLActivity发起一个电话呼叫ACTION_BATTERY_LOWBroadcastReceiver电池电量低ACTION_SCREEN_ONBroadcastReceiver手机屏幕打开Data的含义Data是以URI代表的数据和MIME代表的数据类型的集合Data通常根据Action的不同而不同,例如ACTION_CALL意味着Data是tel:URI的形式可以通过Intent.setAction()设置Category的含义与Action类似,Category也是一段字符串常量Category描述的信息可以帮助系统确定处理Intent的组件调用Intent.addCategory()可以在Intent中增加一个Category常量含义CATEGORY_HOME当设备启动后,用户看到的第一个Activity或者当用户按下HOME键时显示给用户的Activity。CATEGORY_LAUNCHERActivity是一个task的初始Activity,并且此Activity会被显示在启动面板上。Extras的含义Extras包含了键-值数据对,用于向目标组件传递数据。Intent中包含了一系列的putExtra()和getExtra()方法用于存储和读取相关的数据类型。//存储一个nameintent.putExtra("name",

peoples[position]);//读取存入的nameString

name

=

intent.getStringExtra("name");显式解析,调用setComponent(Component)或setClass(Context,Class)设置Intent指定的运行类。Intent

intent

=

new

Intent(this,

DetailActivity.class);intent.putExtra("name",

peoples[position]);startActivity(intent);隐式解析,未直接标注组件,但是需要提供足够的信息以便系统能够确定运行哪个class。Intent

intent

=

new

Intent();intent.setAction(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);startActivity(intent);浏览器调用Uri

uri

=

Uri.parse("

");Intent

it

=

new

Intent(Intent.ACTION_VIEW,

uri);context.startActivity(it);电话功能调用Uri

uri

=

Uri.parse("tel:2125551212

");Intent

it

=

new

Intent(Intent.ACTION_CALL,

uri);context.startActivity(it);用Intent启动Activity,并在Activity之间传递数据本节的例子代码是demo\intent在同一个应用程序中往往会使用Intent对象来指定一个Activity,并通过startActivity或startActivityForResult方法启动这个Activity。除此之外,通过Intent还可以调用其他应用程序中的

Activity。在AndroidSDK中甚至还允许开发人员自定义Activity

Action。运行本节的例子,单击【开始另一个Activity】按钮,会显示Brower,输出的信息如下图所示。调用其他应用程序中的Activity本节的例子代码是demo\invokeotherapp运行本节的例子,界面如下图所示。Android平台主要提供了文件,SharedPreference,数据库和ContentProvider四种持久化存储方案。ContentProvider是唯一一种能在应用程序之间共享数据的方案。Android上内置的ContentProvider。 音频视频

联系人通话记录ContentProvider不限制底层数据的存储方式,子类可以通过扩展以下抽象方式实现自己的ContentProviderquery(Uri,

String[],

String,

String[],

String)insert(Uri,

ContentValues)update(Uri,

ContentValues,

String,

String[])delete(Uri,

String,

String[])getType(Uri)使用ContentResolver接口对ContentProvider进行数据操作ContentResolver

resolver

=

getContentResolver选择存储数据的方案,通常使用SQLite数据库来存储数据扩展ContentProvider类,实现其中定义的抽象方法,实现数据访问。在AndroidManifest.xml中声明ContentProvider:<provider

android:name="ContactContentProvider"android:authorities="com.A.mobile.contactcontentprovider"</provider>使用ContentProvider获取SD卡中音频数据本节的例子代码是demo\musicActivity在本例子中,由于需要挂载SD卡,所以需要首

先创建一个SD卡,并向SD卡上传输一些MP3歌曲。向模拟器的SD卡中传输文件的方式如下:本例运行后的界面如下图所示:Service介绍让程序在后台运行Service与线程常用的系统服务Service是一段在后台长期运行的代码,与用户不直接交互。Service不是单独的进程,一般来说,Service运行在所在应用程序的进程中。Service不是单独的线程,因此如果在Service中处理耗时的工作,应该放到新线程中,避免堵塞主线程。子类需要继承android.app.Service来实现自己的service。Service是什么Service是Android平台重要的组件之一,运行于后台,不直接与用户交互。启动后的Service具有较高的优先级,系统一般会优先保证

Service的正常运行。只有当前台的Activity的正常运行资源被Service占用时,系统才会暂停Service;一旦重新获得空闲资源,系统会自动重启之前被停掉的Service。为何要用ServiceService为Android平台上的应用提供了一种在后台运行而不影响用户操作的机制,例如媒体播放器在后台播放音乐。Service还为Android应用提供了一种向其他应用暴露接口的能力。这也为应用间的交互提供了便利。Context.startService()onCreate()onStartCommand()onDestroy()onCreate()onBind()IBinderContext.bindService()MP3的后台播放——MusicServicepublic

class

MusicService

extendsService

{private

MediaPlayer

player;private

void

play()

{…}private

void

stop()

{…}@Overridepublic

IBinder

onBind(Intentarg0)

{//不能被其他客户端绑定,返回nullreturn

null;}@Overridepublic

void

onCreate()

{super.onCreate();}@Overridepublic

void

onDestroy()

{super.onDestroy();stop();}@Overridepublic

int

onStartCommand(Intentintent,

int

flags,

int

startId)

{super.onStartCommand(inte

nt,flags,

startId);Play();//开始播放音乐}}在AndroidManifest.xml中加入<service>标签。使用intent-filter标签可以让隐式解析的方式启动Service。<service

android:name=".MusicService"><intent-filter><action

android:name="com.A.service.START"

/><category

android:name="ent.category.DEFAULT"

/></intent-filter></service>//初始化播放按钮

Button

play=(Button)findViewById(R.id.play);play.setOnClickListener(newView.OnClickListener()

{public

void

onClick(View

arg0)

{//启动Service

Intent

intent=newIntent(MainActivity.this,MusicService.class);startService(intent);}});//初始化停止按钮

Button

stop=(Button)findViewById(R.id.stop);stop.setOnClickListener(newView.OnClickListener()

{public

void

onClick(View

arg0)

{//停止Service

Intent

intent=newIntent(MainActivity.this,MusicService.class);stopService(intent);}});点击“播放”按钮,播放器就会开始播放音乐;点击“停止”按钮,音乐播放就会停止。如果在音乐播放中直接退出Activity,音乐播放仍可继续不受影响,这说明借助Service组件,程序已经能够在后台运行了。Activity与Service通信是应用程序的内在需求。为了减小耦合度,一般采用Intent的方式在Service与Activity之间通信。Service广播Intent,Acitivty使用BroadcastReceiver接收。ServiceActivity1Activity2ActivityN……为MediaPlayer注册一个OnCompletionListener,当音乐播放结束后,利用广播方式发送Intent。MediaPlayer.OnCompletionListener

listener

=

newMediaPlayer.OnCompletionListener()

{public

void

onCompletion(MediaPlayer

arg0)

{//MusicService使用广播方式向Activity发送数据

Intent

intent=new

Intent(MUSIC_COMPLETED);intent.putExtra("msg",getText(

pleted));sendBroadcast(intent);}};跨进程调用创建AIDL接口文件实现AIDL接口绑定Service调用IPC方法Android平台轻量级跨进程调用机制的核心——IBinder。在Android平台跨进程调用机制中,方法的调用是在本地,实际执行却是在另一个进程内。Android平台负责将方法调用和方法传递的数据分解,以便底层操作系统理解,将方法调用从本地进程和地址空间传递到远程进程和地址空间,在另一端重新组装、执行;返回结果则以相反的方向传递给本地调用者。上述调用过程对开发者是透明的。TelephonyService能够为应用提供电话相关的功能和信息,例如电话的状态,或者一些相关的运营商信息等。如果应用希望在电话状态发生变化时收到通知,也可通过注册PhoneStateListener,并按需实现其中的一些方法。//获取Telephony

Service的对象

TelephonyManager

tm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);//创建PhoneStateListener对象并按需实现其中定义的方法

PhoneStateListener

phoneStateListener=new

PhoneStateListener(){…};//监听电话状态

tm.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);//取消监听tm.listen(phoneStateListener,

PhoneStateListener.LISTEN_NONE);AlarmService提供了管理、操纵硬件时钟的功能,如设置时间、设置时区、设定定时触发时间等。AlarmService中一个重要的方法就是setRepeating,可以设置执行时间和相应的动作。//创建PendingIntent,设置执行动作

Intent?intent?=?new?Intent(this,?MyActivity.class);?

PendingIntent?pendingActivityIntent?=?PendingIntent.getActivity(this,?0,intent,?0);//获取Alarm

Service的对象

AlarmManager

am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);//设置定时器,时间到达后Alarm

Service会发出Intentam.setRepeating(AlarmManager.RTC,?0,?5000,?pendingActivityIntent);//取消定时器

alarmManager.cancel(pendingActivityIntent);LocationService为应用提供访问设备定位功能的途径,包括定时获取最新的位置信息,或者在设备进入设定区域时发起预定事件。由于设备上可能有多种提供位置信息的源(例如GPS、Cell等),因此需要先确定Provider。//获取Location

Service的对象

LocationManager

lm=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);//查询设备上所有provider的名称List<String>

providers

=

lm.getAllProviders();//对于providers中的每个Provider,可通过getProvider()获得

LocationProvider对象LocationProvider

provider

=

lm.getProvider(“gps”);//通过设置Criteria,可使用getBestProvider()得到满足设定条件的最佳

Provider//如果没有符合条件的,会返回nullString

bestProvider

=

lm.getBestProvider(criteria,

true);LBS提供的核心服务是随时更新设备所在位置。Location

Service给应用提供了多种接口,以便获得位置信息。如果希望随时获得最新的位置信息,可通过注册Listener的方式获取位置更新或者设置接近警报(监听设备进入或离开某个区域)。//监听位置更新public

void

updateLocation(){

lm.requestLocationUpdates(LocationManager.AGPS_PROVIDER,600000,10,newLocationListener(){public

voidonLocationChanged(Locationloc){}public

voidonProviderDisabled(Stringprovider)

{}public

voidonLocationChanged(Location

l)

{}//可注册BroadcastReceiver接收警报并作出响应public

void

monitorProximityAlert(){Intent

intent

=

newIntent("com.Android.example.ProximityAlert");

PendingIntentpendingIntent=PendingIntent.getBroadcast(this,-1,intent,0);double

latitude

=

-121.45356;double

longitude

=

46.51119;//设置永不过期long

expiration

=

-1;lm.addProximityAlert(latitude,longi1Activity2Intent4Service3Content

Provider课程目录4Broadcast

Receiver5BroadcastReceiver用于接收sendBroadcast()方法广播的Intent,例如应用程序接收开机信息,短信等情况。普通广播是完全异步的,所有的BroadcastReceiver运行的顺序是不确定的。这意味着Receiver无法取消广播。顺序广播会按照BroadcastReceiver的优先级顺序执行,每次只有一个

Receiver在执行,可以调用abortBroadcast()方法取消广播。动态注册需要调用方法Context.registerReceiver()IntentFilter

intentFilter

=

new

IntentFilter();intentFilter.addAction(action);registerReceiver(BroadcastReceiver,intentFilter);静态注册需要使用AndroidManifest.xml的<receiver>标签<receiver

android:name=".BootReceiver"

><intent-filter><actionandroid:name="ent.actio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论