Cách đóng hoạt động và quay lại hoạt động trước đó trong Android


144

Tôi có một hoạt động chính, khi tôi nhấp vào nút, bắt đầu một hoạt động mới, tôi đã sử dụng đoạn mã sau để thực hiện:

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

Đoạn mã trên được chạy từ hoạt động chính.

Bây giờ trong hoạt động mới của tôi được gọi là hoạt động chính, tôi có một nút quay lại. Khi tôi nhấp vào nút quay lại này, tôi muốn đóng hoạt động mới của mình và nó phải quay lại hoạt động chính ban đầu.

Tôi đã thử gọi super.finish()và chỉ finish() (từ hoạt động mới) nhưng sau đó đóng toàn bộ ứng dụng của tôi (bao gồm cả hoạt động chính của tôi).

Làm cách nào tôi có thể đóng hoạt động hiện đang được tập trung và sau đó quay lại hoạt động chính?

EDITED

Thực tế là nút quay lại điện thoại của tôi cũng đóng toàn bộ ứng dụng của tôi, khiến tôi nghĩ rằng tôi đã bắt đầu hoạt động thứ hai không chính xác?


OK tôi đã tìm kiếm,

Tôi đã tạo một Hoạt động cài đặt sử dụng cùng một mã kê khai và cùng một mã để Bắt đầu hoạt động.

Đối với cài đặt Hoạt động khi tôi nhấn nút quay lại, nó sẽ trở về Hoạt động chính.

Với hoạt động được đề cập ở trên trong câu hỏi chính, nó chỉ đơn giản là thoát khỏi toàn bộ ứng dụng của tôi.

Vì vậy, vấn đề dường như không nằm ở mã để kết thúc hoạt động mà là chính hoạt động đó.


4
Bạn thậm chí không cần nút quay lại, chỉ cần cho phép người dùng sử dụng phím quay lại của điện thoại và bạn không phải làm gì cả.
Hoan Nguyễn

Nút quay lại điện thoại đóng ứng dụng nhập cảnh, không chỉ hoạt động thứ cấp của tôi. Tôi không muốn đóng hoạt động chính.
Zapnologica

1
Nút 'quay lại' không nên làm điều đó - bạn có thể hiển thị thêm mã của mình không?
peejaybee

Trả lời chỉnh sửa của bạn, hoạt động thứ cấp có vẻ tốt từ những gì bạn đã đăng. Tôi nghĩ rằng TGMCians có thể có câu trả lời đúng và bạn điều tra bảng kê khai của bạn.
peejaybee

xem câu trả lời này tôi nghĩ rằng điều này sẽ giúp bạn
Muhammad Helmi

Câu trả lời:


201

Tôi nghĩ rằng bạn đang gọi finish()phương thức MainActivitytrước khi bắt đầu SettingsActivity.

Kịch bản mà bạn đã mô tả sẽ xảy ra theo hai cách sau:

HOẶC

Bạn đã thiết lập android:noHistory = "true"cho MainActivitybên AndroidManifest.xmlgây ra MainActivityđể finishtự động trên nhấn phím quay lại.

HOẶC LÀ

Trước khi chuyển sang 'SettingsActivity', bạn đã gọi finish()đến MainActivity, cái này sẽ giết nó. Khi bạn nhấn nút quay lại, vì không có hoạt động nào khác được đặt sẵn trong ngăn xếp để bật, nó sẽ quay trở lại màn hình chính.


Điều đó sẽ giải thích tại sao nút 'quay lại' của điện thoại cũng loại bỏ hoạt động chính.
peejaybee

Khi gỡ lỗi, tôi nhận thấy việc thực thi tiếp tục sau khi kết thúc (), do đó, nên đưa trở lại bổ sung.
cho đến

Không phải là lý do thứ ba trong câu trả lời này chỉ là sự lặp lại của câu đầu tiên?
Pang

60

Bạn có thể quay lại hoạt động trước đó bằng cách chỉ gọi kết thúc () trong hoạt động bạn đang thực hiện. Lưu ý bất kỳ mã nào sau khi kết thúc cuộc gọi () sẽ được chạy - bạn chỉ có thể thực hiện trả lại sau khi gọi kết thúc () để sửa lỗi này.

Nếu bạn muốn trả lại kết quả cho hoạt động một thì khi bắt đầu hoạt động hai bạn cần:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Trong hoạt động được gọi của bạn, sau đó bạn có thể lấy Ý định từ tham số onCreate () hoặc được sử dụng

getIntent();

Để đặt trả về một kết quả cho hoạt động một thì trong hoạt động hai làm

setResult(Activity.RESULT_OK, MyIntentToReturn);

Nếu bạn không có ý định quay lại thì cứ nói

setResult(Activity.RESULT_OK);

