不用WindowManger显示全局悬浮窗

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

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

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

    做法是在监听每个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

扫描二维码关注公众号,回复: 2853091 查看本文章

猜你喜欢

转载自blog.csdn.net/brycegao321/article/details/81812346