要将自定义图标添加到Android设备的系统区域(而不是通知栏),您可以使用System Overlay功能。以下是一个基本的示例代码,演示如何实现这一点:
首先,在AndroidManifest.xml文件中添加以下权限:
然后,创建一个Service类来处理系统覆盖。在这个类中,我们将创建一个透明的覆盖视图,并将其添加到系统区域:
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class OverlayService extends Service {
private WindowManager windowManager;
private View overlayView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 创建覆盖视图
overlayView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);
// 设置覆盖视图的样式和位置
WindowManager.LayoutParams layoutParams;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
} else {
layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
}
layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
layoutParams.x = 0;
layoutParams.y = 0;
// 添加覆盖视图到系统区域
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(overlayView, layoutParams);
}
@Override
public void onDestroy() {
super.onDestroy();
// 移除覆盖视图
if (overlayView != null && windowManager != null) {
windowManager.removeView(overlayView);
}
}
}
在上面的代码中,我们使用LayoutInflater从layout文件中创建一个名为overlay_layout的视图。您可以根据自己的需要自定义此视图。
最后,在您的Activity或其他地方启动Service:
startService(new Intent(this, OverlayService.class));
请注意,从Android 10(API级别29)开始,需要特殊的权限来使用SYSTEM_ALERT_WINDOW,即使在清单文件中声明了该权限。您需要在应用的设置中手动启用此权限。