沉浸式通知栏Android44以上才支持的新特性。43不支持。具体实现方式如下:1新建个公共style,设置android:fitsSystemWindows=true<!-- 设置应用布局时是否考虑系统窗口布局;true --> <style name="AppBaseTheme" parent="android:ThemeLightNoTitleBar"> <item name="android:fitsSystemWindows">true</item> </style> 2 修改AndroidManifestxml,让所有的activity样式默认设置为AppBaseTheme(不同项目要灵活处理,咱这个项目的activity样式都是统一的所以这样设置没问题,但是实际情况下不同的activity可能调用的样式不一样,需要自行按自己的项目来设置)<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppBaseTheme" android:name="">3新增沉浸式通知栏实现类,实现原理很简单。 1)判断当前系统版本是不是44以上,判断代码如下: if (VERSIONSDK_INT >= VERSION_CODESKITKAT) 2)如果大于44则设置状态栏透明化,代码如下: windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS,WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); 3)获取activity的根rootView(DecorView),然后创建一个新的view stateBarView并把它添加到rootView(这里手动给它设置个ID,下次进来时先判断rootView是否已创建stateBarView,如果已创建则直接获取该View这样可以防止重复创建,导致内存泄露)以下是具体代码实现:import androidannotationSuppressLint;import androidappActivity;import androidcontentresResources;import androidgraphicsdrawableDrawable;import androidosBuild;import androidviewGravity;import androidviewView;import androidviewViewGroup;import androidviewWindow;import androidviewWindowManager;import androidwidgetFrameLayoutLayoutParams;/ 沉浸式通知栏公共类 @author hurrican /@SuppressLint({ "InlinedApi", "ResourceAsColor" })public class ImmersedNotificationBar { private Activity activity ; //设置沉浸式通知栏的ID(防止重复创建) private final static int IMMERSED_NOTIFICATION_BAR_ID = 12345678 ; private final static String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height" ; public ImmersedNotificationBar(Activity activity){ thisactivity = activity ; } //获取状态栏高度 private int getStatusBarHeight(Resources res){ int statusBarHeight = 0; int resourceId = resgetIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android"); if (resourceId > 0) { statusBarHeight = resgetDimensionPixelSize(resourceId); } return statusBarHeight ; } //添加顶部状态栏 private View addStateBar(Activity activity,ViewGroup rootView,int statusBarHeight){ //创建新的View,并添加到rootView顶部) View statusBarView ; if(null!=rootViewfindViewById(IMMERSED_NOTIFICATION_BAR_ID)){ statusBarView = rootViewfindViewById(IMMERSED_NOTIFICATION_BAR_ID); }else{ statusBarView = new View(activity); rootViewaddView(statusBarView); } statusBarViewsetId(IMMERSED_NOTIFICATION_BAR_ID) ; LayoutParams params = new LayoutParams(LayoutParamsMATCH_PARENT,statusBarHeight); paramsgravity = GravityTOP; statusBarViewsetLayoutParams(params); statusBarViewsetVisibility(ViewVISIBLE); return statusBarView ; } / 设置状态栏颜色 @param ColorId / public void setStateBarColor(int ColorId){ if (BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT) { Window window = activitygetWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) windowgetDecorView(); //透明化状态栏 windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS, WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); Resources res = activitygetResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarViewsetBackgroundColor(ColorId) ; } } / 设置状态栏颜色 @param ColorId / public void setStateBarDrawable(Drawable drawable){ if (BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT) { Window window = activitygetWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) windowgetDecorView(); //透明化状态栏 windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS, WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); Resources res = activitygetResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarViewsetBackgroundDrawable(drawable) ; } }}
有个指令可以获取通知栏的消息adb shell dumpsys notification 你可以打印出来看看 然后解析就行了
还要记录打开某个软件的时间和关闭某个软件的时间
这个很难实现 打开可以使用不停的查询栈顶的activity来获取 但是关闭 这个东西不确定 因为进程结束 没法准确的判断 非要获取的话 也不停的去查询该进程是否还在运行
不知道有其他好方法没,如果权限够高的话,应该会有某些比较便捷的api支持。
以上就是关于如何实现Android沉浸式状态栏全部的内容,包括:如何实现Android沉浸式状态栏、android怎么得到通知栏的消息内容,然后保存消息。也就是获取来了的一条通知,它是哪个程序的以及、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)