不用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