教你实现“Android 应用显示在其他应用上层”

在Android开发中,有时我们希望我们的应用能够在其他应用的上层显示,比如悬浮窗。实现这一功能的关键是使用系统窗口类型 TYPE_APPLICATION_OVERLAY。这篇文章将详细讲解如何实现这一功能,包括所需的步骤、代码示例以及核心概念的解释。

实现步骤

下面是实现“Android 应用显示在其他应用上层”的主要步骤:

步骤 描述
1 在AndroidManifest.xml中添加权限
2 创建一个Service来显示悬浮窗
3 在Service中创建和设置WindowManager
4 设计悬浮窗的布局
5 显示悬浮窗
6 处理悬浮窗的交互事件
7 停止悬浮窗及服务

每一步详细讲解

第一步:添加权限

在应用的 AndroidManifest.xml 文件中,需要声明使用系统窗口的权限。代码如下:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

解释SYSTEM_ALERT_WINDOW 权限允许应用在其他应用上层显示窗口。

第二步:创建Service

创建一个服务(Service),用于显示悬浮窗。可以创建一个新的Java类,命名为 FloatingWindowService.java

public class FloatingWindowService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        // 更多初始化代码
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null; // 不绑定
    }
}

解释Service 是后台运行的组件,onCreate 方法用于初始化服务。

第三步:创建WindowManager

在服务中,我们需要使用 WindowManager 创建窗口。继续在 FloatingWindowService.java 文件中添加如下代码:

@Override
public void onCreate() {
    super.onCreate();
    
    // 获取WindowManager
    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    // 创建悬浮窗的布局参数
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    
    // 设置悬浮窗位置
    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = 100;
    
    // 更多代码...
}

解释:此代码获取 WindowManager 对象,创建悬浮窗的布局参数,并设置悬浮窗的位置。

第四步:设计悬浮窗布局

创建一个布局文件,例如 floating_window.xml,可以放在 res/layout 文件夹中:

<RelativeLayout xmlns:android="
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher_foreground"/>
</RelativeLayout>

解释:这里我们简单创建了一个 RelativeLayout,其中包含一个 ImageView 显示图标。

第五步:显示悬浮窗

onCreate 方法中,添加以下代码以显示悬浮窗:

@Override
public void onCreate() {
    super.onCreate();
    
    // 创建WindowManager并显示悬浮窗
    View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
    windowManager.addView(floatingView, params);
}

解释:此段代码通过 LayoutInflater 加载布局,并将其添加到 WindowManager

第六步:处理悬浮窗的交互事件

为了让悬浮窗能够响应点击事件,可以在 onCreate 中添加如下代码:

ImageView imageView = floatingView.findViewById(R.id.imageView);
imageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 处理点击事件
    }
});

解释:添加一个点击事件的监听器,可以在点击悬浮窗时处理相应逻辑。

第七步:停止悬浮窗及服务

当用户关闭应用时,需要停止服务并移除悬浮窗:

@Override
public void onDestroy() {
    super.onDestroy();
    if (floatingView != null) windowManager.removeView(floatingView);
}

解释:重写 onDestroy 方法以清理资源,确保悬浮窗在服务结束时被移除。

流程图

通过以下流程图可以更好地理解整个实现过程:

journey
    title Android 悬浮窗实现过程
    section 添加权限
      在AndroidManifest.xml中添加权限: 5:  整体的权限
    section 创建Service
      创建 FloatingWindowService.java: 2:0
    section 创建WindowManager
      获取WindowManager并设置参数: 4:0
    section 设计悬浮窗布局
      创建浮动布局文件: 3:0
    section 显示悬浮窗
      在Service中显示悬浮窗: 5:0
    section 处理事件
      添加点击事件处理: 4:0
    section 清理资源
      停止悬浮窗及服务: 2:0

总结

实现“Android 应用显示在其他应用上层”的功能并不复杂,关键在于理解每一个步骤背后的逻辑。要确保您在 AndroidManifest.xml 中添加适当的权限,并通过一个服務来管理悬浮窗的创建与生命周期。希望本篇文章能帮助您顺利实现这一功能,并在未来的开发中获得更好的体验。如果您有更多疑问或者问题,欢迎继续提问!