Android原生模块DeskClock分析1文档格式.docx
- 文档编号:8136947
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:41
- 大小:130.30KB
Android原生模块DeskClock分析1文档格式.docx
《Android原生模块DeskClock分析1文档格式.docx》由会员分享,可在线阅读,更多相关《Android原生模块DeskClock分析1文档格式.docx(41页珍藏版)》请在冰点文库上搜索。
长按变暗:
UI~判断dimed的true/false~按nightmodeButton~接受黑屏事件并定义View,将数据显示在黑屏上~刷新数据~刷新闹钟~创建View来显示时钟数据并重新定义位置。
黑屏移动:
另起线程~当改变位置时~调用moveScreenSaver~确定位置~定义长宽.
Digital:
另起线程,更新数据~更新~改变格式
退出屏保:
onDetachedFromWindow~DigitalClock~onFinishInflate~AmPm~setDateFormat~get24HourMode~setShowAmPm~onAttachedToWindow,过滤~另起线程~更新数据
v常量:
ACTION_DATE_CHANGED
广播行动:
时间已经改变了
ACTION_BATTERY_CHANGED
系统定义,包括充电状态,普通状态
ACTION_MIDNIGHT
夜间模式(黑屏)
BATTERY_STATUS_UNKNOWN
位置位置
QUERY_WEATHER_DATA_MSG
查询天气信息
UPDATE_WEATHER_DISPLAY_MSG
更新天气显示信息
QUERY_WEATHER_DELAY
查询天气是否显示
SCREEN_SAVER_TIMEOUT_MSG
超时屏保信息
SCREEN_SAVER_MOVE_MSG
屏保移动信息
FLAG_SHOW_WHEN_LOCKED
锁屏显示
FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
亮屏允许锁定
FLAG_TURN_SCREEN_ON
亮屏
FLAG_KEEP_SCREEN_ON
保持亮屏
SCREEN_SAVER_COLOR_DIM
暗屏
ACTION_GENIE_REFRESH
WEATHER_CONTENT_AUTHORITY
当局天气内容
WEATHER_CONTENT_PATH
天气路径
BATTERY_STATUS_CHARGING
电池充电状态
BATTERY_STATUS_FULL
电池慢点状态
NEXT_ALARM_FORMATTED
格式化下一个闹铃
INVISIBLE
不可见的(视图)
FLAG_FULLSCREEN
满屏,隐藏所有装饰
BRIGHTNESS_OVERRIDE_OFF
关闭覆盖亮度
BRIGHTNESS_OVERRIDE_NONE
无覆盖亮度
ACTION_EXIT_DESK_MODE
桌面模式
ALARM_SERVICE
闹铃服务
CATEGORY_DESK_DOCK
桌面底座种类
EXTERNAL_CONTENT_URI
外部内容的URI
FLAG_ACTIVITY_CLEAR_TOP
清除顶部活动
FLAG_ACTIVITY_NEW_TASK
新建活动栈
INTENT_ACTION_MUSIC_PLAYER
跳转music
ACTION_MAIN
跳转home
DOCK_SETTINGS_ACTION
设置底座
二.Alarms界面
Ø
要解决哪些问题:
✧闹钟涉及到有关类和方法
✧怎样闹铃
✧闹铃之后的操作
闹钟涉及到有关类和方法
⏹BroadcastReceiver
⏹PendingIntent
⏹AlarmManager
⏹ContentObserver
⏹Parcelable
⏹LayoutLayout
⏹存储和获取数据的机制——preference
⏹ContentResolver
⏹newView和bindView的作用
⏹Notification与Toast的区别以及Notification的使用
⏹如何将应用程序的数据暴露出去
⏹如何在Activity之间共享数据
vBroadcastReceiver
BroadcastReceiver是Android中用处巨大的异步消息机制。
它有轻量和跨进程的性质。
一个BroadcastReceiver对象的生命周期不超过5秒,不能绑定服务和做一些耗时的操作,但是用来收发信号和消息则绰绰有余。
BroadcastReceiver的几种用法:
1.把耗内存很多的操作(如:
下载或流量统计),注册在一个跨进程的Service里面,通过BroadcastReceiver与前台通信。
<
serviceandroid:
name="
NotiService"
android:
process="
:
remote"
/>
privatevoidsendBroad(){
Intentit=newIntent();
it.putExtra("
netTraffic"
getTotal());
it.setAction("
"
);
this.sendBroadcast(it);
}
vPendingIntent
PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情
PendingIntent和Intent的区别:
区别一:
Intent是及时启动,intent随所在的activity消失而消失。
PendingIntent可以看作是对intent的包装,通常通过getActivity,getBroadcast,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行pendingintent时,调用intent的。
之所以他有这样的特性,正由于pendingintent中保存有当前App的Context。
区别二:
Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据
Pendingintent,一般用在Notification上,可以理解为延迟执行的intent。
vAlarmManager
Alarmmanager主要管理硬件时钟。
一些与时间相关的应用,如日历,闹钟等需要使用AlarmManager的服务。
Alarmmanager功能相对比较简单,相关代码位于
AlarmManageram=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
这部分代码直接管理硬件时钟,设备名为/dev/alarm。
包括打开设备,关闭设备,设置时区,设置触发时间(timeout),以及等待时钟触
frameworks/base/services/java/com/android/server/AlarmManagerService.java
这部分封装目录一中的代码,向上提供java接口,同时与客户端(如calendar)交互,接收来自客户端的时钟设置请求,并在时钟触发时通知客户端。
vContentObserver
ContentObserver有点类似于BroadcastReceiver,当某类事件发生时进行调用.ContentObserver一般和系统或第三方程序提供的Provider一起使用.
当为某个URI注册了ContentObserver后,对其进行操作后都会调用注册的回调函数
mContext.getContentResolver().registerContentObserver(
Settings.System.CONTENT_URI,true,mFormatChangeObserver);
当Settings.System.CONTENT_URI有改变的时候就触发
publicvoidonChange(booleanselfChange){
setDateFormat();
updateTime();
}
vParcelable
Parcelable的作用:
在activity之间传递对象的时候,通过Parcelable来传递
Preference提供了一种轻量级的存取机制,主要是可以通过关键字读取和存储某个Preferencevalue
ContentResolver
ContentResolver是通过URI来查询ContentProvider中提供的数据。
ContentResolvercr=getContentResolver();
ContentResolver的主要方法
finaluri
insert(Uriurl,ContentValuesvalues)InsertsarowintoatableatthegivenURL.
finalint
delete(Uriurl,Stringwhere,String[]selectionArgs)Deletesrow(s)specifiedbyacontentURI.
finalCursor
query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)QuerythegivenURI,returningaCursorovertheresultset.
update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)Updaterow(s)inacontentURI.
vnewView和bindView的作用
publicvoidbindView(Viewview,Contextcontext,Cursorcursor),重用一个已有的view,使其显示当前cursor所指向的数据。
publicViewnewView(Contextcontext,Cursorcursor,ViewGroupparent),为cursor所指向的数据新建一个View对象,并显示其数据。
举个例子:
比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。
这样就省了空间了。
vNotification与Toast都可以起到通知、提醒的作用。
但它们的实现原理和表现形式却完全不一样。
Toast其实相当于一个组件(Widget)。
有些类似于没有按钮的对话框。
而Notification是显示在屏幕上方状态栏中的信息。
还有就是Notification需要用NotificationManager来管理,而Toast只需要简单地创建Toast对象即可。
vAndroid提供了ContentProvider,一个程序可以通过实现一个Contentprovider的抽象接口将自己的数据完全暴露出去,而且Contentproviders是以类似数据库中表的方式将数据暴露。
Contentproviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可通过2种方法:
创建一个属于你自己的Contentprovider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型并且有写入Contentprovider的权限。
v如何通过一套标准及统一的接口获取其他应用程序暴露的数据?
Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
闹铃
◆闹铃功能
在系统中闹铃服务功能不仅仅对闹钟应用程序服务,最重要的是可以利用该闹铃服务功能提供的唤醒能力来做定时器。
这样即便应用程序没有运行或者是没有启动的情况下,只要其注册过闹铃,那么该闹铃到时间后,系统可以自动将该应用程序启动,这就是所谓的闹铃“唤醒“功能。
AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。
AlarmManager与AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。
voidcancel(PendingIntentoperation)
//取消已经注册的与参数匹配的闹铃
voidset(inttype,longtriggerAtTime,PendingIntentoperation)
//注册一个新的闹铃
voidsetRepeating(inttype,longtriggerAtTime,longinterval,PendingIntentoperation)
//注册一个重复类型的闹铃
voidsetTimeZone(StringtimeZone)
//设置时区
5种闹铃类型:
publicstaticfinalintELAPSED_REALTIME
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。
直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。
系统值是3(0x00000003)。
publicstaticfinalintELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2(0x00000002)。
publicstaticfinalintRTC
直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用System.currentTimeMillis()获得。
系统值是1(0x00000001)。
publicstaticfinalintRTC_WAKEUP
//能唤醒系统,用法同RTC类型,系统值为0(0x00000000)。
PublicstaticfinalintPOWER_OFF_WAKEUP
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。
使用方法同RTC类型,系统值为4(0x00000004)。
✧AlarmKlaxon通过继承Service,来实现功能,他在后台运行。
v闹铃模式:
Vibrator(震动)VIBRATOR_SERVICE,TelephonyManager(响铃)TELEPHONY_SERVICE
privatevoidplay(Alarmalarm){
//stop()checkstoseeifwearealreadyplaying.
stop();
if(Log.LOGV){
Log.v("
AlarmKlaxon.play()"
+alarm.id+"
alert"
+alarm.alert);
}
if(!
alarm.silent){Log.e("
AlarmKlaxon11"
Urialert=alarm.alert;
//Fallbackonthedefaultalarmifthedatabasedoesnothavean
//alarmstored.
if(alert==null){Log.e("
AlarmKlaxon12"
alert=RingtoneManager.getDefaultUri(
RingtoneManager.TYPE_ALARM);
if(Log.LOGV){Log.e("
AlarmKlaxon13"
Usingdefaultalarm:
"
+alert.toString());
//TODO:
ReusemMediaPlayerinsteadofcreatinganewoneand/oruse
//RingtoneManager.
mMediaPlayer=newMediaPlayer();
mMediaPlayer.setOnErrorListener(newOnErrorListener(){
publicbooleanonError(MediaPlayermp,intwhat,intextra){
Log.e("
Erroroccurredwhileplayingaudio."
mp.stop();
mp.release();
mMediaPlayer=null;
AlarmKlaxon14"
returntrue;
});
try{
//Checkifweareinacall.Ifweare,usethein-callalarm
//resourceatalowvolumetonotdisruptthecall.
if(mTelephonyManager.getCallState()
!
=TelephonyManager.CALL_STATE_IDLE){Log.e("
AlarmKlaxon15"
Usingthein-callalarm"
mMediaPlayer.setVolume(IN_CALL_VOLUME,IN_CALL_VOLUME);
setDataSourceFromResource(getResources(),mMediaPlayer,
R.raw.in_call_alarm);
}else{Log.e("
AlarmKlaxon16"
mMediaPlayer.setDataSource(this,alert);
startAlarm(mMediaPlayer);
}catch(Exceptionex){
Usingthefallbackringtone"
//Thealertmaybeonthesdcardwhichcouldbebusyright
//now.Usethefallbackringtone.
//Mustresetthemediaplayertocleartheerrorstate.
mMediaPlayer.reset();
R.raw.fallbackring);
}catch(Exceptionex2){
//Atthispointwejustdon'
tplayanything.
Failedtoplayfallbackringtone"
ex2);
/*Startthevibratoraftereverythingisokwiththemediaplayer*/
if(alarm.vibrate){Log.e("
AlarmKlaxon17"
mVibrator.vibrate(sVibratePattern,0);
AlarmKlaxon18"
mVibrator.cancel();
enableKiller(alarm);
mPlaying=true;
mStartTime=System.currentTimeMillis();
}
✧AlarmClock继承Activity实现OnItemClickListener接口
AlarmClock是一个Activity类,主要功能是将闹钟界面显示出来,并通过各种组件控件,实现人机交互功能,其中包括listView,adapter,menu,cursor等组件。
这里定义一个AlarmTimeAdapter继承CursorAdapter,用来显示闹钟列表的适
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 原生 模块 DeskClock 分析