سؤال

لقد جربت غوغلينغ ولا توجد إجابة مباشرة و/أو واضحة.

ال موقع المطورتعريف غير واضح أيضًا:

الواجهة التي تستخدمها التطبيقات للتحدث إلى مدير النافذة. يستخدم Context.getSystemService(Context.WINDOW_SERVICE) للحصول على واحدة من هؤلاء.

هل يمكن لأي شخص لديه اللغة الإنجليزية السادسة البسيطة أن يشرح ما هو؟

وكيف يمكنني استخدامه لإنشاء كائن عائم يبقى عبر العديد من الأنشطة ، على الرغم من أنني انتقلت من واحد إلى آخر؟

هل كانت مفيدة؟

المحلول

Android WindowManager هي خدمة نظام ، وهي مسؤولة عن إدارة قائمة Windows التي تم طلبها ، والتي تكون Windows مرئية ، وكيف يتم وضعها على الشاشة. من بين أشياء أخرى ، يقوم تلقائيًا بإجراء انتقالات النوافذ والرسوم المتحركة عند فتح أو إغلاق تطبيق أو تدوير الشاشة.

يحتوي كل نشاط على نافذة تستخدم لعرض محتواه على الشاشة. عندما تقوم باستدعاء SetContentView على نشاط ما ، فإنه يرفق عرض النافذة الافتراضية للنشاط. تملأ النافذة الافتراضية الشاشة ، بحيث تخفي نافذة نشاطك أي أنشطة أخرى - سيعرض رجل WindowManager أي نافذة موجودة في الأعلى. لذلك عادة لا تحتاج إلى القلق بشأن Windows - يمكنك فقط إنشاء نشاط وسيقوم Android بباقي لك.

لكنك تحتاج إلى التفاعل مع WindowManager إذا كنت ترغب في القيام بشيء غير عادي مثل إنشاء نوافذ عائمة لا تملأ الشاشة. إذا كنت ترغب في إنشاء نافذة عائمة مرئية أمام التطبيقات الأخرى ، فلا يمكنك استخدام نشاط لأن نشاطك سيتوقف عندما يأتي تطبيق آخر إلى المقدمة ، وسيتم إخفاء نافذته أو تدميره. بدلاً من ذلك ، تحتاج إلى عرض نافذة من خدمة خلفية. فمثلا:

WindowManager.LayoutParams p = new WindowManager.LayoutParams(
    // Shrink the window to wrap the content rather than filling the screen 
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    // Display it on top of other application windows, but only for the current user
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // Don't let it grab the input focus
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    // Make the underlying application window visible through any transparent parts
    PixelFormat.TRANSLUCENT);

// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;

WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);

لكي يعمل هذا ، ستحتاج إلى إضافة الإذن التالي إلى AndroidManifest.xml

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

نصائح أخرى

لإصدار Android API> 23 ، android.permission.SYSTEM_ALERT_WINDOW تحتاج إلى طلب وقت التشغيل. علاوة على ذلك، TYPE_SYSTEM_ERROR ويتم إهمال بعض الأنواع في Android API 26. هنا هو الطريق

public void showWindowManager() {
    if (requestPermission()) {
        return;
    }

    WindowManager.LayoutParams p =
            new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    Build.VERSION.SDK_INT > Build.VERSION_CODES.O
                            ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                            : WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);


    final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater layoutInflater =
            (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
    windowManager.addView(popupView, p);

    // dismiss windowManager after 3s
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            windowManager.removeView(popupView);
        }
    }, 3000);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            showWindowManager();
        }
    }
}

public boolean requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            return true;
        }
    }
    return false;
}

ينظم Window Manager الشاشة ويعالج ما يجب أن يذهب إلى أين وكيف يجب أن يتم طبقتهم.

فيما يلي مثال مفتوح المصدر اللطيف لكائن عائم.مثال كائن عائم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top