21

का पता लगाने के लिए कैसे मैं सोच रहा हूं कि यह बटन किस विधि को कॉल करता है।"हालिया ऐप्स" सिस्टम बटन क्लिक (हनीकॉम +)

enter image description here

मेरे खेल हमेशा रुक जाता है/जब मैं इस बटन का उपयोग करें, अपने लगता है इस बटन को एक Activity की onPause() और onResume() तरीकों फोन नहीं करता है की तरह के अलावा सही ढंग से शुरू। यह काम करता है अगर मैं खेल से बाहर निकलता हूं, तो दूसरी विंडो (चित्र पर एक की तरह) पर जाएं और फिर इस बटन को फिर से शुरू करने के लिए उपयोग करें। लेकिन अगर मैं इस बटन को दबाता हूं, जब इंजेम होता है, तो गेम रुक जाता है लेकिन थ्रेड डोजेंट फिर से शुरू होता है जैसे कि यह हर बार होता है, गेम की तरह अभी भी स्क्रीन पर खड़ा होता है और थोड़ा सा झटका लगता है।

समझाने में कठोर लेकिन मुझे उम्मीद है कि मैं स्पष्ट हूं, अगर नहीं, पूछो!

+1

यह बटन के कार्यान्वयन के साथ कोई संबंध नहीं है। यह खेल में इसके कार्यान्वयन में एक गलती है। – DroidBender

+0

लेकिन यह काम करता है क्योंकि जब मैं '' घर '-बटन' के माध्यम से खेल से बाहर निकलता हूं और फिर इसे 'विंडोज़-ओपन' -बटन 'के माध्यम से फिर से दर्ज करता हूं। एकमात्र समय यह काम नहीं करता है जब मैं खेल में रहते हुए 'विंडोज़-ओपन' -बटन 'दबाता हूं, फिर खेल के लिए विंडो को तुरंत दबाएं। इसलिए इसे सामान्य रूप से कैसे कहा जाता है, इसकी तुलना में 'ऑन पॉज़()' और 'ऑनर्यूम()' के तरीके में कुछ प्रकार का अंतर होना चाहिए। –

उत्तर

21

कोई भी मानक Activity Lifecycle विधियों को तब नहीं कहा जाता है जब "हालिया ऐप्स" बटन दबाया जाता है। हालिया ऐप्स पॉपअप की सूची के बाद गतिविधि सक्रिय रहेगी। इस सूची के अर्ध-पारदर्शी बाएं हिस्से के माध्यम से आप यह भी देख सकते हैं कि एप्लिकेशन एनीमेशन अभी भी चल रहा है, अगर आप कुछ एनीमेशन के साथ गेम चला रहे हैं जो इस स्थिति को सही तरीके से संभाल नहीं पाता है। दरअसल, Google Play में कई खेलों ने इस स्थिति को ठीक से संभाल नहीं लिया, यहां तक ​​कि गुस्से में पक्षियों की तरह अच्छे भी।

जब उपयोगकर्ता "हालिया ऐप्स" सूची (या उससे रिटर्न) खोलता है तो केवल गतिविधि विधि को बुलाया जा रहा है onWindowFocusChanged बूलियन पैरामीटर hasFocus के साथ। जब hasFocus के साथ hasFocus के साथ बुलाए गए हालिया ऐप विधि onWindowFocusChanged() उपयोगकर्ता की खुली सूची hasFocustrue के बराबर होती है, तो उपयोगकर्ता इस सूची में वापस दबाने पर समान होता है।

+0

धन्यवाद, इसे थोड़ा सा साफ़ करें :) मशीन के साथ काम करने के लिए हमेशा अच्छा लगा। –

+1

ऐसा लगता है कि एंड्रॉइड 4.4.4 पर, हालिया ऐप्स बटन दबाए जाने पर ऑन पॉज़/ऑनस्टॉप को कॉल किया जाता है। – amram99

+1

लेकिन ऑनविंडो फोकस चेंज भी गलत होगा यदि आप ऐप के भीतर एक और गतिविधि खोलते हैं, इसलिए यह जानना आवश्यक नहीं है कि "हालिया ऐप्स" बटन मारा गया था (अब अवलोकन बटन भी कहा जाता है)। – Bourne

0

क्या यह इस विशिष्ट गेम के साथ ही समस्या है? या यह आपके द्वारा खेले जाने वाले हर गेम के साथ है?

onPause() और onResume() के अलावा, onStop() नामक एक और चक्र है। शायद यहां कुछ मौलिक चीजें हैं जो यहां की जा रही हैं। उस "विंडोज़-ओपन" -बटन के प्रेस के साथ, गेम शायद onStop -स्टेट में नहीं जायेगा जबकि "होम" दबाएगा-बटन।

+0

अच्छा बिंदु, कुछ तरीकों को टैग करने का प्रयास करेगा और देखें कि क्या होता है। –

0

कोशिश इस एक:

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    Log.d("Focus debug", "Focus changed !"); 

    if (!hasFocus) { 
     Log.d("Focus debug", "Lost focus !"); 

    } 
} 
3

मैं इसी तरह की समस्या का सामना करना पड़ा है, तो, मुझे पता करने के लिए आवश्यक है जब उपयोगकर्ता प्रेस हाल ही के एप्लिकेशन बटन (एंड्रॉयड के पुराने संस्करणों में मेनू कुंजी बटन)। कई घंटों के शोध के बाद मुझे घर बटन या मेनू बटन दबाए जाने पर पकड़ने के लिए कोई घटना नहीं मिली। मैंने पाया यह onStop() कॉल करने के लिए एक लंबा समय लग जब उपयोगकर्ता प्रेस होम बटन, तो मैं एक चाल समझ इन टो और अधिभावी दो तरीकों प्रतिक्रिया के समय पर संबंधित बटन के बीच अंतर करना है कि:

