Android में WindowManager क्या है?




android-windowmanager (3)

मैंने इसे देखने की कोशिश की और कोई प्रत्यक्ष और / या स्पष्ट उत्तर नहीं है।

डेवलपर वेबसाइट की परिभाषा स्पष्ट नहीं है:

वह इंटरफ़ेस जो एप्लिकेशन विंडो प्रबंधक से बात करने के लिए उपयोग करता है। इनमें से किसी एक को प्राप्त करने के लिए Context.getSystemService(Context.WINDOW_SERVICE) का उपयोग करें।

क्या कोई सादा 6 वीं कक्षा वाला अंग्रेजी समझा सकता है कि वह क्या है?

और मैं इसे एक अस्थायी वस्तु बनाने के लिए कैसे उपयोग कर सकता हूं जो कई सक्रियताओं के माध्यम से बनी हुई है, भले ही मैं एक से दूसरे में स्थानांतरित हो गया?


Android WindowManager एक सिस्टम सेवा है, जो खिड़कियों की z- ऑर्डर की गई सूची को प्रबंधित करने के लिए जिम्मेदार है, जो विंडो दिखाई देती हैं, और उन्हें स्क्रीन पर कैसे सेट किया जाता है। अन्य बातों के अलावा, यह ऐप को खोलने या बंद करने या स्क्रीन को घुमाने पर स्वचालित रूप से खिड़की के बदलाव और एनिमेशन करता है।

प्रत्येक गतिविधि में एक विंडो होती है जिसका उपयोग स्क्रीन पर इसकी सामग्री को प्रदर्शित करने के लिए किया जाता है। जब आप किसी गतिविधि पर setContentView को कॉल करते हैं, तो यह उस दृश्य को गतिविधि की डिफ़ॉल्ट विंडो से जोड़ देता है। डिफ़ॉल्ट विंडो स्क्रीन भरती है, जिससे आपकी गतिविधि की विंडो किसी अन्य गतिविधियों को छिपाती है - WindowManager प्रदर्शित करेगा जो भी खिड़की शीर्ष पर है। तो आम तौर पर आपको खिड़कियों के बारे में चिंता करने की ज़रूरत नहीं है - आप सिर्फ एक गतिविधि बनाते हैं और एंड्रॉइड आपके लिए बाकी काम करेगा।

लेकिन आपको 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 एपीआई संस्करण> 23 के लिए, android.permission.SYSTEM_ALERT_WINDOW को रनटाइम के लिए अनुरोध करना होगा। इसके अलावा, TYPE_SYSTEM_ERROR और कुछ प्रकारों को android api 26 में TYPE_SYSTEM_ERROR गया है। यहाँ तरीका है

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;
}

विंडो मैनेजर स्क्रीन को व्यवस्थित करता है और प्रक्रिया करता है कि कहां जाना चाहिए और कैसे उन्हें स्तरित किया जाना चाहिए।

यहाँ एक अस्थायी स्रोत का एक अच्छा खुला स्रोत उदाहरण है। फ्लोटिंग ऑब्जेक्ट उदाहरण







android-windowmanager