182 lines
6.4 KiB
Java
182 lines
6.4 KiB
Java
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;
|
||
}
|
||
|
||
} |