2013-07-01 25 views
7

Çalışmıyor: http://developer.android.com/training/implementing-navigation/ancestral.htmlAndroid Yukarı Navigasyon ben uygun navigasyon uygulamaya çalışıyorum

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

ama if (NavUtils.shouldUpRecreateTask(this, upIntent)) { hep YANLIŞ dönüyor.

Bu kod nasıl kullanılır? Hangi durumlarda doğrudur? öncesi Jelly Bean cihazlarda

+0

Örneğin, Ana Sayfa düğmesine bastığımda, etrafında gezinip görev yöneticisi ile uygulamama geri dönersem, bu öğe hala yanlıştır, daha fazla görev yığını olmasa bile (bu benim ana etkinliğimi değil Görev yöneticisine geri götürür) . – Dandy

cevap

4

, source code of NavUtils başına, shouldUpRecreateTask şudur: Bu Activity bir başlatıldı olmadığını belirlemek için (yani ACTION_VIEW vs.) Activity 'ın eylemini kullanan

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

dış kaynak. Jelly Bean + cihazlarda, bu Activity.shouldUpRecreateTask (source code) kullanır: Gmail Activity başlatırsa

verilen Activity 'ın yakınlık olmadığını belirlemek için Task Affinity kullanır
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; 
    } 
} 

, yani onunla başlatıldı yakınlık (aynıdır, Gmail’in kendisine değil, kendi afinitesine sahip olacaktı. Her durumda, bir Etkinliği başlatır. Uygun Activity'u başlatmıyorsa, hangi başlatma modunu kullandığınıza bakmanız ve hangi platform sürümünün çalışmadığı hakkında ayrıntılı bilgi vermeniz gerekebilir.

+0

Ben 2.3.x ve 4.1.x üzerinde test ettik ve shouldUpRecreateTask her zaman FALSE döndürüyor. Eve gittiğimde bile, etrafta oyna ve uygulamaya geri dön. Manifest'teki iki etkinliğe 'android: taskAffinity = "com.my.app.MainActivity" 'ekledim (bu doğru mu?) Ve hala FALSE elde ediyorum. Teşekkürler. – Dandy

+0

@Dandy - ve uygulamanız başka bir başlatıcı olmayan uygulamadan başlatılmadığında doğru yanıttır (başlatıcılar "ACTION_MAIN" işlevini kullanır). Sorunun nedeni, 'navigationateUpTo',' Activity'ınızı başlatmıyor. Daha önce de belirttiğim gibi, bu gerçekten sorunsa, "hangi başlatma modunu kullandığınıza bakmanız ve hangi platform sürümünün çalışmadığı hakkında bilgi vermeniz gerekebilir." – ianhanniballake

+0

Teşekkürler. ActivityManager'ı kullanarak ve backStack girişlerini kontrol ederek çözdüm. Eğer MainActivity bir önceki öğe ise, benTaskToBack'i (true) taşıyacağım, eğer değilse, yeni bir niyet diyorum. – Dandy

0

ActivityManager'ı kullanarak ve backStack girişlerini denetleyerek çözdüm.

Umarım hepiniz için yararlı olur.

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

Ve kullanmayı gerekli:

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

benim Manifestosunun.

Mükemmel bir şekilde çalışıyor, ancak istediğim çözüm olmasa da. Ne yazık ki, android hala basit şeyleri elde etmek için gelişmiş yerleşik yöntemlerden yoksundur ve hepimiz her şeyin yolunu bulmak zorundayız.

İlgili konular