Android: Quay trở lại hoạt động trước đó


524

Tôi muốn làm một cái gì đó đơn giản trên ứng dụng Android. Làm thế nào có thể quay trở lại một hoạt động trước đó.

Tôi cần mã gì để quay lại hoạt động trước


5
Theo dõi hoạt động mở cuối cùng
Vuk

53
Bạn chỉ cần kết thúc cuộc gọi đơn giản (); Chúc mừng
Nguyễn Minh Bình

super.finish (); nếu bạn đang gọi nó từ bên trong hoạt động!
happyhardik

5
Một câu hỏi ở đây: Nếu android đã phá hủy hoạt động trước đó do ít bộ nhớ hơn hoặc các vấn đề khác, thì hoạt động đó sẽ không còn ở đó trong backstack và sau đó điều gì xảy ra?
Nắng

@Sunny Tôi giả sử rằng trình thu gom rác bắt đầu với hoạt động hàng đầu trong ngăn xếp. Vì vậy, nếu không có hoạt động trước đó, cũng sẽ không có hoạt động hiện tại. Nhưng tôi chỉ cho rằng vì hành vi đó sẽ có ý nghĩa hơn là giải phóng bộ nhớ trong một ngăn xếp mà không có bất kỳ trật tự cụ thể nào. Đúng nhận xét của tôi, nếu ai đó biết chính xác.
Sedat Kilinc

Câu trả lời:


486

Các hoạt động của Android được lưu trữ trong ngăn xếp hoạt động. Quay trở lại một hoạt động trước đó có thể có nghĩa là hai điều.

  1. Bạn đã mở hoạt động mới từ một hoạt động khác với startActivityForResult . Trong trường hợp đó, bạn chỉ có thể gọi hàm finishActivity () từ mã của mình và nó sẽ đưa bạn trở lại hoạt động trước đó.

  2. Theo dõi ngăn xếp hoạt động. Bất cứ khi nào bạn bắt đầu một hoạt động mới với một ý định, bạn có thể chỉ định một cờ ý định như FLAG_ACTIVITY_REORDER_TO_FRONThoặc FLAG_ACTIVITY_PREVIOUS_IS_TOP. Bạn có thể sử dụng điều này để xáo trộn giữa các hoạt động trong ứng dụng của bạn. Không sử dụng chúng nhiều mặc dù. Hãy xem các cờ ở đây: http://developer.android.com/reference/android/content/Intent.html

Như đã đề cập trong các ý kiến, nếu hoạt động được mở bằng startActivity()thì người ta có thể đóng nó với finish(). Nếu bạn muốn sử dụng nút Lên, bạn có thể bắt gặp onOptionsSelected(MenuItem item)phương pháp đó bằng cách kiểm tra ID mục android.R.id.homekhông giống R.id.homenhư được đề cập trong các nhận xét.


237
Hoặc nếu bạn đã mở hoạt động với startActivity (), bạn có thể đóng bằng finish () (không cần vượt qua bất kỳ tham số nào)
newworld

3
Bạn có thể làm rõ vị trí và cách bạn sử dụng kết thúc () để khi người dùng nhấn nút lên, nó sẽ đưa họ đến hoạt động trước đó
RicNjesh

4
@RicNjesh Trong phương thức onOptionsItemSelected của bạn nếu menuitem được nhấp có id R.id.home sau đó gọi kết thúc (). Nó sẽ đóng hoạt động hiện tại và đưa bạn trở lại hoạt động bắt đầu với hoạt động startActivity ()
Anders Ullnæss

Tôi đang có người dùng đi qua nhiều hoạt động lần lượt thông qua ý định. Tôi có cần phải làm bất cứ điều gì để đảm bảo ứng dụng không bị sập với quá nhiều hoạt động trên ngăn xếp không? Cảm ơn!
Ruchir Baronia

1
Bạn có chắc chắn rằng hoạt động 1 sẽ không chết vào một lúc nào đó trước khi bạn kết thúc hoạt động 2 không?
dùng924

225

Hãy thử Activity#finish(). Đây là ít nhiều những gì nút quay lại làm theo mặc định.


1
tại sao #? hoặc đó là một dấu chấm?
Nabin

8
Tôi tin rằng anh ta có nghĩa làthis.finish();
Jens Bodal

