2011-01-24 14 views
29

Tôi có một Hoạt động khi bắt đầu, nó sẽ tải một hình ảnh từ internet. Trong một nỗ lực để tiết kiệm bộ nhớ, khi các hoạt động còn lại bằng nút quay lại được nhấn, tôi muốn các hoạt động để đổ tất cả dữ liệu, đó là thoát khỏi tất cả các chuỗi và hình ảnh trong đó. Tôi đã tìm ra cách tốt nhất để làm điều này là chỉ cần giết hoạt động.Làm cách nào để xóa Hoạt động khi nhấn nút Quay lại?

Vâng, tôi không thể tìm ra cách gọi lại khi nhấn nút Quay lại. Vì vậy, tôi đã cố gắng sử dụng các số gọi lại onPause()onStop() cho tác vụ này nhưng cả hai cách đều buộc đóng ứng dụng của tôi. Đây là mã:

public void onPause() { 
    this.finish(); 
} 
public void onStop() { 
    finish(); 
} 

Tôi đã thử nhiều biến thể, nhưng không có biến thể nào trong số đó có vẻ hoạt động. Bất kỳ ý tưởng?

+0

bạn đang tìm kiếm chính xác điều gì? Để hoàn thành hoạt động hiện tại trên nút? –

Trả lời

36

thêm video này vào hoạt động của bạn

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

Điểm chính là gì? Nhấn nút quay lại sẽ tự động đi xuống ngăn xếp hoạt động. 'finish()' chỉ đảm bảo rằng bạn không thể quay trở lại. (Điều đó nói rằng, câu hỏi được thừa nhận là mơ hồ.) – EboMike

+2

tất nhiên nhưng hoạt động bị giết là không nhất định trên báo chí của nút quay lại để giết kết thúc là quan trọng và đó là những gì được hỏi trong câu hỏi nhưng kể từ khi phát hành bộ nhớ đi nó thực hiện tự động bởi OS – ingsaurabh

+2

Hoàn toàn không. Nếu hoạt động không ở phía trước, nó có thể được hệ điều hành thu hồi. Hoàn thành hay không. – EboMike

4

Vâng, nếu bạn nghiên cứu các cấu trúc như thế nào ứng dụng vòng đời hoạt động, here, sau đó bạn sẽ đến để biết rằng onPause() được gọi khi một lợi nhuận hoạt động trọng tâm và onStop() được gọi khi hoạt động không còn hiển thị nữa.

Từ những gì tôi đã học được, bạn có thể gọi finish() chỉ từ hoạt động đang hoạt động và/hoặc có tiêu điểm. Nếu bạn đang gọi số finish() từ phương thức onPause() có nghĩa là bạn đang gọi nó khi hoạt động không còn hoạt động nữa. do đó, một ngoại lệ được ném.

Khi bạn gọi finish() từ onStop() thì hoạt động sẽ được gửi tới nền, do đó sẽ không còn hiển thị nữa, ngoại lệ này.

Khi bạn nhấn nút back, hãy gọi onStop().

Nhiều khả năng, Android sẽ tự động làm cho bạn những gì bạn hiện đang muốn làm.

6

Trước hết, finish() không phá hủy quy trình của bạn và giải phóng bộ nhớ. Nó chỉ xóa hoạt động khỏi ngăn xếp hoạt động. Bạn sẽ cần phải giết quá trình, được trả lời trong một loạt các câu hỏi (vì điều này đang được hỏi nhiều lần).

Nhưng câu trả lời đúng là - Đừng làm điều đó. Hệ điều hành Android sẽ tự động giải phóng bộ nhớ khi cần bộ nhớ. Bằng cách không giải phóng bộ nhớ, ứng dụng của bạn sẽ khởi động nhanh hơn nếu người dùng quay lại.

Vui lòng see here để biết cách viết tuyệt vời về chủ đề.

+7

Nếu hoạt động đang sử dụng rất nhiều tài nguyên, thì tại sao không giết nó từ bên trong ứng dụng của bạn như trái ngược với chờ đợi cho GC? Đó là một quá trình toàn diện mà sẽ phải chạy qua, do đó làm chậm điện thoại xuống. Quản lý bộ nhớ tốt đang cố gắng hết sức để quản lý nó trong chính chương trình. Đó là lý do tại sao hầu hết các ngôn ngữ lập trình được quản lý và ide tự động đặt mã tự dọn dẹp vào chương trình, và đó cũng là lý do tại sao bạn cho chu kỳ sống, để bạn có thể quản lý bộ nhớ tốt nhất có thể từ bên trong ứng dụng của bạn. – Shaun

+1

Shaun là đúng, quản lý bộ nhớ tốt là làm cho mọi nỗ lực để quản lý nó trong chương trình chính nó. – dns

61

Override Simple onBackPressed Phương pháp:

@Override 
    public void onBackPressed() { 
      super.onBackPressed(); 
      this.finish(); 
    } 
13
public boolean onKeyDown(int keycode, KeyEvent event) { 
    if (keycode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
    } 
    return super.onKeyDown(keycode, event); 
} 

Ứng dụng của tôi khép lại với mã trên.

+0

nó hoạt động, cảm ơn bạn – Mohsen

+0

Hoạt động của nó nhưng ứng dụng được mở cùng một trang luôn bất cứ khi nào ứng dụng không bị giết –

+0

nhưng muốn bắt đầu ứng dụng trong hoạt động của Trình khởi chạy –