Làm thế nào để đưa một hoạt động lên nền trước (đầu ngăn xếp)?


90

Trong Android, tôi đã xác định một hoạt động ExampleActivity.

Khi ứng dụng của tôi được khởi chạy, một phiên bản của A-Activity này đã được tạo, chẳng hạn như vậy A. Khi người dùng nhấp vào một nút trong đó A, một phiên bản B-Activity khác, B đã được tạo. Bây giờ ngăn xếp nhiệm vụ là BA, với B ở trên cùng. Sau đó, người dùng nhấp vào một nút trên B, một phiên bản khác của C-Activity và C đã được tạo. Bây giờ chồng nhiệm vụ là CBA, với C ở trên cùng.

Bây giờ, khi người dùng nhấp vào một nút trên C, tôi muốn ứng dụng đưa A lên nền trước, tức là làm cho A ở trên cùng của ngăn xếp tác vụ, ACB.

Làm thế nào tôi có thể viết mã để làm cho nó xảy ra?

Câu trả lời:


108

Bạn có thể thử điều này FLAG_ACTIVITY_REORDER_TO_FRONT(tài liệu mô tả chính xác những gì bạn muốn)


3
Tôi nghĩ nó phải là FLAG_ACTIVITY_SINGLE_TOP .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPsẽ không giúp ở đây. Khi ActivityC ở trên cùng của ngăn xếp và nó gọi startActivity()để khởi chạy ActivityA, ngay cả khi bạn đặt FLAG_ACTIVITY_SINGLE_TOPnó vẫn sẽ tạo một phiên bản mới của ActivityA. FLAG_ACTIVITY_SINGLE_TOPchỉ ngăn việc tạo một phiên bản mới nếu bạn đang cố gắng khởi chạy một hoạt động đã ở trên cùng của ngăn xếp . Trong trường hợp này, ActivityA không ở trên cùng của ngăn xếp, vì vậy Android sẽ tạo một phiên bản mới.
David Wasser

6
Tuyệt vời! Được sử dụng (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)để xóa bất kỳ lịch sử nào sau khi đã cho Activity.
shkschneider

10
FLAG_ACTIVITY_REORDER_TO_FRONT bị bỏ qua nếu bạn cũng chỉ định FLAG_ACTIVITY_CLEAR_TOP. Kiểm tra tài liệu.
Kris Subramanian,

3
ý định.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Điều này sẽ hoạt động tốt nếu bạn muốn đưa hoạt động của mình lên trước với phiên người dùng nếu hoạt động của nó đã ở trên mặt sau nhưng không ở phía trước.
Hassan Jamil

64

Cách tốt nhất tôi thấy để làm điều này là sử dụng cùng mục đích như cách sử dụng màn hình chính của Android - Trình khởi chạy ứng dụng.

Ví dụ:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

Bằng cách này, bất kỳ hoạt động nào trong gói của tôi được người dùng sử dụng gần đây nhất sẽ được đưa trở lại mặt trước một lần nữa. Tôi thấy điều này hữu ích khi sử dụng PendingIntent của dịch vụ để đưa người dùng quay lại ứng dụng của tôi.


2
Cảm ơn rất nhiều cho đoạn mã đó. Tôi đã lãng phí hàng giờ để cố gắng làm cho nó hoạt động bình thường.
PakitoV

3
hoặc không có ComponentName và setComponent, nhưng có Intent mới (cái này, MyMainActivity.class)
Tima

3
Kỳ lạ vì đây là thứ duy nhất phù hợp với tôi; việc đặt cờ không hoạt động và luôn tạo lại hoạt động.
Steven Huang,

5
Khi tôi đọc câu trả lời này và các bình luận, rõ ràng là chúng tôi đã hiểu nhầm. Câu hỏi ban đầu là hỏi về cách sắp xếp lại một Activitytrong ngăn xếp nhiệm vụ. OP nói rõ rằng anh ta muốn di chuyển ActivityAtừ dưới cùng của ngăn xếp lên trên cùng của ngăn xếp (nghĩa là: anh ta muốn sắp xếp lại ActivityA ở phía trước ngăn xếp nhiệm vụ ). Câu trả lời này sẽ không làm điều đó. Câu trả lời này là câu trả lời cho câu hỏi "Làm cách nào để đưa ứng dụng của tôi (ngăn xếp tác vụ) từ nền lên nền trước?" Đó là một câu hỏi hoàn toàn khác với câu hỏi ban đầu của OP.
David Wasser

3
Ngoài ra, nút ủng hộ cho biết "Câu trả lời này hữu ích" chứ không phải "câu trả lời này hữu ích cho người chọn" - anh / cô ấy đã có "điểm chấp nhận" cho tình huống này. Rõ ràng là tôi không biết điều gì hữu ích cho op và IMHO từ chối các câu trả lời dựa trên suy đoán của tôi về điều gì hữu ích cho op là không chính xác.
Boris Treukhov

28

Đây là một ví dụ mã về cách bạn có thể làm điều đó:

Intent intent = getIntent(getApplicationContext(), A.class)

Điều này sẽ đảm bảo rằng bạn chỉ có một trường hợp hoạt động trên ngăn xếp.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : Nếu được đặt trong Intent được chuyển đến Context.startActivity (), cờ này sẽ khiến hoạt động đã khởi chạy được đưa lên trước ngăn xếp lịch sử của nhiệm vụ nếu nó đang chạy.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

Tôi nghĩ rằng sự kết hợp của các Intentlá cờ sẽ làm nên mẹo. Đặc biệt, Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK.

Thêm các cờ này vào mục đích của bạn trước khi gọi startActvity.


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Lưu ý Chế độ khởi chạy hoạt động chủ của bạn phải là single_task


1

Nói chung, tôi nghĩ rằng phương pháp quản lý hoạt động này không được khuyến khích. Vấn đề với việc kích hoạt lại một hoạt động Hai bước xuống trong The Stack là hoạt động này có thể đã bị giết. Lời khuyên của tôi là hãy nhớ trạng thái hoạt động của bạn và khởi chạy chúng vớistartActivity ()

Tôi chắc rằng bạn đã xem trang này nhưng để thuận tiện cho bạn, liên kết này


0

Nếu bạn muốn đưa một hoạt động lên đầu ngăn xếp khi nhấp vào Thông báo thì bạn có thể cần thực hiện những việc sau để FLAG_ACTIVITY_REORDER_TO_FRONT hoạt động:

Giải pháp cho tôi là tạo một bộ thu phát sóng có thể lắng nghe các hành động phát sóng mà thông báo kích hoạt. Nên về cơ bản:

  1. Thông báo kích hoạt một hành động truyền phát với tên bổ sung của hoạt động sẽ khởi chạy.

  2. Bộ thu phát sóng bắt được điều này khi nhấp vào thông báo, sau đó tạo ý định khởi chạy hoạt động đó bằng cờ FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Hoạt động được đưa lên đầu ngăn xếp hoạt động, không có bản sao.


-2

nếu bạn đang sử dụng "Google Cloud Message" để nhận thông báo đẩy với lớp "PendingIntent", mã sau chỉ hiển thị thông báo trong thanh tác vụ.

Nhấp vào thông báo sẽ không có hoạt động nào được tạo, hoạt động hoạt động cuối cùng được khôi phục duy trì trạng thái hiện tại mà không gặp sự cố.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Chào!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.