第七章android后台服务电话服务SMSMMS_第1页
第七章android后台服务电话服务SMSMMS_第2页
第七章android后台服务电话服务SMSMMS_第3页
第七章android后台服务电话服务SMSMMS_第4页
第七章android后台服务电话服务SMSMMS_第5页
已阅读5页,还剩38页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

Android背景办事,Android电话办事,SMS和MMS

1.Service技能

1.1.Service观点及用途:

Adroid中的办事,它与Activity差异,它是不能与用户交互的,不能自己启动的,运

行在背景的步伐,如果我们退出应用时,Service进程并没有结束,它仍然在背景运行,那

我们什么时候会用到Service呢?好比我们播放音乐的时候,有可能想边听音乐边干些其

他事情,当我们退出播放音乐的应用,如果不消Service,我们就听不到歌了,所以这时候

就得用到Service了,乂好比当我们一个应用的数据是通过网络获取的,差异时间(一段

时间)的数据是差异的这时候我们可以用Service在背景定时更新,而不消每打开应用的

时候在去获取。

1.2.Service的类型

Service有两种类型:

A.当地办事(LocalService):用于应用步伐内部

B.远程办事(RemoteSercie):用于android系统内部的应用步伐之间

当地办事用于实现应用步伐自己的一些耗时任务,好比查询升级信息,并不占用应用步

伐好比Activity所属线程,而是单开线程背景执行,这样用户体验比力好。

远程办事可被其他应用步伐复用,好比天气预报办事,其他应用步伐不需要再写这样的

办事,调用已有的即可。

1.3.启动办事两种式:

A.startService(intent):用该方法启动办事,该办事不会跟启动的应用步伐绑定在一起,

该办事启动完之后,应用步伐终止,该办事会继承在背景运行

B.bindService(intentzconn,Service.BIND_AUTO_CREATE):绑定办事,该办事

会跟启动的应用步伐绑定在一起,该办事启动完之后,如果应用步伐终止,该办事会终

止运行

1.4.终止办事方法:

A.由其它步伐来终止办事Service(conn)

B.由办事自己来终止:Service.stopSelf。大概Service.stopSelfResult(startld)

1.5.Service生命周期:

AndroidService的生命周期并不像Activity那么庞大,只有onCreate()z

onStart(),onDestroy()三个要领,当我们第一次启动Service时,先后调用了

onCreate(),onStart()这两个要领,当停止Service时,则执行onDestroy。要领,这里

需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行

onCreate。要领,而是直接执行onStart。要领,启动多次办事时,会调用onStart。要

领多次,但onCreate。只被调用一次,无论。nStart()要领调用几多次,停止办事办事

只需调用一次即可

而启动service,凭据onStartCommand的返回值差异,有两个附加的模式:

阐发onStartCommand要领参数的作用和返回值的作用:

1、凭据这个要领的返回值差异可以有两种启动模式

START_NOT_STICKYZSTART_STICKY,(当进程被杀死的时候,是否重新启动。如果是

参数:START_REDELIVER」NTENT表现当办事所在进程被杀死后,重新启动,而且重

新通报Intent内容,其它两个参数不会重新通报intent,都为null)

2、返回START_REDELIVER_INTENT的时候,如果岂论启动几多次,当重新启动的时

候,也会启动几多次。

3、是当前办事的标记

4、第三个参数startld表现当前启动的Service的次数。

看看官方给出的比力流程示意图:

Serviceisrunning

(clientsare

Activeboundtoit)

LifetimeI

Allclientsunbindbycalling

unbindServiceO

UnboundedBounded

官方文档报告我们,一个service可以同时start而且bind,在这样的情况,系统会一直

保持service的运行状态如果service已经start了大概BINDAUTO_CREATE标记被设置。

如果没有一个条件满足,那么系统将会调用onDestory要领来终止service.所有的清理事

情(终止线程,反注册吸收器)都在cnDdstcry中完成.

拥有service的进程具有较高的优先级

官方文档报告我们,Android系统会尽量保持拥有service的进程运行,只要在该service

已经被启动(start)大概客户端连接(bindScrvice)到它“当内存不敷时,需要保持,捕有

service的进程具有较高的优先级。

1.如果service正在调用onCreate,onStartCommand大概onDestory要领,那么用于当前

service的进程则变为前台进程以制止被killed。

