android 8.0 悬浮窗 最简demo
MainActivity.java文件
package com.example.performance; import android.app.Activity; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= 23) { if (Settings.canDrawOverlays(MainActivity.this)) { // Intent intent = new Intent(MainActivity.this, FloatingService.class); Toast.makeText(MainActivity.this,"已开启Toucher",Toast.LENGTH_SHORT).show(); // startService(intent); // finish(); } else { //若没有权限,提示获取. Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); Toast.makeText(MainActivity.this,"需要取得权限以使用悬浮窗",Toast.LENGTH_SHORT).show(); startActivity(intent); } } else { //SDK在23以下,不用管. // Intent intent = new Intent(MainActivity.this, FloatingService.class); // startService(intent); // finish(); } setContentView(R.layout.activity_main); Button startFloatWindow=(Button) findViewById(R.id.btn_floatWindows); startFloatWindow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this, FloatingService.class); startService(intent); finish(); } }); super.onCreate(savedInstanceState); } }
FloatingService.java 文件
package com.example.performance; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.graphics.Color; import android.graphics.PixelFormat; import android.os.Build; import android.os.IBinder; import android.provider.Settings; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; @SuppressLint({ "ShowToast", "ClickableViewAccessibility" }) public class FloatingService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { showFloatingWindow(); return super.onStartCommand(intent, flags, startId); } private void showFloatingWindow() { if (Settings.canDrawOverlays(this)) { // 获取WindowManager服务 final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 新建悬浮窗控件 final Button button = new Button(getApplicationContext()); button.setText("Floating Window"); button.setBackgroundColor(Color.BLUE); // 设置LayoutParam final WindowManager.LayoutParams 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_APPLICATION_OVERLAY; } layoutParams.format = PixelFormat.RGBA_8888; layoutParams.width = 500; layoutParams.height = 100; layoutParams.x = 100; layoutParams.y = 300; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; // 将悬浮窗控件添加到WindowManager windowManager.addView(button, layoutParams); button.setOnTouchListener(new View.OnTouchListener(){ private int x; private int y; @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x = (int) event.getRawX(); y = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int nowX = (int) event.getRawX(); int nowY = (int) event.getRawY(); int movedX = nowX - x; int movedY = nowY - y; x = nowX; y = nowY; layoutParams.x = layoutParams.x + movedX; layoutParams.y = layoutParams.y + movedY; // 更新悬浮窗控件布局 windowManager.updateViewLayout(view, layoutParams); break; default: break; } return false; } }); } } }
activity_main.xml 文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.performance" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/> <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="26" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".FloatingService"/> </application> </manifest>
AndroidManifest.xml 文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.performance" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/> <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="26" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".FloatingService"/> </application> </manifest>