系统进程和非系统进程获取窗口的区别,及安卓开发常用创建窗口的方法

2024-07-19  本文已影响0人  wenSome

在 Android 系统中,系统进程和非系统进程在获取窗口(Window)方面有一些重要的区别。下面是它们的主要区别及实现方式:

系统进程与非系统进程获取窗口的区别

1、权限控制:

系统进程:系统进程拥有较高的权限,可以直接创建和管理系统级别的窗口。例如,系统的状态栏、通知栏等都是由系统进程控制的。
非系统进程:普通应用进程没有系统级别的权限,通常只能创建应用级别的窗口。为了在系统中创建覆盖其他应用的窗口,非系统进程必须获取 SYSTEM_ALERT_WINDOW 权限,这个权限需要用户在设置中显式授权。

2、窗口类型:

系统进程:可以创建系统类型的窗口,如 TYPE_SYSTEM_ALERT 或 TYPE_SYSTEM_OVERLAY,这些窗口能覆盖其他应用,甚至覆盖在锁屏界面上。
非系统进程:通常只能创建应用级别的窗口,如 TYPE_APPLICATION_OVERLAY(从 Android 8.0 开始)或者 TYPE_PHONE(较旧的类型,适用于通话界面)。这些窗口可以覆盖在其他应用窗口之上,但需要特殊权限,并且有一定的限制。

3、实现方式:

系统进程:通常在系统层面通过 WindowManagerService 直接创建和管理窗口,不需要用户的权限授权。
非系统进程:通过 WindowManager 服务创建窗口,需要用户授权相应的权限(如 SYSTEM_ALERT_WINDOW),并且在实现时需要考虑应用的安全性和用户体验。

安卓开发者常用的创建窗口的方法

1、使用 WindowManager:

创建窗口:通过 WindowManager 可以创建窗口,窗口的类型(如 TYPE_APPLICATION_OVERLAY)决定了窗口的行为和权限要求。
示例代码:

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT
);
View view = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);
windowManager.addView(view, params);

2、通过 Service 创建窗口:

步骤:
在 Service 中使用 WindowManager 创建窗口。
需要在 AndroidManifest.xml 中声明 SYSTEM_ALERT_WINDOW 权限。
在应用设置中请求用户授权 SYSTEM_ALERT_WINDOW 权限。

示例代码:

public class OverlayService extends Service {
    private WindowManager windowManager;
    private View overlayView;

    @Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        overlayView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        );

        windowManager.addView(overlayView, params);
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

总结
系统进程可以创建系统级别的窗口,并且无需额外权限,但控制范围较大。
非系统进程创建窗口需要额外的权限,并且通常只能创建应用级别的窗口。
创建窗口的方法包括使用 WindowManager 和在 Service 中进行窗口管理。

上一篇 下一篇

猜你喜欢

热点阅读