69
Đây #là một chỉ báo finish()là một phương thức không tĩnh của lớp Activity. Nó không hợp lệ với Java, nhưng nó giúp giải thích cách người ta có thể sử dụng phương thức này.
Bryan Herbst

2
@ Tanis.7x Có và chỉ báo cho các phương thức tĩnh không?
Benten

8
@Benten đó sẽ là ., tức là:Activity.someStaticMethod()
JonnyReeves 5/03/2015

81

Chỉ cần viết vào nhấp kết thúc () . Nó sẽ đưa bạn đến Hoạt động trước đó.


1
Mặc dù onBackPression () cũng hoạt động, tôi nghĩ giải pháp này tốt hơn khi nghĩ đến việc thoát khỏi một hoạt động bạn cần chỉ một chút .. ví dụ: máy quét OCR trong trường hợp của tôi. Cảm ơn!
Gene Bo

Điều này đáp ứng nhu cầu của tôi..Cảm ơn bạn.
Roon13

68

Chỉ cái này

super.onBackPressed();

2
Cuộc gọi này chỉ kết thúc hoạt động hiện tại, vì vậy nó sẽ hiển thị hoạt động cuối cùng có thể nhìn thấy. Tuy nhiên, nếu không có hoạt động nào trước đó hoặc bị hủy trong khi đó, ứng dụng có thể thoát.
r1k0

22
Đây là hackish. Bạn không cần phải gọi điều này trực tiếp. Đây là một trong những phương pháp vòng đời và nên được hệ thống Android gọi.
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Điều này sẽ đưa bạn đến một hoạt động trước đó giữ ngăn xếp của nó và xóa tất cả các hoạt động sau khi nó từ ngăn xếp.

Ví dụ: nếu ngăn xếp là A-> B-> C-> D và bạn bắt đầu B với cờ này, ngăn xếp sẽ là A-> B


Đây là những gì làm việc vào cuối của tôi. Rất thích tìm hiểu điều gì sẽ khiến kết thúc () không hoạt động.
Relm

20

Bạn có muốn kiểm soát hành vi nút quay lại? Bạn có thể ghi đè nút quay lại (để chuyển đến một hoạt động cụ thể) thông qua một trong hai phương pháp.

Dành cho Android 1.6 trở xuống:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Hoặc nếu bạn chỉ hỗ trợ Android 2.0 trở lên:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Để biết thêm chi tiết: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Chỉ cần gọi các phương thức này để kết thúc hoạt động hiện tại hoặc quay lại bằng onBackPression

finish();

HOẶC LÀ

onBackPressed();

Tôi đang có người dùng đi qua nhiều hoạt động lần lượt thông qua ý định. Tôi có cần phải làm bất cứ điều gì để đảm bảo ứng dụng không bị sập với quá nhiều hoạt động trên ngăn xếp không? Cảm ơn!
Ruchir Baronia

13

nếu bạn muốn đi chỉ muốn đi đến hoạt động trước đó sử dụng

finish();

HOẶC LÀ

onBackPressed();

nếu bạn muốn đi đến hoạt động thứ hai hoặc bên dưới, hãy sử dụng như sau:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
Tôi thấy rằng cả finish () và onBackPression () đều hoạt động, nhưng, ít nhất, trong ứng dụng của tôi, finish () rất chậm và onBackPression () nhanh hơn nhiều. Tò mò.
scrayne

Tôi đang có người dùng đi qua nhiều hoạt động lần lượt thông qua ý định. Tôi có cần phải làm bất cứ điều gì để đảm bảo ứng dụng không bị sập với quá nhiều hoạt động trên ngăn xếp không? Cảm ơn!
Ruchir Baronia

13

Thêm cái này vào phương thức onCLick () của bạn, nó sẽ quay trở lại hoạt động trước đó của bạn

hoàn thành();

hoặc Bạn có thể sử dụng này. Nó làm việc hoàn hảo cho tôi

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

11

Nếu bạn đã thiết lập chính xác tệp AndroidManifest.xml có cha mẹ hoạt động, bạn có thể sử dụng:

NavUtils.navigateUpFromSameTask(this);

Đây là hoạt động của con bạn.


8

Hãy thử điều này là hành động như bạn phải nhấn nút quay lại

