Android FrameWork Service 之 StatusBarService(1)

本文详细描述了Android中的StatusBarService如何管理和显示状态栏图标,包括对电池状态、电话信号、数据连接、Wi-Fi、蓝牙、GPS、闹钟、同步状态和音量控制的处理,以及通过intentfilter监听系统事件以实时更新状态。
摘要由CSDN通过智能技术生成

mClockIcon = service.addIcon(mClockData, null);

updateClock();

// battery

mBatteryData = IconData.makeIcon(“battery”,

null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0);

mBatteryIcon = service.addIcon(mBatteryData, null);

// phone_signal

mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

mPhoneData = IconData.makeIcon(“phone_signal”,

null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);

mPhoneIcon = service.addIcon(mPhoneData, null);

// register for phone state notifications.

((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))

.listen(mPhoneStateListener,

PhoneStateListener.LISTEN_SERVICE_STATE

| PhoneStateListener.LISTEN_SIGNAL_STRENGTH

| PhoneStateListener.LISTEN_CALL_STATE

| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE

| PhoneStateListener.LISTEN_DATA_ACTIVITY);

// data_connection

mDataData = IconData.makeIcon(“data_connection”,

null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0);

mDataIcon = service.addIcon(mDataData, null);

service.setIconVisibility(mDataIcon, false);

// wifi

mWifiData = IconData.makeIcon(“wifi”, null, sWifiSignalImages[0], 0, 0);

mWifiIcon = service.addIcon(mWifiData, null);

service.setIconVisibility(mWifiIcon, false);

// wifi will get updated by the sticky intents

// bluetooth status

mBluetoothData = IconData.makeIcon(“bluetooth”,

null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);

mBluetoothIcon = service.addIcon(mBluetoothData, null);

updateBluetooth(null);

// Gps status

mGpsEnabledIconData = IconData.makeIcon(“gps”,

null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0);

mGpsFixIconData = IconData.makeIcon(“gps”,

null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0);

mGpsIcon = service.addIcon(mGpsEnabledIconData, null);

service.setIconVisibility(mGpsIcon, false);

// Alarm clock

mAlarmClockIconData = IconData.makeIcon(

“alarm_clock”,

null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0);

mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null);

service.setIconVisibility(mAlarmClockIcon, false);

// Sync state

mSyncActiveIcon = service.addIcon(IconData.makeIcon(“sync_active”,

null, R.drawable.stat_notify_sync_anim0, 0, 0), null);

mSyncFailingIcon = service.addIcon(IconData.makeIcon(“sync_failing”,

null, R.drawable.stat_notify_sync_error, 0, 0), null);

service.setIconVisibility(mSyncActiveIcon, false);

service.setIconVisibility(mSyncFailingIcon, false);

// volume

mVolumeData = IconData.makeIcon(“volume”,

null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0);

mVolumeIcon = service.addIcon(mVolumeData, null);

service.setIconVisibility(mVolumeIcon, false);

IntentFilter filter = new IntentFilter();

// Register for Intent broadcasts for…

filter.addAction(Intent.ACTION_TIME_TICK);

filter.addAction(Intent.ACTION_TIME_CHANGED);

filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);

filter.addAction(Intent.ACTION_BATTERY_CHANGED);

filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);

filter.addAction(Intent.ACTION_ALARM_CHANGED);

filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);

filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);

filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);

filter.addAction(BluetoothIntent.ENABLED_ACTION);

filter.addAction(BluetoothIntent.DISABLED_ACTION);

filter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);

filter.addAction(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);

filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);

filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

filter.addAction(WifiManager.RSSI_CHANGED_ACTION);

filter.addAction(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION);

filter.addAction(GpsLocationProvider.GPS_FIX_CHANGE_ACTION);

filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);

mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);

}

二.    StatusBarService

正如上面看到的,StatusBarPolicy只是一个策略管理,实际的功能是StatusBarService来实现的。StatusBarService初始化时初始化了一个用于显示statusbar 的StatusBarView。StatusBarView里面定义了icon名字,的显示顺序,对应的png图等。代码如下:

  1. public StatusBarService(Context context) {

mContext = context;

mDisplay = ((WindowManager)context.getSystemService(

Context.WINDOW_SERVICE)).getDefaultDisplay();

makeStatusBarView(context);

mUninstallReceiver = new UninstallReceiver();

}

private void makeStatusBarView(Context context) {

Resources res = context.getResources();

mRightIconSlots = res.getStringArray(com.android.internal.R.array.status_bar_icon_order);

mRightIcons = new StatusBarIcon[mRightIconSlots.length];

ExpandedView expanded = (ExpandedView)View.inflate(context,

com.android.internal.R.layout.status_bar_expanded, null);

expanded.mService = this;

StatusBarView sb = (StatusBarView)View.inflate(context,

com.android.internal.R.layout.status_bar, null);

sb.mService = this;

……

}

mRightIconSlots 是一个String型数组,里面记录了状态栏上各个图标的名字。StatusBarPolicy就是根据这个名字找到相应的icon,调用setIcon设置其图标。mRightIconSlots的值从\frameworks\base\core\res\res\values\arrays.xml 中获得,现摘取片段如下:

clock

alarm_clock

battery

phone_signal

data_connection

volume

mute

speakerphone

wifi

bluetooth

gps

sync_active

sync_failing

ime

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

img-Am5qudZG-1714259082274)]

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值