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类。
网友评论