Android如何实现悬浮窗全系统版本

  介绍

小编给大家分享一下安卓如何实现悬浮窗全系统版本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

悬浮窗是在系统上显示的内容,好像微信视频聊天时的小窗口一样,在退出软件后依然存在的一个窗口,本博客以窗口中放一个按钮组件为例,简单展示悬浮窗,其中包括了对Android 6.0以下,Android 6.0到Android 8.0, Android 8.0以上版本的处理,下面开始介绍实现方法:

<强> 1,MainActivity中的代码

public  Button  mFloatingButton;   ,   ,@Override   ,protected  void  onCreate (Bundle  savedInstanceState), {   super.onCreate才能(savedInstanceState);   ,,setContentView (R.layout.activity_main);   ,//才能初始化视图   initView才能();   ,}   ,//初始化视图   ,private  void  initView (), {   mFloatingButton才能=(按钮),findViewById (R.id.floating_btn);   mFloatingButton.setOnClickListener才能(这个);   ,}   ,   ,public  void  startFloatingButtonService (View 视图),{   Log.e才能(“测试流程,,,“测试流程“);   if 才能;(FloatingService_Button.isStarted), {   ,,Log.e(“测试流程2“,,“测试流程2“);   ,才能回报;   ,,}   if 才能;(Build.VERSION.SDK_INT 祝辞=,Build.VERSION_CODES.M),{//判断系统版本   ,,if  (! Settings.canDrawOverlays(这),{   ,,,Toast.makeText(,,“当前无权限,请授权“,,Toast.LENGTH_SHORT);   ,,,Log.e(“测试流程3“,,“测试流程3“);   ,,,startActivityForResult (new 意图(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(“包:“,+,getPackageName ())),, 0);   ,,},{else    ,,,Log.e(“测试流程4“,,“测试流程4“);   ,,,startService (new 意图(MainActivity.this, FloatingService_Button.class));   ,,}   ,,},{else    ,,startService (new 意图(MainActivity.this, FloatingService_Button.class));   ,,}   ,   ,}   ,   ,@Override   ,protected  void  onActivityResult (int  requestCode, int  resultCode,, Intent 数据),{   if 才能;(requestCode ==, 0), {   ,,if  (! Settings.canDrawOverlays(这),{   ,,,Log.e(“测试流程5“,,“测试流程5“);   ,,,Toast.makeText(,,“授权失败“,,Toast.LENGTH_SHORT),告诉();   ,,},{else    ,,,Log.e(“测试流程6“,,“测试流程6“);   ,,,Toast.makeText(,,“授权成功,,,Toast.LENGTH_SHORT),告诉();   ,,,startService (new 意图(MainActivity.this, FloatingService_Button.class));   ,,}   ,,}   ,}   ,   ,@Override   ,public  void  onClick (View  v), {   switch 才能;(v.getId ()) {   ,,case  R.id.floating_btn :   ,,,startFloatingButtonService (v);   ,,,休息;   ,,}   以前,}

思路简单解释:点击弹出悬浮窗按钮时,获取版本并判断”Build.VERSION。SDK_INT祝辞=Build.VERSION_CODES.M”如果系统版本在6.0以下这不需要请求权限,如果系统版本在6.0以上需要进行权限检测以及请求,获取权限后,弹出悬浮框

<强> 2,activity_main。xml代码

& lt; ? xml  version=?.0“,编码=皍tf-8" ?比;   & lt; LinearLayout  xmlns: android=癶ttp://schemas.android.com/apk/res/android"   ,xmlns:工具=癶ttp://schemas.android.com/tools"   ,android: layout_width=癿atch_parent"   ,android: layout_height=癿atch_parent"   ,android:取向=皏ertical"   ,工具:上下文=癱om.example.jack_lin.suspendwindow.MainActivity"祝辞   ,   & lt;按钮   android:才能id=癅 + id/floating_btn"   ,,   android才能:文本=癅string/floating_btn",/比;   ,   ,   & lt;/LinearLayout>

简单解释:xml中没什么特别东西,线性布局中放一个按钮

<强> 3,FloatingService_Button的代码

public  static  boolean  isStarted =,假;   ,   ,private  WindowManager  windowManager;   ,private  WindowManager.LayoutParams  layoutParams;   ,   ,private  Button 按钮;   ,   ,@Override   ,public  void  onCreate (), {   super.onCreate才能();   Log.e才能(“进入服务1“,,“进入服务1“);   isStarted =,才能正确;   windowManager 才能=,(WindowManager), getSystemService (WINDOW_SERVICE);   时间=layoutParams 才能;new  WindowManager.LayoutParams ();   if 才能;(Build.VERSION.SDK_INT 祝辞=,Build.VERSION_CODES.O), {   ,,layoutParams.type =, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;   ,,},{else    ,,layoutParams.type =, WindowManager.LayoutParams.TYPE_PHONE;   ,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Android如何实现悬浮窗全系统版本