2.如果当前.service已经被启动(slarl),拥有它的进程则比那些用户可见的进程优先级

低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.

3.如果客户端已经连接到service(bindService),那么拥有Service的进程则拥有最高

的优先级,可以认为service是可见的。

4.如果service可以使用startForeground(int,Notification)要领来将service设置

为前台状态,那么系统就认为是对用户可见的,并不会在内存不敷时killed。

如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进

程的重要性。

1.6.Service与Activity通信:

Service后端的数据最终照旧要出现在前端Activity之上的,因为启动Service时,

系统会重新开启一个新的进程,这就涉及到差异进程间通信的问题了(AIDL)这一节我不作

过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和

onBindService要领,它们分别执行了Service中1Binder。和onUnbind。要领。

1.7.编写一个背景办事步调:

1.7.1.写一个类继承Service类

1.7.2.在清单文件描述Service类

1.7.3.办事不能自己启动,必须由其它步伐来启动

1.8.代码示例:

实例一

演示如何创建、启动、停止及绑定一个service

步伐文件

packagecom.amaker.ch07.app;

import.R;

importandroid.app.Activity;

importandroid.app.Service;

importandroid.content.ComponentName;

importandroid.content.Intent;

importandroid.content.ServiceConnection;

importandroid.os.Bundle;

importandroid.os.TRindpr;

importandroid.util.Log;

importandroid.vievj.View;

importandroid.vievz.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.Toast;

/★★

*测试Service

*/

