2011-04-05 12 views
17

मैं अपने एंड्रॉइड पर अपनी 'होम' स्क्रीन बनाना चाहता हूं, और मैं अपने आवेदन से उस होम स्क्रीन को कॉल करना चाहता हूं।क्या मैं अपने आवेदन में 'होम' बटन ओवरराइड कर सकता हूं?

मैं 'होम' बटन को ओवरराइड कैसे कर सकता हूं ताकि जब इसे दबाया जाए तो एप्लिकेशन को डिफ़ॉल्ट होम स्क्रीन की बजाय मेरी होम स्क्रीन पर रीडायरेक्ट कर दिया जाएगा? क्या घर बटन को ओवरराइड करना संभव है?

उत्तर

3

हाय फिर आप किसी भी अन्य बटन के रूप में होम बटन ओवरराइड कर सकते हैं:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_HOME)) { 
     Toast.makeText(this, "You pressed the home button!", Toast.LENGTH_LONG).show();      
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

बहुत धन्यवाद क्योंकि हम इस विषय पर बहुत चर्चा करते हैं .. इस प्रश्न को उस होम-स्क्रीन लॉन्चर क्यू के उसी समय पूछा जाता है ... और आपने मुझे समाधान दिया ... धन्यवाद ... – Smith

+0

आपका स्वागत है। – Aleadam

+44

यह एंड्रॉइड, AFAIK के किसी भी संस्करण पर काम नहीं करता है, और निश्चित रूप से हाल ही में कुछ भी नहीं। – CommonsWare

6

घर बटन एक चीज और केवल एक चीज और लगातार काम करना चाहिए। उपयोगकर्ता को होम स्क्रीन पर वापस प्राप्त करें। भले ही आप इसके व्यवहार को ओवरराइड कर सकें, यह एक बेहद उपयोगकर्ता-असभ्य काम होगा। तो ऐसा मत करो और अपनी समस्या को अलग-अलग हल करें!

+0

वास्तव में मैं लॉक करना चाहते हैं की जरूरत है वह स्क्रीन जब मेरी होम-स्क्रीन हो जाती है। यही कारण है कि मैं अपने होम-स्क्रीन – Smith

+1

पर होम बटन को नियंत्रित करना चाहता हूं, यह सिर्फ से नहीं बना है एनएसई आईएमओ। – markus

+0

तो, घर मेरे अपने होम स्क्रीन पर नियंत्रण है ??? – Smith

13

अवहेलना विधि नीचे।

@Override 
public void onAttachedToWindow() 
{ 
    Log.i("TESTE", "onAttachedToWindow"); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    super.onAttachedToWindow(); 
} 

इस विधि के साथ, होम बटन इस गतिविधि में काम करना बंद कर देता है (केवल यह गतिविधि)। फिर आप केवल एक सामान्य बटन ईवेंट (उदाहरण के लिए बैक बटन) के रूप में अनुकरण करते हैं।

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_HOME) { 
     Log.i("TESTE", "BOTAO HOME"); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event);  
} 
+0

ठीक से उत्तर संपादित करें, ऑनएटेड टॉविंडो() के साथ यह वास्तव में काम करता है, लेकिन यह सभी खतरनाक हो सकता है, अगर उपयोगकर्ता को लॉक कर रहा है, तो ऐप से बाहर निकलने के एकमात्र तरीके से इसे खतरनाक हो सकता है बैटरी ... – ateiob

+4

@ateiob: सौभाग्य से, एंड्रॉइड 4.0 के रूप में, यह सुरक्षा छेद तय किया गया है। – CommonsWare

+1

@CommonsWare इस जानकारी के लिए धन्यवाद। क्या यह वास्तव में एक ** सुरक्षा ** छेद है? या सिर्फ एक "उपयोगकर्ता निराशा छेद"? – ateiob

8

AndroidManifest.xml

<activity 
    ... 
    android:launchMode="singleTask"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <category android:name="android.intent.category.HOME" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     .... 
    </intent-filter> 
</activity> 

में आप launchMode="singleTask" इतना आशय के बजाय एक नया उदाहरण बनाने की पहले से ही चल रहे एप्लिकेशन के लिए दिया जाता जरूरत है।

गतिविधि में:

@Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     if (Intent.ACTION_MAIN.equals(intent.getAction())) { 
      Log.i("MyLauncher", "onNewIntent: HOME Key"); 

     } 
    } 