Nếu hoạt động có kết quả xấu, bạn có thể sử dụng Activity.RESULT_CANCELED (điều này được sử dụng theo mặc định). Sau đó, trong hoạt động một bạn làm

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Để kết thúc hoạt động, hai sử dụng cùng một phương thức với finish () như được mô tả ở trên với kết quả của bạn đã được đặt.


1
"Lưu ý bất kỳ mã nào sau khi kết thúc cuộc gọi () sẽ được chạy - bạn chỉ có thể thực hiện trả lại sau khi gọi kết thúc () để sửa lỗi này" Tôi nghĩ rằng 'sửa chữa' là một lựa chọn từ ngữ tồi ở đây. Nó giống như bạn đang tránh thực hiện các dòng sau (không sửa).
Lo-Tan

14

Khi bạn nhấp vào nút của mình, bạn có thể gọi nó:

super.onBackPressed();

11

nếu bạn sử dụng đoạn bạn nên sử dụng

getActivity().onBackPressed();

nếu bạn sử dụng một hoạt động bạn có thể sử dụng

finish();

7

thử mã này thay vì finish:

onBackPressed();


2
Hoạt động tốt để quay lại từ ActivityB đến ActivityA. Đối với các đoạn và các hoạt động đơn lẻ có thể sử dụng câu trả lời của @Osama Ibrahim.
Eftekhari

4

Bạn đang làm điều này quá khó. Nếu tôi hiểu những gì bạn đang cố gắng thực hiện chính xác, nút 'quay lại' tích hợp và chính Android sẽ làm tất cả công việc cho bạn: http://developer.android.com/guide/components/t task- back- stack.html

Ngoài ra, việc triển khai nút "quay lại" tùy chỉnh vi phạm Hướng dẫn chất lượng ứng dụng lõi UX-N1: http://developer.android.com/distribution/googleplay/quality/core.html


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});

4

Điều này sẽ đóng toàn bộ ứng dụng:

this.finish();

Điều này sẽ đóng toàn bộ ứng dụng như đã nêu int anh đặt câu hỏi, không chỉ hoạt động hiện tại, Như điện thoại có quay lại nút không?
Zapnologica

Làm cách nào để tôi có được hoạt động trước đó từ hoạt động Camera.
coderpc

2
Không, nó không. Nó chỉ đóng hoạt động hiện tại. Xem: developer.android.com/reference/android/app/
Lần

4

Tôi tin rằng hoạt động thứ hai của bạn có thể không liên quan đến hoạt động chính của bạn như một hoạt động trẻ em. Kiểm tra AndroidManifest.xmltệp của bạn và xem liệu <activity>mục nhập cho hoạt động con của bạn có bao gồm một android:parentActivityNamethuộc tính. Nó sẽ trông giống như thế này:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Chỉ cần không gọi finish()cho bạn MainActivitysau đó sẽ loại bỏ nhu cầu Ghi đè của onBackPressed()bạn SecondActivitytrừ khi bạn đang làm những việc khác trong chức năng đó. Nếu bạn cảm thấy "cần" cho nút quay lại này thì bạn chỉ cần gọi finish()vào SecondActivityvà điều đó sẽ đưa bạn đến với bạn MainActivitymiễn là bạn chưa gọi finish()cho nó


Tôi đã thử tuyến đường này, nhưng tôi có khoảng 10 màn hình theo trình tự sử dụng PNG độ phân giải cao. Vấn đề là, khoảng màn hình 7, thiết bị hết bộ nhớ do tất cả các hoạt động trong ngăn xếp ngược. Tôi đã quyết định gọi kết thúc cho mỗi hoạt động và điều này đã khắc phục vấn đề bằng cách cho phép thu gom rác, nhưng bây giờ hành vi trở lại cần được mã hóa thủ công vì ngăn xếp ngược hiện đang trống. Bạn đã gặp phải vấn đề này hay biết bất kỳ cơ chế nào trong Android để giải quyết vấn đề này chưa?
Lo-Tan

Bạn muốn nút quay lại để làm gì? Quay trở lại bất cứ điều gì trước đây Activityhoặc luôn luôn quay trở lại MainActivity? Ngoài ra, nếu bạn sắp hết bộ nhớ Bitmapsthì bạn nên đọc Phần này của Tài liệu . Nó đã giúp tôi
codeMagic

@ Lo-Tan nếu bạn muốn quay lại hoạt động trước thì tôi nghĩ bạn cần tìm ra cách quản lý bộ nhớ cho hình ảnh của mình và không hoàn thành các hoạt động (có thể với liên kết tôi cung cấp). Nếu không, bạn sẽ phải tạo lại một phiên bản mới của hoạt động và cố gắng tìm ra cái nào sẽ quay trở lại
codeMagic