publicclassMainActivityextendsActivity{

//声明Button

privateButtonstartBtn,stopBtn,bindBtn,unbindBtn;

(^Override

publicvoidonCreate(BundlesavedlnstanceState){

super.onCreate(savedlnstanceState);

//设置当前结构视图

setcontentview(R.layout.main);

//实例化Button

startBtn=(Button)findViewByld(R.id.startButtonOl);

stopBtn=(Button)findViewByld(R.id.stopButton02);

bindBtn=(Button)findViewByld(R.id.bindButton03);

unbindBtn=(Button)findViewByld(R.id.unbindButton04);

//添加监听器

startBtn.setOnClickListener(startlistener);

stopBtn.setOnClickListener(stopListener);

bindBtn.setOnClickListener(bindListener);

unbindBtn.setOnClickListener(unBindListener);

)

//启动Service监听器

privateOnClickListenerstartListener=newOnClickListener(){

@Override

publicvoidonClick(Viewv)(

//创建Intent

Intentintent=newIntent();

//设置Action属性

intent.setAction("corn,amaker.ch07.app.action.MY_SERVICE");

//启动该Service

startService(intent);

)

);

//停止Service监听器

privateOnClickListenerstopListener=newOnClickListener(){

@Override

publicvoidonClick(Viewv)(

//创建Intent

Intentintent=newIntent();

//设置Action属性

intent.setAction("com.amaker.ch07.app.action.MY_SERVICE");

//启动该Service

stopService(intent);

)

);

//连接工具

privateServiceconnectionconn=newServiceConnection(){

@Override

publicvoidonServiceConnected(ComponentNamename,IBinder

service){

Log.iCSERVICE","连接乐成!");

Toast.makeText(MainActivity.this,”连接乐成!”,

Toast.LENGTH_LONG).show();

)

^Override

publicvoidonServiceDisconnected(ComponentNamename){

Log.i("SERVICE”,“断开连接!”);

Toast.makeText(MainActivity.this,”断开连接!”,

Toast.LENGTH_LONG),show();

}

);

//绑定Service监听器

privateOnClickListenerbindListener=newOnClickListener(){

@Override

publicvoidonClick.(Viewv){

//创建Intent

Intentintent=newIntent();

//设置Action属性

intent.setAction("com.amaker.ch07.app.action.MYSERVICE");

//绑定Service

bindSprviCA(intpntzconnzSprvr.A.RTNr)_AUTO_CRF.ATF.);

)

);

//解除绑定Service监听器

privateOnClickListenerunBindListener=newOnClickListener()

@Override

publicvoidonClick(Viewv){

//创建Intent

Intentintent=newIntent();

//设置Action属性

tion(ncom.amaker.ch07.app.action.MY_SERVICE");

//解除绑定Service

unbindService(conn);

)

);

packagecom.amaker.ch07.app;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

importandroid.util.Log;

importandroid.widget.Toast;

/★★

*测试Service

*/

publicclassMyServiceextendsService{

//可以返回null,通常返回一个有aidl界说的接口

publicIBinderonBind(Intentintent){

Log.i("SERVICE'1,"onBind..............n);

Toast.makeText(MyService.this,"onBind..............

Toast.LENGTH_LONG).show();

returnnull;

)

//Service创建时调用

publicvoidonCreate(){

Log.i("SERVICE","onCreate..............n);

Toast.makeText(MyService.this,"onCreate..............

Toast.T.ENGTH_T.ONG).show();

}

//当客户端调用startservice()要领启动Service时,该要领被调用

publicvoidonStart(Intentintent,intstartld){

Log.i("SERVICE**,"onStart..............");

Toast.makeText(MyService.this,"onStart..............

Toast.LENGTH_LONG),show();

)

//当Service不再使用时调用

publicvoidonDestroy(){

Log.i("SERVICE'1,nonDestroy..............”);

Toast.makeText(MyService.this,"onDestroy..............

Toast.LENGTH_LONG),show();

<?xmlversion=**l.O*1encoding="utf-8”?>

<LinearLayout

xmlns:androi^^http://schemas.android.con/apk/res/android"

android:orientation="vertical',

android:layout_width=nfill_parentn

android:layout_height=Hfill_parentn

>

<Button

android:text="启动Service*'

android:id=,'@+id/startButton01"

android:layout_width=,,wrap_contentH

android:layout_height=,,wrap_contentnx/Button>

<Button

android:text="停止Service*1

android:id=n@+id/stopButton02"

android:layout_width=nwrap_content"

android:layout_height=,'wrap_contentnx/Button>

<Button

android:text="绑定Service**

android:id=,,@+id/bindButton03u

android:layoutwidth='*wrapcontent"

android:layout_height=,'wrap_contentn></Button>

<Button

android:text="解除绑定”

android:id=,,@+id/unbindButton04"

android:layoutwidth='*wrapcontent"

android:1ayout_height=nwrap_contentn></Button>

</LinearLayout>

清单文件

/Chapter07_Service_Example/Android

<?xmlversion=nl.O'1encoding=nutf-8u?>

<manifest

xmlns:android=,'http://schemas.android.con/apk/res/android1,

package=Hcom.amaker.ch07.app"

android:versionCode=,,lu

android:versionName="l.0">

<applicationandroid:icon=n@drawable/iconn

android:label=n@string/app_nameu>

<activityandroid:name=M.MainActivity*'

android:label=n0string/app_namen>

<intent-filter>

<actionandroid:name=Hent.action.MAIN"/>

〈category

android:name=Hent.category.LAUNCHER"/>

</intent-filter>

</activity>

<serviceandroid:name=,,MyServicen>

<intent-filter>

<action

android:name=Mcom.amaker.ch07.app.action.MY_SERVICE*'/>

</intent-filter>

</service>

</application>

<uses-sdkandroid:minSdkVersion=,,3,'/>

</manifest>

实例二、远程service调用

实现方法RPC(remoteprocedurescall)远程进程调用(androidinterfacedefinition

language)接口界说语言

步调:

1)编写aidl接口,ADT插件会主动生成一些相关接口

2)编写aidl接口对应的实现类

3)在service中的onBind。要领返回远程接口实现类工具

工二代码

packagecom.amaker.ch07.app;

importcom.amaker.ch07.app.IPerson;

importcom.amaker.ch07.app.R;

importandroid.app.Activity;

importandroid.app.Service;

importandroid.content.ComponentName;

importandroid.content.Intent;

importandroid.content.Serviceconnection;

importandroid.os.Bundle;

importandroid.os.IBinder;

importandroid.os.RemoteException;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widcet.Button;

importandroid.widcet.Toast;

*RPC测试

publicclassMainActivityextendsActivity{

//声明工Person接口

privateIPersoniPerson;

//声明Button

privateButtonbtn;

//实例化Serviceconnection

privateServiceconnectionconn=newServiceconnection(){

@Override

synchronizedpublicvoidonServiceConnected(ComponentNamen

ame,IBinderservice){

//得至工Person接口

iPerson=IPerson.Stub.aslnterface(service);

if(iPerson!=null)

try

//RPC要领调用

iPerson.setName("hz.guo");

iPerson.setAge(30);

Stringmsg=iPerson.display();

//显示要领调用返回值

Toast.makeText(MainActivity.thisTH_LONG)

.show();

}catch(RemoteExceptione){

e.printStackTrace();

}

}

@Ov(?rridQ

publicvoidonServiceDisconnected(SomponentNamename){

)

};

©Override

publicvoidonCreate(BundlesavedlnstanceState){

super.onCreate(savedlnstanceState);

//设置当前视图结构

setContentView(R.layout.main);

//实例化Button

btn=(Button)findViewByld(R.id.ButtonOl);

〃为Button添加单击事件监听器

btn.setOnClickListener(newOnClickListener(){

^Override

publicvoidonClick(Viewv){

//实例化Intent

intentintent=newintent();

//设置IntentAction属性

intent

.setAction(ncom.amaker.ch09.app.action.MY_REM

OTE_SERVICEn);

//绑定办事

bindService(intent,conn,Service.BIND_AUTO_CREATE);

}

));

}

}

©

/ChapterO7_Servic

□DR码

电

packagecom.amaker.ch07.app;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

importcom.amaker.ch07.app.IPerson.Stub;

/★★

*使用Service将接口袒露给客户端

*/

pi.iblicclassMyRpmotpSArviCPexpandsS^rviep{

//声明工Person接口

privateStubiPerson=newIPersonlmpl();

@Override

publicIBinderonBind(Intentintent){

returniPerson;

)

)

江人码

0

packagecom.amaker.ch07.app;

importcom.amaker.ch07.app.IPerson;

importandroid.os.RemoteException;

/★★

★

*工Person接口实现类

*/

publicclassIPersonlmplextendsIPerson.Stub{

//声明两个变量

privateintage;

privateStringname;

(^Override

//昆示namp和aq今

publicStringdisplay()throwsRemoteException{

return"name:"+name+”;age="+age;

)

@Override

〃设置age

publicvoidsetAge(intage)throwsRemoteException{

this.age=age;

©Override

//设置name

publicvoidsetMame(Stringname)throwsRemoteException{

this.name=name;

packagecom.amaker.ch07.app;

interfaceIPerson{

voidsetAge(intage);

voidsetName(Stringname);

Stringdisplay(;•;

)

结构文件

/Chapter07_Service_Remote

叫弋码

电

<?xmlversion=,,l.0"encoding=*'utf-8n?>

<LinearLayoutxmlns:android=H/apk/res/an

droid*'

android:orientation=,,vertical

android:layout_width=nfill_parentn

android:layout_neight=,,fill_parent',

>

<Button

android:试远程Service',

android:id=*'0+id/Button01,*

android:layout_width="wrap_content”

android:layout_height=Hwrap_contentn></Button>

</LinearLayout>

电

清单文件

三日弋码

电

<?xmlversion='*l.0"encoding=Hutf-8"?>

〈manifestxmlns:android=H/apk/res/androi

d”

package=ncom.amaker.ch07.appn

android:versionCode=*'ln

android:versionName=*'l.0">

<applicationandroid:icon=*'@drawable/icon"android:label=,'@str

ing/app_namen>

<activityandroid:name=n.MainActivity”

android:label="@string/app_name">

<intent-filter>

<actionandroid:name=,'android,intent.action.MAIN"/>

<eatpgoryandroid:r)amp=uandroid.intant.eatpgory.T.AUN

CHER1'/>

</intent-filter>

</activity>

〈serviceandroid:name=,'MyRemoteService,,>

<intent-filter>

<actionandroid:name=Hcom.amaker.ch07.app.action.MY_

REMOTE_SERVICEH/>

</intent-filter>

</service>

</application〉

<uses-sdkandroid:minSdkVersion=n3"/>

</manifest>

1.9.系统办事

运行在systemserver进程中的办事比力多,这是整个android框架的底T

1)Native办事

SurfaceFlinger:这是framebuffer合成的办事,将各个应用步伐及应用步伐中的逻辑窗口图

像数据(surface)合成到一个物理窗口中显示(framebuffer)的办事步伐

2)Java办事:

这部门的办事大部门都有一个供给用进程使用的manager类,这就是一个RPC调用,

用户通过调用xxxManager的要领,实际上被Binder给迁移到syslem_server进程中对应的

xxxManagcrScrvicc中对应的要领,并将结果再通过binder带回。

。EntropyService

端办事,周期性的加载和生存随机信息。主要是limix开机后,/dev/random的状态可能

是可预知的,这样一些需要随机信息的应用步伐就可能会有问题。这个无需提供给用步伐接

口。

令PowerManagerService->PowerManager

Android的电源治理也是很重要的一部门。好比在待机的时候关掉不消的设备,待机时

屏幕和键盘背光的封闭,用户操纵的时候该打开几多设鉴等等

令ActivityManagerService->ActivityManager

这个是整个Androidframework框架中最为核心的一个办事,治理整个框架中任务、进

程治理,Intent解析等的核心实现。虽然名为Activity的ManagerService,但它统领的范畴,

不但是Activity,另有其他三大组件,和它们所在的进程。也就是说用户应用步伐的生命治

理,都是由他卖力的。

令TelephonyRegistry->TelephonyManager

电话注册、治理办事模块,可以获取电话的链接状态、信号强度等等。〈可以删掉,但

要看的大概明白》

◊PackageManagerServicc->PackageManager

包罗对软件包的解包,验证,安装以及升级等等,对付我们现在不能安装.so文件的问

题,应该先从这块着手阐发原因。

令ContentService->ContenfResolver

内容办事,主要是数据库等提供解决要领的办事。

◊BatteryService

监控电池充电及状态的办事,当状态改变时,会广播Intent

◊HardwareService

一般是ring和vibrate的办事步伐

令SensorService->SensorManager

治理Sensor设备的办事,卖力注册client设备及当client需要使用sensor时激活Sensor

令VVindowManagerService->WindowManager->PhoneVVindowManager

ActivityManagcrScnncc高度粘合窗口治理,这里最核心的就是输入事件的分发和治理

◊AlarmManagerService->AlarmManager

闹钟办事步伐

令BluetoothService->BluetoothDevice

蓝牙的背景治理和办事步伐

令StatusBarService->StatusBarManager

卖力statusBar上图标的更新、动画等等的办事,办事不大。

令Clipboardservice->ClipboardManagcr

和其他系统的clipBoard办事类似,提供复制黏贴功过。

令InputMcthodManagcrServicc->InputMethodManager

输入法的治理办事步伐,包罗何时使能输入法,切换输入法等等。

<NetStatService

手机网络办事

令Connectivityservice->ConnectivityManager

网络连接状态办事,可供其他应用查询,当网络状态变革时,也可广播改变。

令AccessibilityManagerService->Accessibility-Manager

这块可能要仔细看一下,主要是一些View得到点击、核心、文字改变等事件的分发治

理,对整个系统的调试、问题定位等,也需要最这个办事仔细过目一下。

令NotificationManagerService->NotificationManager

卖力治理和通知背景事件的产生等,这个和statusbar胶黏在一起,一般会在statusbar

上添加响应图标。用户可以通过这知道系统背景产生了什么事情。

令MountServicc

磁盘加载办事步伐,一般要和一个linuxdaemon步伐如vold/mountd等互助起作用,主

要卖力监听并广播device的mount/unmount/badremoval等等事件。

令DeviceStorageMonitorService

监控磁盘空间的办事,当磁盘空间不敷10%的时候会给用户警告

令LocationManagerService->LocationManager

要参加GPS办事等,这部门要细看,现在应用中的navigation没响应,可以今后处着

手看一下

令SearchManagerService->SearchManager

ThesearchmanagerservicehandlesthesearchUI,andmaintainsaregistryofsearchable

activities.

◊CheckinService(FallbackCheckinService)

貌似checkinservice是google提供的包,没有源代码,源码只有fallbackCheckinSenice

令VVallpaperManagerService->WallpaperManager

治理桌面配景的办事,深度定制化桌面系统,需要看懂并扩展v同时要兼容》这部门

令AudioService->AudioManager

AudioFlinger的上层治理封装,主要是音量、音效、声道及铃声等的治理

。HeadsetObserver

耳机插拔事件的监控小循环

令DockObserver

如果系统有个座子,当手机装上或拔出这个座子的话,就得靠他来治理了

令BackupManagerService->BackupManager

备份办事

QAppWidgctScr>icc->AppWidgctManagcr

Android可以让用户写的步伐以widget的方法放在臭面,这就是这套治理和办事的接口

◊StatusBarPolicy

治理哪个图标该在statusbar上显示的计谋。

2.消息广播机制

2.1.消息广播概述:

在Android里面有种种百般的广播,广播机制最大的特点就是发送方并不体贴吸收方

是否接到数据,也不体贴吸收方是如那边置惩罚数据的,好比电池的使用状态,电话的吸收

和短信的吸收都市产生一个广播,应用步伐开发者也可以监听这些广播并做出步伐逻辑的处

置惩罚。下面我画一张大略的图来资助各人理解广播的运行机制。

广播接收者2广播接收者4

种种广播在Android系统中运行,当系统/应用步伐运行时便会向Android注册种种

广播,Android吸收到广播会便会判断哪种广播需要哪种事件,然后向差异需要事件的应

用步伐注册事件,差异的广播可能处置惩罚差异的事件也可能处置惩罚相同的广播事件,这

时就需要Android系统为我们做筛选。

案例阐发:

一个经典的电话黑名单,首先通过将黑名单号码生存在数据库里面.,当来电时,我们吸

收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处

置惩罚,好比挂掉电话、好比静音等等。。。

2.2.Demo阐发:

下面通过一个小DEMO来解说一下广播在Android中如何编写,在Demo中我们设

置了一个按钮为按钮设置点击监听通过点击发送广播,在背景中吸收到广播并打印LOG信

息。步调如下:

publicclassBroadcastActivityextendsActivity{

publicstaticfinalStringACTION_INTENT_TEST="com.terry.broadca

st.test',;

/**Calledwhentheactivityisfirstcreated.*/

(3Override

publicvoidonCreate(BundlesavedlnstanceState){

super.onCreate(savedlnstanceState);

setContentView(R.layout.main);

Buttonbtn=(Button)findViewByld(R.id.ButtonOl);

btn.setOnClickListener(newOnClickListener(){

©Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub

Intentintent=newIntent(ACTION_INTENT_rEST);

sendBroadcast(intent);

)

});

吸收器代码如下:

publicclassMyBroadcastextendsBroadcastReceiver{

publicmyBroadCast(){

Log.v(nBROADCAST_TAGn,“myBroadCast");

)

^Override

publicvoidonReceive(Contextcontext,Intentintent){

//TODOAuto-generatedmethodstub

Tcq.v("PRQADCAST_TAG”,nor)RACPiVPM);

在清单文件描述:

<receiverandroid:name="com.broadcast.MyBroadcast">

<intent-filter>

<actionandroid:name=H**>

</action>

</intent-filter>

</receiver>

2.3.注册方法:

A.静态注册

静态注册方法是在AndroidManifest.xml的application里面界说receiver并设置要吸收的

actiono静态注册方法的特点:不管改应用步伐是否处于运动状态,都市进行监听。

<receiverandroid:name="com.broadcast.MyBroadcast">

<intent-filter>

<actionandroid:name="com.terry.broadcast.test">

</action>

</intent-filter>

</receiver>

B.动态注册

•动态注册方法在activity里面调用函数来注册,和静态的内容差不多。一个形参是

receiver,另一个是IntentFilter,其中里面是要吸收的action。动态注册方法特点:在代码

中进行注册后,当应用步伐封闭后,就不再进行监听。

//指定广播目标Action

MyReceiverreceiver=newMyReceiver();

〃创建过滤器,并指定action,使之用于吸收同action的广播

IntentFilterfilter=newIntentFilter("");

〃注册广播吸收器

registerReceiver(receiver,filter);

•取消注册:

〃注销广播吸收器

unregisterReceiver(receiver);

2.4.广播尺度常量;

常量名称常量值意义

ACTION_BOOT_COMPLET系统启动

ED完成

ACTION_TIME_CHANGEDandr时间改变

ACITON_DATE_CHANGEDFI期改变

ACTION_TIMEZONE_CHAN

时区该表

GED

ACTION_BATTERY_LOW电量低

插入或拔

ACTION_MEDIA_EJECT出外部媒

体

按下媒体

ACTION_MEDIA_BUTTON

按钮

ACTION_PACKAGE_ADDED添加包

ACTION_PACKAGE_REMO

ON_PACKAGE_REMOVED删除包

VED

2.5.实例应用:闹钟案例

A.案例说明:

这个例子是用闹钟的制定与解除来穿插broadcastReceiver的知识,先看下应用步伐的

界面:

3:16:31am

设定闹钟设定闹神

自.无设定[移除闹神j

点击设定闹钟的按钮,弹出来一个设置时间的对话框,你选择时间之后会弹出一个Toast

报告你定的时间时几多,然后到时间之后弹出对话框提示时间到。先看图:

3:19:02am

设定闹静谀定闹钟

或京Nitm同为03:20

令闹钟响了!!

赶快起床吧也

B.案例所涉及的知识点:

•实现闹钟需要用到AlarmManager来实现,这个类实现系统警告办事,可以设定一个时

间来完成指定的事情,只要在步伐中设置了警报办事,就可以通过调用。nReceive。要领执

行你要做的事情,纵然是待机状态,也不会影响运行。可以通过Contexl.getSystemService。

要领来得到该办事,得到AkiiinMwgci工具代码

AlarmManageram=(AlarmManagcr)gctSystcmScrvicc(Contcxt.ALARMSERVICE);

•常量

Constants

intELAPSEDREALTIMEAlarmtimeinSystemClock.elapsedRealtimc。(timesi

intELAPSEDREALTIMEWAKEUPAlarmtimeinSystemClock.elaDsedRealiimeO(times

wakeupthedevicewhenitgoesoff.

longINTERVALDAY

longINTERVALFIFTEENMINUTESAvailableinexactrecurrenceintervalsrecogni;

Pcndinglntcni)

longINTERVALHALFDAY

longINTERVALHALFHOUR

longINTERVALHOUR

intRTCAlarmtimeinSystem.currentTimeMinisO(wallclock

intRTCWAKEUPAlarmtimeinSysteincurrentTimeMillis。(wallclock

devicewhenitgoesoff.

AlarmManager.RTC,硬件闹钟,不叫醒手机(也可能是其它设备)休眠;当手机休眠时

不发射闹钟。

AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发就时叫醒手机休眠;

AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不叫醒手机休眠;当手机休

眠时不发射闹钟。

AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发痛时叫

醒手机休眠;

RTC闹钟和ELAPSED_REALTIME最大的差异就是前者可以通过修改手机时间触发闹钟

事件,后者要通过真实时间的流逝,纵然在休眠状态,时间也会被盘算。

•Intent与Pendingintent的区别及寄义

Intent是意图的意思,它是一个马上执行的工具,好比Activity跳转,执行

Intentintent=newIntent();

intent.setClass(Testl.this,Test2.class);

startActivity(intent);

那么Intent会马上从Testi跳转到Test2

Pendingintent中Pending意思为即将产生的,待定。也就是不确定什么时候会产生,可

能是未来的某个时间产生,Pendingintent可以看作是对Intent的包装。要得到一个

pendingintent工具,使用要领类的静态要领getActivity(Context,int,Intent,int)z

getBroadcast(Context,int,Intent,int),getService(Contextzint,Intent,int)分

别对应着Intent的3个行为,跳转到一个activity组件、打开一个广播组件和打开一个办

事组件。参数有4个,比力重要的事第三个和第一个,其次是第四个和第二个。可以看到,

要得到这个工具,必须传入一个【ntenl作为参数,必须有conlexl作为参数。

pendingintent是一种特殊的Intent(>主要的区别在于Intent的执行立刻的,而

pendingintent的执行不是立刻的。pendingintent执行的操纵实质上是参数传进来的

Intent的操纵,但是使用pendinglntent的目的在于它所包罗的Intent的操纵的执行是需

要满足某些条件的。

主要的使用的地方和例了,:通知Notificatio的发送,短消息SmsManager的发送和警报器

AlarmManagcr的执行等等。

可以理解为一中延迟的Intent,但是它一般会由别的步伐触发。

Intentintent=newIntent(thiszTest2.class);

ivity(thisz0,intent,0);

Pendinglntent可以封装Activity,BroadcastReceiver,Service.与Intent有区别的是

Pendinglntent可以脱离应用步伐而存在

3.Notification治理

3.1.主要作用:

•创建一个状态条图标,

•在扩展的状态条窗口中显示分外的信息(和启动一个Intent)。

•闪灯或LED。

・电话震动。

•发出听得见的警告声(铃声,生存的声音文件

温馨提示

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

评论

0/150

提交评论