2017-09-29 11 views
0

활동 B을 딥 링크로 시작했으며 위로 버튼을 클릭 할 때 활동 A이 시작될 것으로 예상됩니다.활동이 AppCompatActivity를 확장하면 위로 버튼이 작동하지 않습니다.

은 여기 내 매니페스트

<activity 
    android:name=".ui.activity.B" 
    android:label="@string/title_activity_search" 
    android:parentActivityName=".ui.activity.A" > 

    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".ui.activity.A"/> 
     ... 
     <!-- deep link --> 
     ...  
</activity> 

B 활동 코드가 여기에 있습니다.

public class B extends AppCompatActivity { 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
Toolbar vToolbar = ((Toolbar) findViewById(R.id.toolbar)); 
     setSupportActionBar(vToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

이 코드를지나/복사 할 수 있습니다 및 활동 BFragmentActivity를 확장하는 경우가 작동합니다. 하지만 AppCompatActivity과 함께 작업해야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

다른 응용 프로그램에서 Activity을 열었습니다. 따라서 다른 스택은 Activity입니다. 따라서 위로 버튼을 누를 때 앞쪽에 부모 Activity이 나타나지 않도록해야합니다. 대상 상위 활동이 타스크의 백 스택에있는 경우, 상위 활동이 전달됩니다. 개발자 documentation. 당신의 앱이 현재 작업의 소유자 인 경우에만

그러나 navigateUpFromSameTask()을 사용하는 것이 적합하다 (즉, 사용자가 앱에서이 작업을 시작했다). 그게 사실이 아니며 귀하의 활동이 다른 응용 프로그램에 속한 작업에서 작업을 시작한 경우 은 응용 프로그램에 속한 새 작업을 생성해야합니다.

따라서 귀하는이 문서에 명시된 것과 같은 조치를 취해야합니다.

활동이 다른 앱이 활동을 시작 할 수있는 인 텐트 필터를 제공하는 경우, 당신은 같은 onOptionsItemSelected() 콜백을 구현해야하는 사용자가 다른 응용 프로그램의 작업에서 활동을 입력 한 후 위쪽 버튼을 누를 경우, 앱은 위로 이동하기 전에 적절한 백 스택 으로 새 작업을 시작합니다.

먼저 shouldUpRecreateTask()을 호출하여 을 확인하면 현재 활동 인스턴스가 다른 앱의 작업에 있는지 여부를 확인할 수 있습니다. true를 반환하면 TaskStackBuilder으로 새 작업을 작성하십시오. 그렇지 않은 경우 위의 그림과 같이 navigateUpFromSameTask() 메서드를 사용할 수 있습니다.

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

shouldUpRecreateTask()는 깊은 링크 사실 반환해야 false를 반환한다? 그게 마지막 줄인 이유입니다. NavUtils.navigateUpTo (this, upIntent); 실행 됨 –