微信或者知乎推送消息的时候总会出现下面的效果:
也许很多人会说这是一个NotifiCation,看起来确实是的,按照思路走下去,所有的信息都将我们指向了setFullScreenIntent这个方法,但是不幸的是方法的源码大家可能没有看到
大家可能运行的结果是直接打开了Intent而不是弹出通知框,对的,源码也是这么说的,系统UI只是可能会展示Head up通知但是并不是一定会显示的!
下面介绍下我的源码:
package com.view;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
/**
* 仿微信实现悬浮通知栏
*/
public class MainActivity extends AppCompatActivity {
private View view;
private WindowManager wm;
private boolean showWm =true;//默认是应该显示悬浮通知栏
private WindowManager.LayoutParams params;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWindowManager();
createFloatView("感谢各位老铁!");
}
private void initWindowManager(){
wm = (WindowManager) getApplicationContext().getSystemService(
Context.WINDOW_SERVICE);
params = new WindowManager.LayoutParams();
//注意是TYPE_SYSTEM_ERROR而不是TYPE_SYSTEM_ALERT
//前面有SYSTEM才可以遮挡状态栏,不然的话只能在状态栏下显示通知栏
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
params.format = PixelFormat.TRANSPARENT;
//设置必须触摸通知栏才可以关掉
params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
// 设置通知栏的长和宽
params.width = wm.getDefaultDisplay().getWidth();
params.height = 200;
params.gravity =Gravity.TOP;
}
private void createFloatView(String str) {
view = LayoutInflater.from(this).inflate(R.layout.wechat, null);
//在这里你可以解析你的自定义的布局成一个View
if (showWm){
wm.addView(view, params);
showWm = false;
}else {
wm.updateViewLayout(view,params);
}
view.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
wm.removeViewImmediate(view);
view = null;
break;
case MotionEvent.ACTION_MOVE:
break;
}
return true;
}
});
}
}
效果如下所示: