应用窗口化
1. 思路
1. 通过主题把整个应用窗口化
2. 通过WindowManager实现悬浮窗方式
2. 实现:
方式一:
<style name="Theme.DialogActivity" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@drawable/shape_act_dialog</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="5dp" />
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhu.demotest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DialogActivity">
<activity android:name=".MainActivity"
android:theme="@style/Theme.DialogActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
方式二:
package com.zhu.audiodemo;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import androidx.core.app.NotificationCompat;
import com.zhu.audiodemo.ui.FloatWindowManager;
public class UiGuardService extends Service {
private static final String TAG = "UiGuardService";
private final static int CHANNEL_ID = 100001;
private WindowManager mWindowManager = null;
private WindowManager.LayoutParams mLayoutParams = null;
private ViewGroup mViewGroup = null;
private View view = null;
private final static String ACTION_STOP = "action.com.zhu.stop_service";
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_STOP)) {
stopForeground(true);
stopSelf();
Log.d(TAG, "onReceive: stop service ");
}
}
};
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
view = new MainContentView(UiGuardService.this);
IntentFilter intentFilter = new IntentFilter(ACTION_STOP);
registerReceiver(mReceiver, intentFilter);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this, "123123")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("录屏")
.setContentText(getString(R.string.app_name) + "录屏中")
.build();
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel("123123", "通道说明", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
startForeground(CHANNEL_ID, notification);
showFloatRecordWindow();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
private void showFloatRecordWindow() {
FloatWindowManager.showPopupWindow(UiGuardService.this, view);
}
}
package com.zhu.audiodemo.ui;
import android.content.Context;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
public class FloatWindowManager {
private static final String TAG = "FloatWindowManager";
private static View mView = null;
private static WindowManager mWindowManager = null;
private static Context mContext = null;
public static Boolean isShown = false;
private final static String ACTION_STOP = "action.com.zhu.stop_service";
public static void showPopupWindow(final Context context, View view) {
if (isShown) {
return;
}
isShown = true;
mContext = context.getApplicationContext();
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mView = view;
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.format = PixelFormat.TRANSLUCENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.x = 30;
params.y = 30;
params.gravity = Gravity.START | Gravity.TOP;
mWindowManager.addView(mView, params);
}
public static void hidePopupWindow() {
if (isShown && null != mView) {
mWindowManager.removeView(mView);
isShown = false;
}
}
}
package com.zhu.audiodemo;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.audiofx.AcousticEchoCanceler;
import android.media.audiofx.AutomaticGainControl;
import android.media.audiofx.NoiseSuppressor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "AUDIO-TEST";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startFloatingService();
finish();
}
public void startFloatingService() {
Intent intent = new Intent(MainActivity.this, UiGuardService.class);
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT).show();
startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);
} else {
startService(new Intent(MainActivity.this, UiGuardService.class));
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhu.audiodemo">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AudioDemo">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".UiGuardService"/>
</application>
</manifest>