@Override

public void onUserLeaveHint() { 
    // do stuff 
    super.onUserLeaveHint(); 
    userLeaveTime = System.currentTimeMillis() ; 
    isNotPower = true; 
} 

@Override

public void onStop() { 
    super.onStop(); 
    if (isNotPower) { 
     defStop = System.currentTimeMillis() - userLeaveTime; 
     if (defStop > 200) { 
      //home button 
     } 
     if (defStop < 200) { 
      //recent apps button 
     } 
    } 
    isNotPower = false; 
} 
  • isNotPower पैरामीटर जाँच करने के लिए है कि नहीं पावर बटन pressed- है जब पावर बटन() विधि कहा जाता है लेकिन ओ th नहीं दबाया onStop है कि nUserLeaveHint()।
2

यह पता लगाने के लिए कि 'हालिया ऐप्स' बटन दबाए जाने पर आप एक्सेसिबिलिटी सेवा का उपयोग कर सकते हैं।आपको अपनी एक्सेसिबिलिटी सेवा चलाने और "TYPE_WINDOW_STATE_CHANGED" प्रकार के साथ ईवेंट प्राप्त करने की आवश्यकता होगी और ईवेंट का क्लास नाम जांचें।

  1. एंड्रॉइड डेवलपर में Accessibility Service पढ़ें। अपनी खुद की सुलभता सेवा सेट अप करें, उपयोगकर्ता से अनुमति मांगें।
  2. अपने उपयोग सेवा है ओवरराइड विधि onAccessibilityEvent()
  3. इस प्रक्रिया में AccessibilityEvent event वस्तु प्राप्त होगी में, यह वस्तु एक घटना है कि सिर्फ अपने डिवाइस पर हुआ है के बारे में सभी आवश्यक जानकारी शामिल है।
  4. हम कक्षा नाम में रूचि रखते हैं। क्लासनाम कभी-कभी शून्य हो सकता है इसलिए भूलना न भूलें! = शून्य जांचें। "Com.android: -:

    • Android 4.1: 4.4" com.android.internal.policy.impl.RecentApplicationsDialog "
    • Android 4.2 हाल ही के एप्लिकेशन विंडो Android के वर्ज़न पर निर्भर करती है की पैकेज का नाम .systemui.recent.RecentsActivity "
    • Android 5.0 - 7.1:" com.android.systemui.recents.RecentsActivity "(" एस "पत्र में जोड़ा गया था)

वर्ग के नाम पता नहीं है पुराने उपकरणों के लिए लेकिन मैं किसी को 2017 में उनका रखरखाव नहीं लगता कि;)

तो तुम कुछ इस तरह होगा: एलजी, नेक्सस, सोनी और आभासी:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.getClassName() == null) 
     return; 

    String className = String.valueOf(event.getClassName()); 

    if (className.equals("com.android.internal.policy.impl.RecentApplicationsDialog") 
      || className.equals("com.android.systemui.recent.RecentsActivity") 
      || className.equals("com.android.systemui.recents.RecentsActivity")){ 
     //Recent button was pressed. Do something. 
    } 
} 

मैं निम्नलिखित वास्तविक उपकरणों पर यह परीक्षण किया है डिवाइस: मोटोरोला, सैमसंग।

अगर कोई इन कक्षा के नामों के लिए अपवाद जानता है तो कृपया मुझे पिंग करें।

1

सबसे अच्छा तरीका है मैं मिल गया है कहा जाता है कार्रवाई प्रसारण करने के लिए listent कि "ACTION_CLOSE_SYSTEM_DIALOGS" .From गूगल डॉक्स:

प्रसारण क्रिया: इस प्रसारण जब कोई उपयोगकर्ता कार्रवाई एक अस्थायी प्रणाली संवाद निरस्त करने का अनुरोध करना चाहिए है। अस्थायी प्रणाली संवाद के कुछ उदाहरण अधिसूचना विंडो-छाया और हालिया कार्य संवाद हैं।

कार्य कोड:

IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
        //do what you want here 
      } 
     } 
    }; 
    this.registerReceiver(broadcastReceiver, intentFilterACSD); 
1

मैं एक ही समस्या है, मैं below.er घर के लिए

रजिस्टर बटन पर क्लिक प्रसारण और RecentApp

InnerReceiver mReceiver = new InnerReceiver(); 
IntentFilter mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
registerReceiver(mReceiver, mFilter); 

के रूप में इस समस्या का समाधान अब ब्रॉडकास्ट रिसीवर कोड

class InnerReceiver extends BroadcastReceiver { 
    final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
    final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
      String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
      if (reason != null) { 
       if (mListener != null) { 
        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
         // Home Button click 
        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
         // RecentApp or Overview Button click 
        } 
       } 
      } 
     } 
    } 
} 

लेकिन न unregisterReceiver करना भूल गया BroadcastReceiver

+1

मैंने प्रतिक्रिया मूल निवासी https://github.com/evanjmg/react-native-home-pressed/blob/master/android/src/main/java/com/evanjmg/HomeWatcher के लिए एंड्रॉइड में पूर्ण कार्यान्वयन किया है। जावा – evanjmg

संबंधित मुद्दे