आप एक महत्वपूर्ण घटना नहीं मिलता

+0

लॉलीपॉप पर काम नहीं कर रहा है। –

+0

यह मेरे लिए एंड्रॉइड एम और ऊपर के लिए काम किया। – Harpreet

0

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      onBackPressed(); 
      break; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
    return false; 
} 
0

नहीं हम नहीं कर सकते होम बटन को ओवरराइड गतिविधि में यह प्रयास करें, लेकिन मैं इस के लिए एक समाधान निधि ....:

public boolean isApplicationSentToBackground(final Context context) { 
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 
    if (!tasks.isEmpty()) { 
     ComponentName topActivity = tasks.get(0).topActivity; 
     if (!topActivity.getPackageName().equals(context.getPackageName())) { 
      return true; 
     } 
    } 
    return false; 
} 


@Override 
public void onStop() { 

    if (isApplicationSentToBackground(this)){ 
     //put your code here what u want to do 
    } 
    super.onStop(); 
} 

मेकअप परिवर्तन प्रकट होता है करने के लिए फ़ाइल

<uses-permission android:name="android.permission.GET_TASKS" /> 
+1

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह कैसे और/या समस्या का समाधान क्यों करता है, इसका उत्तर उत्तर के दीर्घकालिक मूल्य में सुधार होगा। गुणवत्ता उत्तर प्रदान करने के लिए कृपया इसे [कैसे-जवाब दें] (http://stackoverflow.com/help/how-to-answer) पढ़ें। – thewaywewere

0

कोई पता लगाने के लिए और ovveride होम बटन व्यवहार KOTLIN में thois appproach का उपयोग

import android.content.Intent 
import android.content.BroadcastReceiver 
import android.content.Context 
import android.content.IntentFilter 
import android.util.Log 



class HomeWatcher(context: Context) { 

    val TAG = "hg" 
    private var mContext: Context? = null 
    private var mFilter: IntentFilter? = null 
    private var mListener: OnHomePressedListener? = null 
    private var mRecevier: InnerRecevier? = null 

    // initializer block 
    init { 
     mContext = context 
     mFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) 
    } 

    fun setOnHomePressedListener(listener: OnHomePressedListener) { 
     mListener = listener 
     mRecevier = InnerRecevier() 
    } 

    fun startWatch() { 
     if (mRecevier != null) { 
      this.mContext!!.registerReceiver(mRecevier, mFilter) 
     } 
    } 

    fun stopWatch() { 
     if (mRecevier != null) { 
      this.mContext!!.unregisterReceiver(mRecevier) 
     } 
    } 

    internal inner class InnerRecevier : BroadcastReceiver() { 
     val SYSTEM_DIALOG_REASON_KEY = "reason" 
     val SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions" 
     val SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps" 
     val SYSTEM_DIALOG_REASON_HOME_KEY = "homekey" 

     override fun onReceive(context: Context, intent: Intent) { 
      val action = intent.action 
      if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) { 
       val reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY) 
       if (reason != null) { 
        Log.e(TAG, "action:$action,reason:$reason") 
        if (mListener != null) { 
         if (reason == SYSTEM_DIALOG_REASON_HOME_KEY) { 
          mListener!!.onHomePressed() 
         } else if (reason == SYSTEM_DIALOG_REASON_RECENT_APPS) { 
          mListener!!.onHomeLongPressed() 
         } 
        } 
       } 
      } 
     } 
    } 
} 

MainActivity

class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { 

    private var launchers = ArrayList<AppLauncher>() 
    private var mStoredPrimaryColor = 0 
    private var mStoredTextColor = 0 
    private var mStoredUseEnglish = false 
    private var receiver: BroadcastReceiver? = null 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     HomeButtonWatcher() 
    } 

    fun HomeButtonWatcher() 
    { 
     val mHomeWatcher = HomeWatcher(applicationContext) 
     mHomeWatcher.setOnHomePressedListener(object : OnHomePressedListener { 
      override fun onHomePressed() { 
       // do something here... 
       Toast.makeText(applicationContext, "onHomePressed", Toast.LENGTH_LONG).show() 
      } 

      override fun onHomeLongPressed() { 
       // do something here... 
       Toast.makeText(applicationContext, "onHomeLongPressed", Toast.LENGTH_LONG).show() 
      } 
     }) 
     mHomeWatcher.startWatch() 

    } 

    // Other code 
} 
संबंधित मुद्दे