android 弹出全局弹窗及app退到后台关闭逻辑

329 阅读1分钟

全局弹窗+权限申请管理类

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);
    }
});