全局弹窗+权限申请管理类
public class FloatingWindowManager {
private Context context;
private WindowManager windowManager;
private View floatingView;
private boolean isShowing = false;
/**
* 被隐藏的类型
* -1,默认,
* 0,是在被退到后台时隐藏。
* 1,是点击进入播放器时隐藏。
*/
public int hiddenType = -1;
public FloatingWindowManager(Context context) {
this.context = context;
this.windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public void showFloatingWindow(View.OnClickListener listener) {
if(!checkOverlayPermission(context)){
// 没权限直接返回避免异常
return;
}
// 创建悬浮窗口
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
//设置 x 轴的偏移量
params.x = 0;
//设置 y 轴的偏移量
params.y = Utils.dp2px(150);
//如果悬浮窗图片为透明图片,需要设置该参数为 PixelFormat.RGBA_8888
// params.format = PixelFormat.RGBA_8888;
//设置悬浮窗的宽度
params.width = Utils.dp2px(50);
//设置悬浮窗的高度
params.height = Utils.dp2px(40);
//设置悬浮窗的显示位置
params.gravity = Gravity.RIGHT;
LayoutInflater inflater = LayoutInflater.from(context);
floatingView = inflater.inflate(R.layout.airplay_alert, null);
// floatingView.setBackgroundColor(Color.RED);
floatingView.setOnClickListener(listener);
// 设置悬浮窗口中的View的交互操作
// 这里可以添加点击事件等
// 将悬浮窗口的View添加到WindowManager
windowManager.addView(floatingView, params);
isShowing = true;
}
public void hideFloatingWindow(int hiddenType) {
if (!isShowing) {
return;
}
this.hiddenType=hiddenType;
// 移除悬浮窗口的View
if (windowManager != null && floatingView != null) {
windowManager.removeView(floatingView);
isShowing = false;
}
}
/**
* 检查权限
* @param context
* @return
*/
public static boolean checkOverlayPermission(Context context) {
return Settings.canDrawOverlays(context);
}
/**
* 申请权限
* @param context
* @return
*/
public static void requestOverlayPermission(Context context) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
public Handler handler = new Handler();
public Runnable runnable = new Runnable() {
@Override
public void run() {
hideFloatingWindow(0);
}
};
}
全局监听,在程序act退出时关闭弹窗
其中延迟300毫秒是防止生命周期切换时弹窗闪动。
registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activityList.add(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
FloatingWindowManager manager=InitFlutterBoostHelper.INSTANCE.getManager();
manager.handler.removeCallbacks(manager.runnable);
if(manager.hiddenType==0){
InitFlutterBoostHelper.INSTANCE.toShow(activity);
}
}
@Override
public void onActivityPaused(Activity activity) {
FloatingWindowManager manager=InitFlutterBoostHelper.INSTANCE.getManager();
manager.handler.postDelayed(manager.runnable,300);
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
activityList.remove(activity);
}
});