不用WindowManger显示全局悬浮窗

作者: brycegao | 来源:发表于2018-08-19 09:41 被阅读386次

    Android7.1、Android8.0对WindowManager的限制越来越多, 想显示个SYSTEM_ALERT类型的window需要用户授权, 不同安卓版本可以使用TYPE_PHONE、TYPE_TOAST、TYPE_SYSTEM_OVERLAY类型, 但国内各厂商手机对悬浮窗可能单独做处理,运行时可能出现各种坑。

    权限问题详见https://blog.csdn.net/xiexiangyu92/article/details/78253663

    比如有个需求, 应用的各个界面都要显示个悬浮按钮, 点击后退出应用(效果类似于从今日头条打开京东商城,每个界面都有“返回头条”)。

    京东商城.jpg 原理.gif

    做法是在监听每个activity的生命周期,在onCreate函数执行后再添加一个子View, 从而并不破坏每个activity的逻辑;

    public class MyApplication extends Application {
      @Override public void onCreate() {
        super.onCreate();
        initLifyCycle();
      }
     
      private void initLifyCycle() {
        this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
          @Override public void onActivityCreated(final Activity activity, Bundle bundle) {
            View view = LayoutInflater.from(activity)
                .inflate(R.layout.layout_window_alert, null);
            FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.topMargin = 300;
            layoutParams.leftMargin = 0;
     
            view.setOnClickListener(new View.OnClickListener() {
              @Override public void onClick(View view) {
                Intent intent = new Intent(activity, MainActivity.class);
                intent.putExtra("fromBaidu", true);
                activity.startActivity(intent);
              }
            });
            ((FrameLayout) activity.getWindow().getDecorView()).addView(view, layoutParams);
         }
    }
    

    如果看Activity的setContentView函数, 其实就是在mDecor里添加View, 而mDecor继承于FrameLayout类。

    完整代码: https://github.com/brycegao/GlobalWindow

    相关文章

      网友评论

      本文标题:不用WindowManger显示全局悬浮窗

      本文链接:https://www.haomeiwen.com/subject/eqypmftx.html