Android自定义状态栏statusBar替换系统SystemUI
来源:互联网 发布:网络安全保密管理制度 编辑:程序博客网 时间:2024/06/14 03:22
文章主要参考http://blog.csdn.net/canney_chen/article/details/46042323#reply
公司的项目目标是自己开发一个状态栏,显示时间日期,蓝牙无线等状态
核心:statusBar是SystemUI的一部分,statusBar跟正常建立的Android app不同,它不能有主Activity,需要在服务中创建窗口画面。SystemUIService是SystemUI的入口处,是被系统启动,之后通过WindowsManager创建画面显示。
1、AndroidManifest.xml文件
package="com.android.systemui"
<uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />/*这个可能不需要*/<uses-permission android:name="android.permission.STATUS_BAR" /><uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />/* 创建TYPE_STATUS_BAR类型窗体,需要此权限*/
<service android:name="SystemUIService" android:exported="true" />
/*不能设置启动Activity*/
2、StatusIconView<!--<activity android:name=".MainActivity">--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.MAIN" />--> <!--<category android:name="android.intent.category.DEFAULT" />--> <!--<category android:name="android.intent.category.LAUNCHER" />--> <!--</intent-filter>--><!--</activity>-->
public class StatusIconView extends LinearLayout { //图标 private ImageView mIcon; public StatusIconView(Context context) { super(context); } public StatusIconView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public StatusIconView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.status_icon_view, this); mIcon = (ImageView) findViewById(R.id.icon); } public final void setIcon(int resId) { mIcon.setImageResource(resId); } public final ImageView getIconView(){ return mIcon; }}
需要的xml文件status_icon_view
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="@dimen/status_bar_icon_height" /> <!--<TextView--> <!--android:id="@+id/title"--> <!--android:layout_width="@dimen/status_bar_icon_width"--> <!--android:layout_height="@dimen/status_bar_icon_height" />--></LinearLayout>
3、SystemUIService
public class SystemUIService extends Service { private WindowManager wm = null; private WindowManager.LayoutParams statusBarParams = new WindowManager.LayoutParams(); private LinearLayout statusBarLayout=null; private StatusBarViewHolder statusBarViewHolder = new StatusBarViewHolder(); @Override public void onCreate() { super.onCreate(); createStatusView(); registerReceiver(); } @Override public IBinder onBind(Intent intent) { return null; } /* 手机电池电量显示 */ BroadcastReceiver phoneBatteryReceiver = new BroadcastReceiver(){ public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){ int level = intent.getIntExtra("level", 0); int scale = intent.getIntExtra("scale", 100); int curPower = (level * 100 / scale); updateIcon(getBatteryImage(curPower), statusBarViewHolder.phoneBatteryIcon); } }; }; private void createStatusView(){ Context context = getApplicationContext(); statusBarLayout = new LinearLayout(context); //statusBarLayout.setGravity(Gravity.CENTER_VERTICAL); //statusBarLayout.setLayoutParams(new android.view.ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); wm=(WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE); ((LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.status_bar, statusBarLayout); findStatusBarViews(); wm.addView(statusBarLayout, getStatusViewParams()); } private WindowManager.LayoutParams getStatusViewParams(){ statusBarParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, (int) getResources().getDimension( R.dimen.status_bar_height), WindowManager.LayoutParams.TYPE_STATUS_BAR, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, PixelFormat.TRANSLUCENT); statusBarParams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; statusBarParams.gravity = Gravity.TOP; statusBarParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; statusBarParams.setTitle("StatusBar"); statusBarParams.packageName = this.getPackageName(); return statusBarParams; } private void findStatusBarViews() { statusBarViewHolder.datetimeTextView = (TextView) statusBarLayout.findViewById(R.id.datetime_textView); statusBarViewHolder.phoneUSBIcon = (StatusIconView)statusBarLayout.findViewById(R.id.usb_icon); statusBarViewHolder.phoneSDCardIcon = (StatusIconView)statusBarLayout.findViewById(R.id.sdcard_icon); statusBarViewHolder.phoneHotspotIcon = (StatusIconView)statusBarLayout.findViewById(R.id.hotspot_icon); statusBarViewHolder.phoneMobileIcon = (StatusIconView)statusBarLayout.findViewById(R.id.mobile_icon); statusBarViewHolder.phoneBluetoothIcon = (StatusIconView)statusBarLayout.findViewById(R.id.bluetooth_icon); statusBarViewHolder.phoneWifiIcon = (StatusIconView)statusBarLayout.findViewById(R.id.wifi_icon); statusBarViewHolder.phoneBatteryIcon = (StatusIconView)statusBarLayout.findViewById(R.id.battery_icon); statusBarViewHolder.phoneUSBIcon.setIcon(R.drawable.usb); statusBarViewHolder.phoneSDCardIcon.setIcon(R.drawable.sd); statusBarViewHolder.phoneBluetoothIcon.setIcon(R.drawable.btconnected); statusBarViewHolder.phoneWifiIcon.setIcon(R.drawable.wifi0); } private void updateIcon(int Icon, StatusIconView icon){ icon.setIcon(Icon); } private int getBatteryImage(int battery) { int resId; if(battery > 0 && battery <= 10){ resId = R.drawable.battery0; }else if(battery > 10 && battery <= 40){ resId = R.drawable.battery1; }else if(battery > 40 && battery <= 60){ resId = R.drawable.battery2; }else if(battery > 60 && battery <= 80){ resId = R.drawable.battery3; }else if(battery > 80 && battery <= 100){resId = R.drawable.battery4; }else{ resId = R.drawable.battery0; } return resId; }/** * 注册状态栏更新信息的广播 */ private void registerReceiver() { registerReceiver(phoneBatteryReceiver , new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); } /** * 状态栏的所有图标 */ private class StatusBarViewHolder{ TextView datetimeTextView; StatusIconView phoneUSBIcon; StatusIconView phoneSDCardIcon; StatusIconView phoneHotspotIcon; StatusIconView phoneMobileIcon; StatusIconView phoneBluetoothIcon; StatusIconView phoneWifiIcon; StatusIconView phoneBatteryIcon; } @Override public void onDestroy(){ unregisterReceiver(); wm.removeView(statusBarLayout); super.onDestroy(); } private void unregisterReceiver(){ unregisterReceiver(phoneBatteryReceiver); } public String GetSysTime() { long sysTime = System.currentTimeMillis(); String time = ""; boolean is24Hour = DateFormat.is24HourFormat(getApplicationContext()); /** @brief Get the same time as the system. */ if(is24Hour) { time = (String) DateFormat.format("yyyy-MM-dd HH:mm:ss", sysTime); } else{ time = (String) DateFormat.format("yyyy-MM-dd hh:mm:ss", sysTime); } return time; }
需要的xml文件status_bar
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="@dimen/status_bar_height"> <TextView android:id="@+id/datetime_textView" android:layout_width="0dp" android:layout_weight="1" android:layout_height="@dimen/status_bar_date_height" android:textColor="@android:color/holo_red_dark" android:layout_gravity="center"/> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:gravity="right" android:layout_height="@dimen/status_bar_icon_width"> <com.android.systemui.StatusIconView android:id="@+id/usb_icon" android:layout_width="wrap_content" android:layout_height="@dimen/status_bar_icon_height" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/sdcard_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/hotspot_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/mobile_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/bluetooth_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/wifi_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <com.android.systemui.StatusIconView android:id="@+id/battery_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout> <!--<TextView--> <!--android:id="@+id/ssidInfo"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="400dp"--> <!--android:lines="10"--> <!--android:textColor="@android:color/holo_red_dark"/>--></LinearLayout>
注意:以上工程一定要替换系统的SystemUI源码,编译后烧写内核才可以
阅读全文
0 0
- Android自定义状态栏statusBar替换系统SystemUI
- Android 设置系统SystemUI 顶部StatusBar状态栏透明一体化
- android 修改系统状态栏(StatusBar)
- [ Android SystemUi ] 动态修改系统状态栏颜色【沉浸式状态栏】
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- android 状态栏(StatusBar)
- Android 5.0 状态栏(SystemUI)系统图标加载流程简单分析
- android4.0 SystemUi系统状态栏
- Android系统应用---SystemUI之二:Statusbar显示流程以及系统状态图标更新分析
- 如何修改状态栏Statusbar(SystemUI)图标和字体颜色
- Android5.1禁止状态栏下拉(SystemUI StatusBar)
- 给定一个字符串只含有数字,判定这个字符串能表达的所有IP地址
- [队内测试Day10.18]递推+tarjan+最小表示法+脑洞
- SpringMVC异常:org.springframework.web.multipart.MultipartException: The current request is not a multi
- shiro的使用(三)
- 690. Employee Importance
- Android自定义状态栏statusBar替换系统SystemUI
- KVM在工作站中的应用解决方案
- HUD 4745 Two Rabbits (区间DP)
- JVM读书笔记之对象的生存或死亡
- Class.forName()用法详解
- Android Apk加壳技术实战详解
- Git入门
- linux 基础8
- (学习笔记)摄像机模型与标定——三个坐标系及其之间关系