finish();
onBackPressed();


7

Có cùng một vấn đề và

finish();  OR super.onBackPressed();

làm việc tốt với tôi, cả hai đều làm việc như nhau, nhưng không có may mắn với return


6

Bắt đầu hoạt động thứ hai bằng cách sử dụng ý định (sử dụng startActivityhoặc startActivityForResulttheo yêu cầu của bạn). Bây giờ khi người dùng nhấn nút quay lại, hoạt động hiện tại ở trên cùng sẽ bị đóng và trước đó sẽ được hiển thị.

Bây giờ Hãy nói rằng bạn có hai hoạt động, một để chọn một số cài đặt cho người dùng, như ngôn ngữ, quốc gia, v.v. và sau khi chọn, người dùng nhấp vào nút Tiếp theo để đi đến biểu mẫu đăng nhập (ví dụ). Bây giờ nếu đăng nhập không thành công, thì người dùng sẽ tham gia vào hoạt động đăng nhập, nếu đăng nhập thành công thì sao?

Nếu đăng nhập thành công, sau đó bạn phải bắt đầu một hoạt động khác. Nó có nghĩa là một hoạt động thứ ba sẽ được bắt đầu, và vẫn còn hai hoạt động đang chạy. Trong trường hợp này, nó sẽ tốt để sử dụng startActivityForResult. Khi đăng nhập thành công, hãy gửi dữ liệu OK trở lại hoạt động đầu tiên và đóng hoạt động đăng nhập. Bây giờ khi dữ liệu được nhận, sau đó bắt đầu hoạt động thứ ba và đóng hoạt động đầu tiên bằng cách sử dụng kết thúc.


Tôi đang có người dùng đi qua nhiều hoạt động lần lượt thông qua ý định. Tôi có cần phải làm bất cứ điều gì để đảm bảo ứng dụng không bị sập với quá nhiều hoạt động trên ngăn xếp không? Cảm ơn!
Ruchir Baronia

5

Bạn có thể thử điều này:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

Tất cả các hoạt động / ý định mới theo mặc định đều có hành vi quay lại / trước đó, trừ khi bạn đã mã hóa một finish()hoạt động gọi điện.


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

và nếu bạn muốn nhấn vào nút, hãy quay lại

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Hãy thử nó hoạt động cả trên nút quay lại thanh công cụ như nút quay lại phần cứng .


2

Tôi đề nghị NavUtils.navigateUpFromSameTask (), thật dễ dàng và rất đơn giản, bạn có thể tìm hiểu nó từ nhà phát triển google. Tôi có thể giúp bạn!


1

Có một vài trường hợp để quay lại hoạt động trước đó của bạn:

Trường hợp 1: nếu bạn muốn đưa kết quả trở lại hoạt động trước đó thì ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Trường hợp 2: ActivityA -> FBHelperActivity ----> ActivityA

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

Đầu tiên, bạn cần lưu ý rằng, nếu bạn muốn quay lại hoạt động trước đó. Sau đó, đừng gọi phương thức finish () khi đi đến một hoạt động khác bằng Intent.

Sau đó, bạn có hai cách để quay lại hoạt động hiện tại sang hoạt động trước đó:

Chỉ cần gọi: finish()bên dưới bấm vào nút nghe, hoặc Ghi đè phương thức sau để quay lại bằng nút quay lại hệ thống:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

Bên cạnh tất cả các câu trả lời được đề cập, chúng vẫn là một cách khác để làm điều này, giả sử bạn có hai lớp, lớp A và lớp B.

Lớp A bạn đã thực hiện một số hoạt động như chọn hộp kiểm, in ra một số dữ liệu và ý định đến lớp B. Lớp B, bạn muốn chuyển nhiều giá trị cho lớp A và duy trì trạng thái trước của lớp A, bạn có thể sử dụng, thử phương án này phương pháp hoặc tải mã nguồn để chứng minh điều này

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-preingly-state-of-activity-on-intent/

hoặc là

http://developer.android.com/reference/android/content/Intent.html


0

Chỉ cần thử điều này trong, hoạt động đầu tiên

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

Trong hoạt động thứ hai của bạn

@Override
public void onBackPressed() {
    this.finish();
}

Tôi nghĩ rằng sự cố vẫn không ổn định
john ktejik
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.