package com.qxcm.moduleutil.http; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Build; import android.os.IBinder; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import com.alibaba.android.arouter.launcher.ARouter; import com.qxcm.moduleutil.R; import com.qxcm.moduleutil.base.CommonAppContext; import com.qxcm.moduleutil.event.RoomOutEvent; import com.qxcm.moduleutil.utils.ARouteConstants; import com.qxcm.moduleutil.utils.ImageLoader; import com.qxcm.moduleutil.widget.GifAvatarOvalView; import org.greenrobot.eventbus.EventBus; public class FloatingWindowService extends Service { private WindowManager windowManager; private View floatingView; @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 加载悬浮窗布局 floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window_layout, null); // 设置 WindowManager.LayoutParams int layoutType; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { layoutType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { layoutType = WindowManager.LayoutParams.TYPE_PHONE; } WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, layoutType, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); layoutParams.gravity = Gravity.TOP | Gravity.START; layoutParams.x = 100; layoutParams.y = 100; // 添加悬浮窗到窗口 windowManager.addView(floatingView, layoutParams); // 关闭按钮点击事件 // ImageView closeButton = floatingView.findViewById(R.id.iv_guanbi); // closeButton.setOnClickListener(v -> stopSelf()); setupFloatingViewBehavior(); } private static final int NOTIFICATION_ID = 1; @SuppressLint("ForegroundService") @Override public int onStartCommand(Intent intent, int flags, int startId) { // 创建前台通知(必须) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String channelId = "floating_window_service"; NotificationChannel channel = new NotificationChannel( channelId, "悬浮窗服务", NotificationManager.IMPORTANCE_LOW ); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.createNotificationChannel(channel); Notification notification = new Notification.Builder(this, channelId) .setContentTitle("悬浮窗正在运行") .setSmallIcon(R.mipmap.default_avatar) // 替换为你自己的图标资源 .build(); startForeground(NOTIFICATION_ID, notification); } else { Notification notification = new Notification.Builder(this) .setContentTitle("悬浮窗正在运行") .setSmallIcon(R.mipmap.default_avatar) .build(); startForeground(NOTIFICATION_ID, notification); } return START_STICKY; } private void setupFloatingViewBehavior() { ImageView ivGuanbi = floatingView.findViewById(R.id.iv_guanbi); GifAvatarOvalView riv = floatingView.findViewById(R.id.riv); // 点击关闭按钮 ivGuanbi.setOnClickListener(v -> topAndReleaseResources()); // 动画任务 final Runnable mRivAnimationTask = () -> { Animation rivRotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim); riv.startAnimation(rivRotateAnimation); }; // 模拟播放状态(可替换为真实数据) boolean isPlaying = CommonAppContext.getInstance().isPlaying; if (isPlaying) { ImageLoader.loadHead(this, riv, CommonAppContext.getInstance().playCover); riv.postDelayed(mRivAnimationTask, 1000); floatingView.setVisibility(View.VISIBLE); } else { floatingView.setVisibility(View.GONE); } // 点击头像跳转房间详情 riv.setOnClickListener(v -> { String roomId = CommonAppContext.getInstance().playId; if (!TextUtils.isEmpty(roomId)) { ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("form", "首页").withString("roomId", CommonAppContext.getInstance().playId).navigation(); // Intent intent = new Intent(Intent.ACTION_VIEW); // intent.setPackage(getPackageName()); // intent.setData(Uri.parse("customscheme://roomdetails?form=首页&roomId=" + roomId)); // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // startActivity(intent); } }); } private void topAndReleaseResources() { // 停止动画 // if (riv != null) { //// riv.clearAnimation(); // } // 移除回调任务(如果有的话) if (floatingView != null) { // riv.removeCallbacks(mRivAnimationTask); } // 调用关闭逻辑(可调用 Presenter 或直接调用 SDK) // MvpPre.quitRoom(CommonAppContext.getInstance().playId); // 设置全局状态为 false CommonAppContext.getInstance().isPlaying = false; CommonAppContext.getInstance().isShow = false; EventBus.getDefault().post(new RoomOutEvent()); // 停止服务自身 stopSelf(); } @Override public void onDestroy() { if (floatingView != null) { windowManager.removeView(floatingView); } super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } }