android 创建系统窗口

在项目研发过程中,有个需求需要创建一个全局的window窗口,于是挠头了,这怎么做呢?于是网上各种搜索,都是在Activity中去创建,单独的app,不能做全局的,经过研究最终在SystemUI中进行创建,下面我们来看具体的实现,我采用的是7.0系统;


SystemUI中的源码详细分析就不在这多讲了,我们直接入手去创建window

创建系统权限:


<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


在创建window时创建一个view用来附属在window上,创建布局;

system_window_view.xml


< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/system_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e0000000">
</LinearLayout>


布局创建成功,我们来看如和实现;

首先来看phoneStatusbar.java,它重写了BaseStatusBar.java中的createAndAddwindow();

@Override
public void createAndAddWindows() {
    addStatusBarWindow();
}
private void addStatusBarWindow() {
    makeStatusBarView();
    mStatusBarWindowManager = new StatusBarWindowManager(mContext);
……
}
我们就直接在makeStatusBarVew中去创建;

protected PhoneStatusBarView makeStatusBarView() {
    final Context context = mContext;
    updateDisplaySize(); // populates mDisplayMetrics
    updateResources();
    //创建 view
    infateView(context);
……
    }
infateView中内部实现;

//init 
private void infateSystemView(Context context) {
    mWindowView =(LinearLayout) View.inflate(context,R.layout.system_window_view,null);

}


view初始加载成功了,下面我们来看window的创建,在phoneStatusbar中有个start()方法,这就是用来window初始窗口和创建;

@Override
public void start() {
   …………
    super.start(); // calls createAndAddWindows()
   ………….
        addWindow();//create window.
 
    }


这不很重要,是具体实现窗口创建,通过windowManager来添加view;

private void addSystemWindow() {
//add view
    mWindowManager.addView(mWindowView,getLayoutParams());
}


这里根据自己window的大小等级来设置;

public LayoutParams getLayoutParams() {
    WindowManager.LayoutParams p = new WindowManager.LayoutParams(
            LayoutParams.MATCH_PARENT,,LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    p.gravity = Gravity.TOP|Gravity.LEFT;
    p.x = 0; //Equivalent to margin settings
    p.y = 0;
    return p;
}

全局窗口的创建成功了;




版权声明:本文为xiao_yuanjl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。