14

Tôi có một ứng dụng phát hành thông báo rằng khi được chọn bắt đầu một hoạt động. Theo tài liệu Android, tôi có thể sử dụng NavUtils.shouldUpRecreateTask để kiểm tra xem hoạt động đã được bắt đầu trực tiếp (tức là từ thông báo) hay thông qua ngăn xếp hoạt động bình thường. Tuy nhiên nó đưa ra câu trả lời sai. Tôi đang thử nghiệm trên Jellybean nhưng sử dụng thư viện hỗ trợ.NavUtils.shouldUpRecreateTask không thành công trên JellyBean

Về cơ bản shouldUpRecreateTask luôn trả về false, ngay cả khi hoạt động đã được bắt đầu tạo thành thông báo.

Bất kỳ ý tưởng nào về lý do tại sao shouldUpRecreateTask không đưa ra câu trả lời đúng?

+0

Xin chào Clyde, có nênUpRecreateTask làm việc cho bạn trước khi đậu tương? Tôi luôn luôn nhận được giả trên giả lập, không có vấn đề nếu tôi giết chết ứng dụng của tôi ngay trước khi mở thông báo. – Maragues

+0

Tôi thực sự gặp vấn đề tương tự. AFAIK, có vẻ như nó đã bị hỏng. –

+0

Xem http://stackoverflow.com/questions/14602283/up-navigation-broken-on-jellybean – riwnodennyk

Trả lời

5

Tôi vẫn không biết tại sao nênUpRecreateTask không thành công - nhìn vào mã nguồn của nó không giúp gì nhiều. Nhưng giải pháp khá đơn giản - tôi chỉ thêm một giá trị cờ bổ sung vào Intent được đính kèm vào thông báo và kiểm tra điều này trong onCreate(). Nếu nó được thiết lập, thì Activity đã được gọi từ thông báo, vì vậy ngăn xếp lại phải được tạo lại.

Mã này trông như thế này:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle b = getIntent().getExtras(); 
    fromNotification = b.getInt("fromNotification") == 1; 
    setContentView(R.layout.threadlist); 
} 

@Override 
public boolean onHomeButtonPressed() { 
    if(fromNotification) { 
     // This activity is not part of the application's task, so create a new task 
     // with a synthesized back stack. 
     TaskStackBuilder tsb = TaskStackBuilder.from(this) 
       .addNextIntent(new Intent(this, COPAme.class)); 
     tsb.startActivities(); 
    } 
     // Otherwise, This activity is part of the application's task, so simply 
     // navigate up to the hierarchical parent activity. 
    finish(); 
    return true; 
} 
+1

điều này sẽ không giúp được gì, chúng tôi sẽ phá hủy backstack thực sự trong trường hợp chúng tôi đã sử dụng ứng dụng. Không sao nếu ứng dụng của chúng tôi bị đóng. – Maragues

+0

@Maragues Nếu hoạt động đã được mở, sau đó onCreate không được gọi - onNewIntent được gọi thay vào đó, do đó fromNotification không được thiết lập, vì vậy ngăn xếp lại vẫn còn nguyên vẹn. Nếu hoạt động không mở, sau đó phá hủy ngăn xếp hiện có là chính xác những gì tôi muốn. – Clyde

+0

tại sao sử dụng getInt ("fromNotification") == 1 nếu bạn có thể sử dụng một cái gì đó như getBoolean ("fromNotification", false)? – ademar111190

4

này là không đúng! Khi bạn bắt đầu từ thông báo bạn phải tạo ngăn xếp khi xây dựng các thông báo như đã giải thích ở đây: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

Do đó khi tạo thông báo bạn sẽ cần phải làm điều này:

Intent resultIntent = new Intent(this, ResultActivity.class); 
// ResultActivity is the activity you'll land on, of course 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
// make sure that in the manifest ResultActivity has parent specified!!! 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

và sau đó khi bạn bấm vào nút LÊN, bạn cần mã thông thường, đó là:

if (NavUtils.shouldUpRecreateTask(this, intent)) { 
    // 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(intent) 
      // Navigate up to the closest parent 
      .startActivities(); 
} else { 
    NavUtils.navigateUpTo(this, intent); 
} 

Điều này làm việc hoàn hảo cho tôi.

+0

+1, điều này có vẻ như là câu trả lời đúng nhất/đúng nhất với tôi. Cảm ơn. – akent

+1

TaskStackBuilder.getPendingIntent sẽ đặt cờ FLAG_ACTIVITY_CLEAR_TASK thành ý định, khiến cho onNewIntent() sẽ KHÔNG GỌI NHƯ THẾ NÀO trên 2.3. vì vậy, trong ý kiến ​​của tôi, hãy quên TaskStackBuilder, sử dụng PendingIntent bình thường thay thế. – jiashie

3

Tôi gặp vấn đề tương tự như OP. NavUtils.shouldUpRecreateTask dường như luôn trả về false. (Jellybean cũng) Tôi đã sử dụng những điều sau đây để đạt được chức năng tương tự.

case android.R.id.home: 
Intent upIntent = new Intent(this,ParentActivity.class); 
upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(upIntent); 
finish(); 
return true; 

Mục đích 'cha mẹ' có thể được tìm theo cách này thay vì mã hóa cứng.

Intent upIntent = NavUtils.getParentActivityIntent(this); 
Các vấn đề liên quan