2013-07-01 8 views
7

मैं के अनुसार नेविगेशन को लागू करने की कोशिश कर रहा हूँ: http://developer.android.com/training/implementing-navigation/ancestral.htmlएंड्रॉयड ऊपर नेविगेशन काम नहीं करता

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
     Intent upIntent = NavUtils.getParentActivityIntent(this); 
     if (NavUtils.shouldUpRecreateTask(this, upIntent)) { 
      // This activity is NOT part of this app's task, so create a new task 
      // when navigating up, with a synthesized back stack. 
      TaskStackBuilder.create(this) 
        // Add all of this activity's parents to the back stack 
        .addNextIntentWithParentStack(upIntent) 
        // Navigate up to the closest parent 
        .startActivities(); 
     } else { 
      // This activity is part of this app's task, so simply 
      // navigate up to the logical parent activity. 
      NavUtils.navigateUpTo(this, upIntent); 
     } 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

लेकिन if (NavUtils.shouldUpRecreateTask(this, upIntent)) { हमेशा गलत लौटा रहा है।

यह कोड कैसे उपयोगी है? किस मामले में यह सच हो जाता है?

+0

उदाहरण के लिए, यदि मैं होम बटन दबाता हूं, तो खेलता हूं और टास्क मैनेजर के साथ अपने ऐप पर वापस जाता हूं, यह अभी भी झूठा रिटर्न देता है, यहां तक ​​कि कोई और कार्य स्टैक नहीं है (यह मुझे टास्क मैनेजर पर वापस ले जाता है, न कि मेरी मुख्य गतिविधि) । – Dandy

उत्तर

4

पूर्व Jelly Bean उपकरणों पर, source code of NavUtils प्रति, shouldUpRecreateTask है:

public boolean shouldUpRecreateTask(Activity activity, Intent targetIntent) { 
    String action = activity.getIntent().getAction(); 
    return action != null && !action.equals(Intent.ACTION_MAIN); 
} 

कौन सा Activity की कार्रवाई (यानी, ACTION_VIEW, आदि) का उपयोग करता है निर्धारित करने के लिए अगर यह Activity एक से शुरू किया गया था वाह्य स्रोत। Jelly Bean + उपकरणों पर, इसे इस्तेमाल करता है Activity.shouldUpRecreateTask (source code):

public boolean shouldUpRecreateTask(Intent targetIntent) { 
    try { 
     PackageManager pm = getPackageManager(); 
     ComponentName cn = targetIntent.getComponent(); 
     if (cn == null) { 
      cn = targetIntent.resolveActivity(pm); 
     } 
     ActivityInfo info = pm.getActivityInfo(cn, 0); 
     if (info.taskAffinity == null) { 
      return false; 
     } 
     return !ActivityManagerNative.getDefault() 
       .targetTaskAffinityMatchesActivity(mToken, info.taskAffinity); 
    } catch (RemoteException e) { 
     return false; 
    } catch (NameNotFoundException e) { 
     return false; 
    } 
} 

कौन सा Task Affinity का उपयोग करता है, तो दी Activity के संबंध निर्धारित करने के लिए, आत्मीयता इसके साथ शुरू किया गया था (यानी के रूप में ही है अगर Gmail आपके Activity की शुरूआत, इसे जीमेल की एफ़िनिटी दी जाएगी, इसके बजाए)।

NavUtils.navigateUpTo, सभी मामलों में, एक गतिविधि शुरू करता है। यदि यह उपयुक्त Activity लॉन्च नहीं कर रहा है, तो आपको यह देखने की आवश्यकता हो सकती है कि आप किस लॉन्च मोड का उपयोग कर रहे हैं और यह बताएं कि यह किस प्लेटफ़ॉर्म संस्करण पर काम नहीं कर रहा है।

+0

मैंने 2.3.x और 4.1.x पर परीक्षण किया है और चाहिएUpRecreateTask हमेशा FALSE लौटा रहा है। यहां तक ​​कि जब मैं घर जाता हूं, तब भी खेलता हूं और ऐप पर वापस जाता हूं। मैंने मैनिफेस्ट में दोनों गतिविधियों के लिए 'android: taskAffinity =" com.my.app.MainActivity "जोड़ा है (क्या यह सही है?) और मुझे अभी भी गलत लगता है। धन्यवाद। – Dandy

+0

@ डेन्डी - और झूठा सही जवाब है जब आपका ऐप किसी अन्य गैर-लॉन्चर ऐप से लॉन्च नहीं किया गया है (लॉन्चर 'ACTION_MAIN' का उपयोग करते हैं)। सवाल यह है कि क्यों 'नेविगेटअपअप' आपकी 'गतिविधि' लॉन्च नहीं कर रहा है। जैसा कि मैंने कहा, अगर यह वास्तव में समस्या है तो "आपको यह देखने की आवश्यकता हो सकती है कि आप किस लॉन्च मोड का उपयोग कर रहे हैं और यह बताएं कि यह कौन सा मंच संस्करण काम नहीं कर रहा है।" – ianhanniballake

+0

धन्यवाद। मैंने गतिविधि प्रबंधक का उपयोग करके और बैकस्टैक प्रविष्टियों की जांच करके इसे हल किया। अगर मेरी मुख्य गतिविधि पिछली वस्तु है, तो मैं टास्कटॉक (सत्य) को स्थानांतरित करने के लिए, यदि नहीं, तो मैं एक नया इरादा कहता हूं। – Dandy

0

मैंने गतिविधि प्रबंधक का उपयोग करके और बैकस्टैक प्रविष्टियों की जांच करके इसे हल किया।

मुझे आशा है कि यह आपके लिए उपयोगी होगा। मेरी प्रकट में

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

:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 

      ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(getApplicationContext().ACTIVITY_SERVICE); 
      List<RunningTaskInfo> runningTaskInfoList = am.getRunningTasks(10); 
      List<String> backStack = new ArrayList<String>(); 
      Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator(); 
      while(itr.hasNext()){ 
       RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next(); 
       String topActivity = runningTaskInfo.topActivity.getShortClassName(); 
       backStack.add(topActivity.trim()); 
      } 
      if(backStack!=null){ 
       if(backStack.get(1).equals(".MainActivity")){ 
        moveTaskToBack(true); // or finish() if you want to finish it. I don't. 
       } else { 
        Intent intent = new Intent(this, MainActivity.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(intent); 
        finish(); 
       } 
      } 

     break; 
    } 
} 

और मैं का उपयोग करने की जरूरत है।

यह पूरी तरह से काम करता है, हालांकि यह वह समाधान नहीं है जिसे मैं चाहता था। दुर्भाग्यवश, एंड्रॉइड में अभी भी सरल चीजों को प्राप्त करने के लिए उन्नत अंतर्निहित तरीकों की कमी है, और हम सभी को सबकुछ का रास्ता ढूंढना है।

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