Tôi muốn nút quay lại chỉ để đi đến màn hình trước. Đây là một loạt các màn hình hướng dẫn, về cơ bản, và người dùng có thể đi tiếp / quay lại. Mỗi màn hình được thiết kế và sử dụng rất nhiều png - đôi khi các png chiếm phần lớn màn hình (không chỉ là hình thu nhỏ), do đó, nó chiếm rất nhiều bộ nhớ cho mỗi màn hình.
Lo-Tan

@ Lo-Tan Tôi nghĩ rằng bạn muốn ghi đè phương thức onBackPression () và sau đó chỉ cần tạo thủ công hoạt động mà bạn muốn đến. Sau đó, bạn có thể kết thúc cái bạn đang bật và khởi động cái trước đó.
Zapnologica

1

Tôi không biết điều này có hữu ích hay không nhưng tôi đã đấu tranh với cùng một vấn đề và tôi đã tìm thấy một cách khá dễ dàng, chỉ với một biến boolean toàn cầu và hành động onResume (). Trong trường hợp của tôi, Hoạt động C của tôi nếu được nhấp vào một nút cụ thể, nó sẽ kích hoạt kết thúc () của Hoạt động B!

Hoạt động_A -> Activity_B -> Activity_C

Activity_A (mở bình thường Activity_B)

Activity_B (trên một số nút bấm sẽ mở Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Vì vậy, bất cứ khi nào tôi nhấp vào nút trên Hoạt động C, nó sẽ thực hiện chức năng "onResume ()" của Hoạt động B và quay lại Hoạt động A.


1
 @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 .


Cái này làm việc cho tôi Tôi cũng đã có MainActivitySettingsActivity với android:parentActivityName=".MainActivity"cái thứ hai. Mã này xử lý nút Home / Back đó trong toolbat và chỉ hoàn thành hoạt động hiện tại trở về hoạt động trước đó trong ngăn xếp. Cảm ơn.
mortalis

1

Kết thúc đóng toàn bộ ứng dụng, đây là điều tôi ghét trong quá trình phát triển Android không hoàn thành tốt nhưng họ không theo kịp cú pháp ok mà họ có

startActivity(intent)

Tại sao không

closeActivity (ý định)?


1
Điều này có trả lời câu hỏi không? Hay đây chỉ là một gợi ý để được thử? Trong cả hai trường hợp, lời nói không cần thiết và có thể không được chào đón trên SO
Gilles Gouaillardet

1

Chúng tôi đã gặp một tình huống rất giống nhau.

Hoạt động 1 (Mở) -> Hoạt động 2 (Xem trước) -> Hoạt động 3 (Chi tiết)

Phản hồi "bấm ngược" không chính xác

  • Thiết bị quay lại nhấn vào Hoạt động 3 cũng sẽ đóng Hoạt động 2.

Tôi đã kiểm tra tất cả các câu trả lời được đăng ở trên và không ai trong số họ làm việc. Cú pháp Java để chuyển đổi giữa Hoạt động 2 và Hoạt động 3 đã được xem xét là chính xác.

Mới từ mã hóa khi gọi ra một ứng dụng bên thứ 3. bởi một hoạt động. Chúng tôi quyết định điều tra góc cấu hình - cuối cùng cho phép chúng tôi xác định nguyên nhân gốc rễ của vấn đề.

Phạm vi : Cấu hình của Hoạt động 2 (người gọi).

Nguyên nhân gốc rễ :

android:launchMode="singleInstance"

Giải pháp :

android:launchMode="singleTask"

Rõ ràng về vấn đề "nhấn trở lại" này, SingleInstance xem xét các hoạt động được gọi trong một trường hợp với Hoạt động gọi, trong khi đó SingleTask sẽ cho phép các Hoạt động được gọi có đủ danh tính của riêng mình để báo cáo dự phòng hoạt động như bình thường.


0
{ getApplicationContext.finish();   }

Hãy thử phương pháp này ..


Trong khi khối mã này có thể trả lời câu hỏi, sẽ tốt nhất nếu bạn có thể cung cấp một lời giải thích nhỏ cho lý do tại sao nó làm như vậy.
David

0

có thể bạn đang gọi kết thúc (); trong sự kiện nút bấm để hoạt động chính được đóng ngay sau khi bạn nhấp vào nút và khi bạn quay lại từ hoạt động tiếp theo, ứng dụng sẽ thoát vì hoạt động chính đã bị đóng và không có hoạt động nào.


0

trên phương thức onCreate của hoạt động của bạn viết mã sau đây.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Sau đó ghi đè phương thức onOptionsItem đã chọn của hoạt động của bạn như sau

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Và bạn tốt để đi.


0

Bạn phải sử dụng điều này trong MainActivity của bạn

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Cờ sẽ bắt đầu nhiều tác vụ sẽ giữ MainActivity của bạn, khi bạn gọi xong, nó sẽ giết hoạt động khác và đưa bạn trở lại MainActivity

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.