2011-08-18 22 views
18

Tôi có hai hoạt động:Làm thế nào để bạn xây dựng một ngăn xếp Android trở lại khi một hoạt động được bắt đầu trực tiếp từ một thông báo?

Hoạt động A - danh sách các mục
Hoạt động B - chi tiết quan điểm của một mục

Thông thường, người dùng mở ứng dụng và hoạt động A được đưa ra. Người dùng sẽ thấy danh sách các mục, nhấp một và Hoạt động B được bắt đầu để hiển thị chi tiết mục.

Hoạt động B cũng có thể được bắt đầu trực tiếp từ việc nhấp vào thông báo. Trong trường hợp này không có ngăn xếp ngược lại.

Làm cách nào để có thể thực hiện để khi Hoạt động B được bắt đầu trực tiếp từ thông báo, người dùng có thể nhấp vào nút Quay lại và chuyển đến Hoạt động A?

+0

Tôi chưa bao giờ là t tình hình của anh ấy, vì vậy câu trả lời của tôi có thể không hoàn hảo. Thay vì bắt đầu Hoạt động B ... Bắt đầu Hoạt động A và chuyển giá trị sử dụng Intent từ người nhận của bạn và kiểm tra giá trị đó trong onCreate of Activity A, nếu điều kiện thỏa mãn bắt đầu Hoạt động B.Vì vậy, thông qua điều này, bạn sẽ có Activity A trong backStack. Nhưng chỉ bắt được là người dùng sẽ thấy hoạt hình kỳ lạ như Hoạt động A sắp tới và chuyển sang Hoạt động B. Điều này có hợp lý không? – Gopal

+0

@gopal yes Tôi đã cân nhắc việc triển khai một cái gì đó như thế. Tôi sẽ thử nó sớm và báo cáo lại. –

+0

chắc chắn hãy cho tôi biết – Gopal

Trả lời

22

Bạn có thể thêm một thêm vào tiếp cận mục đích đưa ra bởi các thông báo để phát hiện khi ứng dụng đã được đưa ra theo cách đó.

Sau đó, bạn có thể ghi đè phương thức hoạt động onBackPressed() và xử lý trường hợp đó, ví dụ:

@Override 
    public void onBackPressed() 
    { 
    Bundle extras = getIntent().getExtras(); 

    boolean launchedFromNotif = false; 

    if (extras.containsKey("EXTRA_LAUNCHED_BY_NOTIFICATION")) 
    { 
     launchedFromNotif = extras.getBoolean("EXTRA_LAUNCHED_BY_NOTIFICATION"); 
    } 

    if (launchedFromNotif) 
    { 
     // Launched from notification, handle as special case 
     Intent intent = new Intent(this, ActivityA.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     mActivity.startActivity(intent); 
     finish(); 
    } 
    else 
    { 
     super.onBackPressed(); 
    }  
    } 
+0

1up vì giải pháp này độc lập ở mức api, trái ngược với giải pháp PendingIntent.getActivities() (http://stackoverflow.com/a/13801159/1894568) – AndacAydin

+0

Kiểm tra xem gói 'extras' có phải là' null' không cần thiết trước khi truy cập nó. – Joe

+0

@AndacAydin Ý của bạn là gì bởi "PendingIntent.getActivities() phụ thuộc vào cấp API"? Như Cassio Landim chỉ ra, tôi muốn giới thiệu giải pháp "TaskStackBuilder", chỉnh sửa backStack, theo hướng dẫn của các hướng dẫn. – John

0

bắt sự kiện phím nút quay lại bằng phương thức onKeyDown() và cho phép người dùng đi đến hoạt động A. Đừng quên trả về true để ngăn sự kiện tiếp tục được truyền bá.

http://developer.android.com/reference/android/app/Activity.html#onKeyDown(int, android.view.KeyEvent)

+0

Bằng cách "cho phép người dùng truy cập Hoạt động A", ý bạn là tạo một Ý định và bắt đầu Hoạt động A? Nếu tôi đã làm điều đó và người dùng đã nhấn nút quay lại trong Hoạt động A, họ sẽ quay lại Hoạt động B, phải không? –

+0

vâng, đúng vậy. Nếu bạn muốn ngăn chặn hành vi này, hãy thử hoàn thành hoạt động của bạn B sau khi bắt đầu Hoạt động A, nghĩa là: Intent i = new Intent (this, ActivityA.class); startActivity (i); kết thúc(); – AZ13

5

Bạn nên chăm sóc này khi bạn nhận được thông báo.

Tôi có một tình huống tương tự giải quyết:

Intent intent = new Intent(context,ListDetail.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addParentStack(ListDetail.class); 
stackBuilder.addNextIntent(intent); 
PendingIntent contentIntent = 
      stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
Notification.Builder mBuilder = new Notification.Builder(context); 
mNotifM.notify(NotificationId.getID(), mBuilder.setStyle(new Notification.BigTextStyle(mBuilder) 
      .bigText(bigText) 
      .setBigContentTitle(title) 
      .setSummaryText(summaryText)) 
      .setContentTitle(title) 
      .setSmallIcon(icon) 
      .setContentText(summaryText) 
      .setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setTicker(bigText) 
      .build()); 

Bạn cần phải thiết lập trong Manifest của bạn hệ thống cấp bậc của hoạt động:

<activity 
     android:name=".ListDetail" 
     android:label="Detail" 
     android:parentActivityName=".List" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".List" /> 
</activity> 
2

Tôi đã thử một sample.Please đi qua với liên kết này

https://github.com/rajajawahar/NotificationBackStack 

Hoạt động bạn muốn khởi chạy ..

Intent launchIntent = new Intent(context, SecondActivity.class).putExtra("Id", id); 

Hoạt động phụ huynh, nếu trở lại ép

Intent parentIntent = new Intent(context, FirstActivity.class); 

Thêm Cả hai hoạt động này trong taskbuilder

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    PendingIntent resultPendingIntent = stackBuilder.addNextIntentWithParentStack(parentIntent).addNextIntent(launchIntent).getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder notificationCompatBuilder = 
       new NotificationCompat.Builder(context); 
     NotificationManager mNotificationManager = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(id, notificationCompatBuilder.build()); 
     NotificationManager mNotifyMgr = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationCompatBuilder.setAutoCancel(true). 
       setContentTitle("First Notification"). 
       setContentText("Sample Text"). 
       setSmallIcon(R.mipmap.ic_launcher). 
       setContentIntent(resultPendingIntent); 
     mNotifyMgr.notify(id, notificationCompatBuilder.build()); 
Các vấn đề liên quan