Là bỏ một ứng dụng nhăn mặt?


1153

Tiếp tục trong nỗ lực tìm hiểu Android, tôi chỉ cần đọc như sau :

Câu hỏi: Người dùng có lựa chọn tắt ứng dụng trừ khi chúng ta đặt tùy chọn menu để giết nó không? Nếu không có tùy chọn như vậy tồn tại, làm thế nào để người dùng chấm dứt ứng dụng?

Trả lời: (Romain Guy): Người dùng không, hệ thống tự động xử lý việc này. Đó là những gì vòng đời hoạt động (đặc biệt là onPause / onStop / onDestroy) dành cho. Bất kể bạn làm gì, đừng đặt nút ứng dụng "thoát" hoặc "thoát". Nó là vô dụng với mô hình ứng dụng của Android. Điều này cũng trái với cách các ứng dụng cốt lõi hoạt động.

Hehe, với mỗi bước tôi đi trong thế giới Android, tôi gặp phải một số vấn đề = (

Rõ ràng, bạn không thể thoát khỏi một ứng dụng trong Android (nhưng hệ thống Android rất có thể phá hủy hoàn toàn ứng dụng của bạn bất cứ khi nào nó cảm thấy như vậy). Có chuyện gì thế? Tôi bắt đầu nghĩ rằng không thể viết một ứng dụng hoạt động như một "ứng dụng thông thường" - rằng người dùng có thể thoát khỏi ứng dụng khi họ quyết định làm như vậy. Đó không phải là điều nên dựa vào HĐH để làm.

Ứng dụng tôi đang cố gắng tạo không phải là một ứng dụng cho Android Market. Nó không phải là một ứng dụng cho "sử dụng rộng rãi" bởi công chúng, nó là một ứng dụng kinh doanh sẽ được sử dụng trong một lĩnh vực kinh doanh rất hẹp.

Tôi thực sự mong muốn phát triển cho nền tảng Android, vì nó giải quyết rất nhiều vấn đề tồn tại trong Windows Mobile và .NET. Tuy nhiên, tuần trước có phần thay đổi đối với tôi ... Tôi hy vọng tôi không phải từ bỏ Android, nhưng hiện tại nó không được tốt lắm = (

Có cách nào để tôi thực sự thoát khỏi ứng dụng?

Câu trả lời:


1286

Điều này cuối cùng sẽ nhận được câu hỏi của bạn, nhưng trước tiên tôi muốn giải quyết một số vấn đề bạn nêu trong các nhận xét khác nhau của mình cho các câu trả lời khác nhau đã được đưa ra tại thời điểm viết bài này. Tôi không có ý định thay đổi suy nghĩ của bạn - thay vào đó, đây là những người đến để đọc bài đăng này trong tương lai.

Vấn đề là tôi không thể cho phép Android xác định khi nào ứng dụng của tôi sẽ bị chấm dứt. đó phải là sự lựa chọn của người dùng.

Hàng triệu người hoàn toàn hài lòng với mô hình nơi môi trường đóng ứng dụng khi cần thiết. Những người dùng đó đơn giản là không nghĩ đến việc "chấm dứt" ứng dụng Android, nhiều hơn họ nghĩ về việc "chấm dứt" một trang web hoặc "chấm dứt" một bộ điều chỉnh nhiệt.

Người dùng iPhone cũng giống như vậy, khi nhấn nút iPhone không nhất thiết phải "cảm thấy" như ứng dụng bị chấm dứt, vì nhiều ứng dụng iPhone chọn nơi người dùng rời đi, ngay cả khi ứng dụng thực sự bị tắt (chỉ dành cho iPhone cho phép một ứng dụng của bên thứ ba tại một thời điểm, hiện tại).

Như tôi đã nói ở trên, có rất nhiều thứ đang diễn ra trong ứng dụng của tôi (dữ liệu được PUSHed vào thiết bị, danh sách với các tác vụ luôn luôn phải có, v.v.).

Tôi không biết "danh sách với các nhiệm vụ luôn luôn phải có" nghĩa là gì, nhưng "dữ liệu được PUSHed cho thiết bị" là một viễn tưởng dễ chịu và không nên được thực hiện bởi một hoạt động trong mọi trường hợp. Sử dụng tác vụ theo lịch trình (thông qua AlarmManager) để cập nhật dữ liệu của bạn để có độ tin cậy tối đa.

Người dùng của chúng tôi đăng nhập và không thể làm điều đó mỗi khi họ nhận được một cuộc gọi điện thoại và Android quyết định hủy ứng dụng.

Có rất nhiều ứng dụng iPhone và Android giải quyết vấn đề này. Thông thường, đó là vì họ giữ thông tin đăng nhập, thay vì buộc người dùng đăng nhập mỗi lần theo cách thủ công.

Ví dụ: chúng tôi muốn kiểm tra cập nhật khi thoát khỏi ứng dụng

Đó là một lỗi trên bất kỳ hệ điều hành. Đối với tất cả những gì bạn biết, lý do ứng dụng của bạn bị "thoát" là do HĐH bị tắt, và sau đó quá trình cập nhật của bạn sẽ bị lỗi giữa dòng. Nói chung, đó không phải là một điều tốt. Kiểm tra cập nhật khi bắt đầu hoặc kiểm tra cập nhật hoàn toàn không đồng bộ (ví dụ: thông qua tác vụ theo lịch trình), không bao giờ thoát.

Một số ý kiến ​​cho rằng nhấn nút quay lại hoàn toàn không giết ứng dụng (xem liên kết trong câu hỏi của tôi ở trên).

Nhấn nút BACK không "giết ứng dụng". Nó kết thúc hoạt động trên màn hình khi người dùng nhấn nút BACK.

Nó chỉ nên chấm dứt khi người dùng muốn chấm dứt nó - không bao giờ có bất kỳ cách nào khác. Nếu bạn không thể viết các ứng dụng hoạt động như vậy trong Android, thì tôi nghĩ rằng Android không thể được sử dụng để viết các ứng dụng thực sự = (

Sau đó, các ứng dụng web cũng không thể. Hoặc WebOS , nếu tôi hiểu chính xác mô hình của họ (chưa có cơ hội chơi với một mô hình nào). Trong tất cả những thứ đó, người dùng không "chấm dứt" bất cứ thứ gì - họ chỉ rời đi. iPhone hơi khác một chút, ở chỗ nó chỉ cho phép một thứ chạy tại một thời điểm (với một vài ngoại lệ), và do đó, hành động rời đi ngụ ý chấm dứt ứng dụng khá tức thời.

Có cách nào để tôi thực sự thoát khỏi ứng dụng?

Như mọi người khác đã nói với bạn, người dùng (thông qua BACK) hoặc mã của bạn (thông qua finish()) có thể đóng hoạt động hiện đang chạy của bạn. Người dùng thường không cần bất cứ điều gì khác, đối với các ứng dụng được viết chính xác, nhiều hơn họ cần tùy chọn "thoát" để sử dụng các ứng dụng Web.


Không có hai môi trường ứng dụng giống nhau, theo định nghĩa. Điều này có nghĩa là bạn có thể thấy xu hướng trong môi trường khi những cái mới phát sinh và những thứ khác bị chôn vùi.

Ví dụ, có một phong trào đang phát triển để cố gắng loại bỏ khái niệm "tập tin". Hầu hết các ứng dụng Web không bắt buộc người dùng nghĩ về các tệp. Các ứng dụng iPhone thường không bắt buộc người dùng phải nghĩ đến các tệp. Các ứng dụng Android thường không bắt buộc người dùng nghĩ về các tệp. Và như thế.

Tương tự, có một phong trào đang phát triển để cố gắng loại bỏ khái niệm "chấm dứt" một ứng dụng. Hầu hết các ứng dụng Web không buộc người dùng phải đăng xuất mà chỉ đăng xuất người dùng sau một thời gian không hoạt động. Điều tương tự với Android và ở mức độ thấp hơn là iPhone (và có thể là WebOS).

Điều này đòi hỏi nhấn mạnh hơn vào thiết kế ứng dụng, tập trung vào các mục tiêu kinh doanh và không gắn bó với một mô hình triển khai gắn liền với môi trường ứng dụng trước đó. Các nhà phát triển thiếu thời gian hoặc thiên hướng để làm điều này sẽ cảm thấy thất vọng với các môi trường mới hơn phá vỡ mô hình tinh thần hiện tại của họ. Đây không phải là lỗi của một trong hai môi trường, hơn cả đó là lỗi của một ngọn núi đối với những cơn bão chảy xung quanh nó chứ không phải qua nó.

Ví dụ: một số môi trường phát triển, như Hypercard và Smalltalk, có ứng dụng và các công cụ phát triển kết hợp trong một thiết lập. Khái niệm này không bắt kịp nhiều, ngoài các phần mở rộng ngôn ngữ cho các ứng dụng (ví dụ: VBA trong Excel , Lisp trong AutoCAD ). Do đó, các nhà phát triển đã đưa ra các mô hình tinh thần cho rằng sự tồn tại của các công cụ phát triển trong chính ứng dụng, do đó, phải thay đổi mô hình của họ hoặc giới hạn bản thân trong các môi trường nơi mô hình của họ đúng.

Vì vậy, khi bạn viết:

Cùng với những điều lộn xộn khác mà tôi phát hiện ra, tôi nghĩ rằng việc phát triển ứng dụng cho Android của chúng tôi sẽ không xảy ra.

Điều đó sẽ xuất hiện là tốt nhất, cho bạn, ngay bây giờ. Tương tự, tôi sẽ khuyên bạn không nên cố gắng chuyển ứng dụng của bạn lên Web, vì một số vấn đề tương tự bạn đã báo cáo với Android bạn cũng sẽ tìm thấy trong các ứng dụng Web (ví dụ: không có "chấm dứt"). Hoặc ngược lại, một ngày nào đó nếu bạn làm cổng ứng dụng của bạn lên Web, bạn có thể thấy rằng dòng chảy của ứng dụng Web có thể là một trận đấu tốt hơn dành cho Android, và bạn có thể xem lại một cổng Android tại thời điểm đó.


21
Một ý nghĩ trôi qua trong đầu tôi: Nếu tôi chỉ viết lại toàn bộ ứng dụng như một Dịch vụ và coi Dịch vụ đó là ứng dụng thực tế - có lẽ điều đó sẽ hoạt động tốt hơn? Sau đó, tôi có thể "câm lặng" các Hoạt động (giống như Android muốn chúng) để trình bày dữ liệu có trong Dịch vụ. Trong trường hợp đó, có lẽ tôi có thể giữ trạng thái đăng nhập và những thứ khác ở đó. Sử dụng startForeground (int, Thông báo) Tôi gần như có thể ngăn Android giết Dịch vụ ...?
Ted

66
"Xin lưu ý rằng người dùng của tôi là chuyên gia, sử dụng thiết bị cho mục đích duy nhất là sử dụng ứng dụng Tôi đang cố gắng chuyển sang Android." Trên thực tế, bạn đã chỉ ra cách khác ("không thể làm điều đó mỗi khi họ nhận được danh bạ" - "danh bạ" không phải là ứng dụng của bạn). Ngoài ra, trừ khi bạn đang xây dựng thiết bị của riêng mình, bạn không thể ngăn mọi người cài đặt các ứng dụng khác nếu họ chọn.
CommonsWare

25
@SomeCallMeTim: Không, đó không phải là lý do hợp lệ để sử dụng killProcess(). Đó là một lý do hợp lệ để viết mã iOS tốt hơn.
CommonsWare

24
@CommonsWare: Xin lỗi, nhưng đó là một câu trả lời không hữu ích với tôi. Tôi đang chuyển mã mà tôi đã trả cho cổng. Tôi có nên dành hai lần thời gian để làm cổng, viết lại mã của họ hoặc hoàn thành nó theo cách giảm chi phí cho chủ nhân của tôi, cho phép họ đưa nhiều trò chơi lên Android sớm hơn? Dù sao đó cũng là một câu hỏi học thuật: Họ không muốn tôi thực hiện những thay đổi lớn như vậy đối với công cụ của họ, vì tôi không thể kiểm tra các thay đổi trên iOS. VÀ nó chỉ đơn giản là sai: Không có gì "xấu" về việc sử dụng các mẫu Singleton cho các đối tượng thích hợp. Android chỉ là ứng dụng WRT NDK bị hỏng.
Một sốCallMeTim

10
@Ted để tái cấp phép đáng tin cậy hơn, có thể bạn có thể giảm thiểu lượng trạng thái được lưu trữ tại chính Hoạt động hoặc Dịch vụ. Thay vào đó, hãy đặt hầu hết trạng thái và mã vào một lớp riêng mà bạn tạo lại "từ đầu" mỗi khi Hoạt động hoặc Dịch vụ bắt đầu.
Qwertie

290

Tôi chỉ muốn thêm một sự điều chỉnh ở đây cho các độc giả tương lai của chủ đề này. Sắc thái đặc biệt này đã thoát khỏi sự hiểu biết của tôi trong một thời gian dài vì vậy tôi muốn chắc chắn rằng không ai trong số các bạn mắc lỗi tương tự:

System.exit()không giết ứng dụng của bạn nếu bạn có nhiều hơn một hoạt động trên ngăn xếp. Điều thực sự xảy ra là quá trình bị giết và ngay lập tức khởi động lại với một hoạt động ít hơn trên ngăn xếp. Đây cũng là điều xảy ra khi ứng dụng của bạn bị giết bởi hộp thoại Force Close hoặc ngay cả khi bạn cố gắng giết quá trình từ DDMS. Đây là một thực tế hoàn toàn không có giấy tờ, theo hiểu biết của tôi.

Câu trả lời ngắn gọn là, nếu bạn muốn thoát khỏi ứng dụng của mình, bạn phải theo dõi tất cả các hoạt động trong ngăn xếp của mình và finish()TẤT CẢ chúng khi người dùng muốn thoát (và không, không có cách nào để lặp qua ngăn xếp Activity , vì vậy bạn phải tự mình quản lý tất cả những điều này). Ngay cả điều này không thực sự giết chết quá trình hoặc bất kỳ tài liệu tham khảo lơ lửng nào bạn có thể có. Nó chỉ đơn giản là kết thúc các hoạt động. Ngoài ra, tôi không chắc liệu có Process.killProcess(Process.myPid())hoạt động tốt hơn không; Tôi đã không kiểm tra nó.

Mặt khác, nếu bạn có các hoạt động trong ngăn xếp của mình thì không sao, có một phương pháp khác giúp bạn thực hiện mọi thứ cực kỳ dễ dàng: Activity.moveTaskToBack(true)chỉ đơn giản là làm nền cho quá trình của bạn và hiển thị màn hình chính.

Câu trả lời dài liên quan đến lời giải thích về triết lý đằng sau hành vi này. Các triết lý được sinh ra từ một số giả định:

  1. Trước hết, điều này chỉ xảy ra khi ứng dụng của bạn ở phía trước. Nếu nó ở trong nền thì quá trình sẽ kết thúc tốt đẹp. Tuy nhiên, nếu nó ở phía trước, HĐH giả định rằng người dùng muốn tiếp tục làm bất cứ điều gì họ đang làm. (Nếu bạn đang cố gắng giết quá trình từ DDMS, bạn nên nhấn nút home trước, sau đó giết nó)
  2. Nó cũng giả định rằng mỗi hoạt động độc lập với tất cả các hoạt động khác. Điều này thường đúng, ví dụ trong trường hợp ứng dụng của bạn khởi chạy Hoạt động trình duyệt, hoàn toàn riêng biệt và không được bạn viết. Hoạt động trình duyệt có thể hoặc không thể được tạo trên cùng một Tác vụ, tùy thuộc vào thuộc tính tệp kê khai của nó.
  3. Nó giả định rằng mỗi hoạt động của bạn là hoàn toàn tự lực và có thể bị giết / khôi phục trong một thông báo trong giây lát. (Tôi thà không thích giả đặc biệt này, kể từ khi ứng dụng của tôi có rất nhiều hoạt động mà dựa vào một lượng lớn dữ liệu lưu trữ, quá lớn để được đăng một cách hiệu quả trong suốt onSaveInstanceState, nhưng whaddya sẽ làm gì?) Đối với hầu hết được viết tốt các ứng dụng Android này nên là đúng, vì bạn không bao giờ biết khi nào ứng dụng của bạn sẽ bị tắt trong nền.
  4. Yếu tố cuối cùng không phải là một giả định, mà là một hạn chế của HĐH: giết ứng dụng một cách rõ ràng cũng giống như ứng dụng bị sập, và cũng giống như Android giết ứng dụng để lấy lại bộ nhớ. Điều này lên đến đỉnh điểm trong cuộc đảo chính của chúng tôi: vì Android không thể biết ứng dụng đã thoát hay bị sập hay bị giết trong nền, nên nó giả định rằng người dùng muốn quay lại nơi họ rời đi, và vì vậy ActivityManager khởi động lại quá trình.

Khi bạn nghĩ về nó, điều này là thích hợp cho nền tảng. Đầu tiên, đây chính xác là những gì xảy ra khi quá trình bị giết trong nền và người dùng quay lại nó, vì vậy nó cần phải được khởi động lại ở nơi nó dừng lại. Thứ hai, đây là những gì xảy ra khi ứng dụng gặp sự cố và hiển thị hộp thoại Force Close đáng sợ.

Nói rằng tôi muốn người dùng của mình có thể chụp ảnh và tải nó lên. Tôi khởi chạy Hoạt động máy ảnh từ hoạt động của mình và yêu cầu nó trả lại hình ảnh. Máy ảnh được đẩy lên trên cùng của Nhiệm vụ hiện tại của tôi (thay vì được tạo trong Nhiệm vụ riêng). Nếu Máy ảnh có lỗi và nó gặp sự cố, điều đó có dẫn đến toàn bộ ứng dụng bị sập không? Từ quan điểm của người dùng, chỉ có Camera bị lỗi và họ sẽ được đưa trở lại hoạt động trước đó. Vì vậy, nó chỉ khởi động lại quá trình với tất cả các Hoạt động tương tự trong ngăn xếp, trừ Camera. Vì các Hoạt động của bạn phải được thiết kế sao cho chúng có thể bị giết và phục hồi khi thả mũ, nên đây không phải là vấn đề. Thật không may, không phải tất cả các ứng dụng có thể được thiết kế theo cách đó, vì vậy nó một vấn đề đối với nhiều người trong chúng ta, bất kể Romain Guy hay bất cứ ai khác nói với bạn. Vì vậy, chúng ta cần sử dụng cách giải quyết.

Vì vậy, lời khuyên cuối cùng của tôi:

  • Đừng cố giết quá trình. Hoặc là gọi finish()tất cả các hoạt động hoặc gọi moveTaskToBack(true).
  • Nếu quy trình của bạn gặp sự cố hoặc bị giết và nếu như tôi, bạn cần dữ liệu trong bộ nhớ đã bị mất, bạn sẽ cần quay lại hoạt động gốc. Để làm điều này, bạn nên gọi startActivity()với một ý định có chứa Intent.FLAG_ACTIVITY_CLEAR_TOPcờ.
  • Nếu bạn muốn giết ứng dụng của mình từ phối cảnh DDMS của Eclipse, tốt hơn hết là không nên ở phía trước hoặc nó sẽ tự khởi động lại. Bạn nên nhấn nút Home trước, sau đó tắt tiến trình.

8
Trên thực tế, kể từ khi tôi bắt đầu với Android một lần nữa, tôi đang hoàn thành tất cả các hoạt động (chỉ có một hoạt động được kích hoạt tại bất kỳ thời điểm nào), và sau đó tôi gọi System.exit (0); trong Dịch vụ của tôi - và điều đó cũng hoạt động như tôi muốn. Tôi biết hầu hết các ppl đều nói "đừng làm vậy", nhưng tôi có được chính xác hành vi tôi muốn với động thái đó ...
Ted

13
Giết quá trình đôi khi rất hữu ích - ví dụ như khi viết các trò chơi sử dụng mã gốc. Giết quá trình có nghĩa là giải phóng tất cả bộ nhớ được phân bổ trở lại hệ thống, ngay lập tức.
Sulthan

10
Đối với bất kỳ ai quan tâm, Process.killProcess thể hiện chính xác hành vi tương tự như System.exit ()
PacificSky

6
Xuất phát tất cả các hoạt động từ một AtivityBase chung. Sau đó giữ cờ để buộc đóng ứng dụng, trong kiểm tra onResume nếu cờ đóng lực được đặt. Nếu vậy hãy gọi System.exit (0); Điều này sẽ xếp tầng qua toàn bộ ngăn xếp hoạt động và cuối cùng sẽ đóng ứng dụng hoàn toàn.
Nar Gar

12
Cảm ơn đã cung cấp câu trả lời thực tế ( moveTaskToBack()là những gì tôi đang tìm kiếm). Vì vậy, nhiều người chỉ nói "Không bạn là một thằng ngốc vì đã từng muốn thoát khỏi ứng dụng của bạn." thậm chí không cần cân nhắc rằng có thể có trường hợp bạn muốn nó (ví dụ như đăng nhập thất bại).
Timmmm

180

Tất cả các ứng dụng của tôi đều thoát các nút ... và tôi thường xuyên nhận được những bình luận tích cực từ người dùng vì nó. Tôi không quan tâm nếu nền tảng được thiết kế theo kiểu mà các ứng dụng không cần đến chúng. Nói "đừng đặt chúng ở đó" là một điều vô lý. Nếu người dùng muốn thoát ... Tôi cung cấp cho họ quyền truy cập để thực hiện chính xác điều đó. Tôi không nghĩ rằng nó làm giảm cách thức hoạt động của Android và có vẻ như là một cách thực hành tốt. Tôi hiểu vòng đời ... và quan sát của tôi là Android không làm tốt công việc xử lý nó .... và đó là một thực tế cơ bản.


15
+1 vì không may là nó không làm tốt công việc như vậy vào thời điểm này (nhưng tôi vẫn muốn thử làm mọi thứ theo thiết kế, vì vậy nó khiến tôi rơi vào tình trạng khó khăn)
Richard Le Mesurier

25
Cơ chế nào bạn sử dụng để bỏ thuốc lá?
Gary Rudolph

4
@Igor finish () - ing các hoạt động không giết chết ứng dụng (mở rộng Ứng dụng). Vì vậy, ngay cả khi không có hoạt động nào hoạt động, các cài đặt vẫn hoạt động và thực tế, như vậy khi các hoạt động cố gắng truy cập chúng, chúng sẽ là những hoạt động được sử dụng trước đó. System.exit (0); mặt khác giết chết Ứng dụng, sao cho khi khởi động lại, ứng dụng sẽ phải khởi tạo lại các cài đặt từ một lần nữa. Đó là những gì tôi cần khi cập nhật ứng dụng của mình theo cách thủ công, vì tôi thường xuyên thay đổi định dạng của dữ liệu và tôi cần chúng được khởi tạo lại ngay lập tức.
Nar Gar

1
Chà, đó là cách duy nhất để thực hiện những gì tôi cần vào lúc này. Tôi sử dụng system.exit khi ứng dụng được cập nhật (nếu không tôi sẽ nhận được các trường hợp ngoại lệ hoặc lớp ngoại lệ dựa trên thay đổi mã của tôi). Tôi nên đề cập đến mặc dù tôi không cung cấp cho người dùng một giao diện người dùng để giết ứng dụng thông qua system.exit - nó được dành riêng cho tôi với tư cách là kỹ sư của ứng dụng chỉ được sử dụng khi ứng dụng hoàn toàn cần phải tải hoàn toàn. Phần còn lại của thời gian kết thúc đơn giản () (hoặc thao tác nút quay lại mặc định) được sử dụng.
Nar Gar

13
Vâng .. đến địa ngục với 'không phải tiêu chuẩn Android' .. Android là công cụ mạnh mẽ, nó cho phép mọi người thử nghiệm .. Nếu nó cung cấp API để làm một cái gì đó, làm sao người ta có thể nói rằng đó không phải là tiêu chuẩn Android? Tôi không thể tiêu hóa tất cả những câu trả lời 'triết học' đó. Bạn làm cho ứng dụng ghi nhớ người dùng của bạn. nếu họ hạnh phúc hoặc nếu họ muốn thấy tính năng này, thì việc thực hiện điều đó là hoàn toàn tốt nếu ngay cả khi những người được gọi là triết gia chống lại nó ..
Rahul

144

Ngừng suy nghĩ về ứng dụng của bạn như một ứng dụng nguyên khối. Đó là một bộ màn hình UI mà người dùng có thể tương tác với "ứng dụng" của bạn và "chức năng" được cung cấp thông qua các dịch vụ Android.

Không biết những gì ứng dụng bí ẩn của bạn "làm" không thực sự quan trọng. Giả sử nó đường hầm vào một số mạng nội bộ của công ty siêu an toàn, thực hiện một số giám sát hoặc tương tác và duy trì trạng thái đăng nhập cho đến khi người dùng "thoát khỏi ứng dụng". Vì bộ phận CNTT của bạn ra lệnh cho nó, người dùng phải rất ý thức khi họ vào hoặc ra khỏi mạng nội bộ. Do đó, suy nghĩ của bạn về việc nó rất quan trọng đối với người dùng "bỏ".

Cái này đơn giản. Tạo một dịch vụ đặt thông báo liên tục vào thanh thông báo với nội dung "Tôi đang ở trong mạng nội bộ hoặc tôi đang chạy". Có dịch vụ đó thực hiện tất cả các chức năng mà bạn cần cho ứng dụng của bạn. Có các hoạt động liên kết với dịch vụ đó để cho phép người dùng của bạn truy cập vào các bit của UI mà họ cần để tương tác với "ứng dụng" của bạn. Và có nút Menu Android -> Thoát (hoặc đăng xuất hoặc bất cứ điều gì) để báo cho dịch vụ thoát, sau đó tự đóng hoạt động.

Đây là, cho tất cả ý định và mục đích chính xác những gì bạn nói bạn muốn. Thực hiện theo cách Android. Nhìn vào Google Talk hoặc Google Maps Navigation để biết ví dụ về "lối ra" này là tâm lý có thể. Sự khác biệt duy nhất là việc nhấn nút quay lại khỏi hoạt động của bạn có thể khiến quá trình UNIX của bạn nằm chờ trong trường hợp người dùng muốn khôi phục ứng dụng của bạn. Điều này thực sự không khác gì một hệ điều hành hiện đại lưu trữ các tệp được truy cập gần đây trong bộ nhớ. Sau khi bạn thoát khỏi chương trình windows của mình, rất có thể các tài nguyên mà nó cần vẫn còn trong bộ nhớ, chờ đợi để được thay thế bởi các tài nguyên khác khi chúng được tải ngay bây giờ mà chúng không còn cần thiết nữa. Android là điều tương tự.

Tôi thực sự không thấy vấn đề của bạn.


3
@Eric, Bạn không thấy vấn đề vì bạn đang chạy trốn khỏi nó. Bạn chỉ cần sử dụng một chương trình khác chạy trên "mô hình chương trình" cũ để thực hiện những gì không thể thực hiện được bằng "mô hình Android". Để xem vấn đề với "mô hình Android", bạn phải tưởng tượng rằng bạn không có sự phân công nhiệm vụ cho các hộp Linux / Windows. Bạn phải tưởng tượng rằng bạn bị buộc phải làm mọi thứ, từ đầu đến cuối cùng chỉ với các hộp chạy "mô hình Android". Sau đó, bạn sẽ thấy rằng các giới hạn của "mô hình Android" rõ ràng như bầu trời.
Pacerier

nghĩ về ứng dụng của bạn như một ứng dụng nguyên khối. Nó được viết bằng java, được thực thi bởi một quy trình JVM (Máy ảo Java). System.exit () thoát JVM và chấm dứt hoàn toàn và đầy đủ tất cả các màn hình UI và mọi thứ. Ngoại lệ cho điều này là NẾU lập trình viên gặp rắc rối khi thiết lập nhiều luồng chạy trong nhiều quy trình - nhưng theo mặc định, đó không phải là trường hợp và theo Google, không nên thực hiện bình thường.
Jesse Gordon

@JlieGordon Điều này không đúng. System.exit()chỉ loại bỏ một Hoạt động khỏi ngăn xếp. JVM ngay lập tức được khởi tạo lại. Xem câu trả lời này .
forresthopkinsa

1
@forresthopkinsa OK Tôi đã thử nó trên Android 7.0. Một ứng dụng đơn luồng đơn giản vẫn chạy trong cá thể JVM chuyên dụng của riêng nó, chạy dưới dạng ID người dùng duy nhất cho ứng dụng đó. Tôi chưa thử một ứng dụng đa luồng cho bài kiểm tra này. Và System.exit () VẪN giết toàn bộ JVM cho ứng dụng đó. Nếu System.exit () được gọi từ hoạt động chính, nó sẽ thoát. Nếu System.exit () được gọi từ một phép con, JVM vẫn bị giết, nhưng Android khởi động lại nó dưới một ID tiến trình mới trở lại hoạt động chính / đầu tiên. android.os.Process.killProcess (android.os.Process.myPid ()); và giết <pid> hoạt động theo cùng một cách.
Jesse Gordon

1
Thật thú vị .. Nhìn qua câu trả lời mà bạn đã liên kết, @forresthopkinsa, có vẻ như Android đang làm như các trình duyệt web, khôi phục các hoạt động sau system.exit để người dùng không nhận thấy nó đã thoát, nhưng loại trừ hoạt động gây ra lối thoát. .? Kỳ dị. Nhưng dù sao, System.exit () sẽ đóng tất cả các hoạt động và bộ nhớ của free () và chấm dứt JVM cho ứng dụng đó. Nhưng tôi không biết Android sẽ làm gì để khởi động lại / khôi phục nó. Có phải để ngăn chặn các ứng dụng sát thủ ứng dụng? Vì vậy, tôi đoán nếu ai đó muốn có một nút thoát, họ nên đặt nó vào hoạt động chính.
Jesse Gordon

71

Đây là một cuộc thảo luận thú vị và sâu sắc với rất nhiều chuyên gia đóng góp. Tôi cảm thấy bài đăng này nên được lặp lại từ bên trong trang web chính phát triển Android, bởi vì nó xoay quanh một trong những thiết kế cốt lõi của HĐH Android.

Tôi cũng muốn thêm hai xu của tôi ở đây.

Cho đến nay tôi đã rất ấn tượng với cách xử lý các sự kiện trong vòng đời của Android, đưa khái niệm trải nghiệm giống như web vào các ứng dụng gốc.

Có nói rằng tôi vẫn tin rằng nên có một Quitnút. Tại sao? ... Không phải cho tôi hay Ted hay bất kỳ chuyên gia công nghệ nào ở đây, mà chỉ với mục đích duy nhất là đáp ứng nhu cầu của người dùng cuối.

Mặc dù tôi không phải là một fan hâm mộ lớn của Windows, nhưng từ lâu họ đã đưa ra một khái niệm mà hầu hết người dùng cuối đều quen với (nút X) ... "Tôi muốn thoát khỏi việc chạy một widget khi 'tôi' muốn".

Điều đó không có nghĩa là ai đó (HĐH, nhà phát triển?) Sẽ tự lo liệu việc đó theo ý mình ... nó đơn giản có nghĩa là "nút X đỏ của tôi mà tôi đã quen ở đâu". Hành động của tôi tương tự như 'kết thúc cuộc gọi khi nhấn nút', 'tắt thiết bị bằng cách nhấn nút', v.v. và cứ thế ... đó là một nhận thức. Nó mang lại sự hài lòng cho mọi người rằng hành động của tôi thực sự đạt được mục đích của nó.

Mặc dù nhà phát triển có thể giả mạo hành vi này bằng các đề xuất được đưa ra ở đây, nhận thức vẫn còn, tức là một ứng dụng sẽ hoàn toàn ngừng hoạt động (bởi một nguồn độc lập, đáng tin cậy và trung lập theo yêu cầu từ người dùng cuối.


2
Đúng. Windows Mobile tốt cung cấp nút X giống như PC Windows, ngoại trừ việc nó không thực sự thoát khỏi ứng dụng, nó chỉ "tối giản hóa thông minh" nó. Nhiều người dùng có thể không bao giờ phát hiện ra ứng dụng không thực sự thoát. (Cách tiếp cận rất hiệu quả, mặc dù nếu bạn đã sử dụng .NET Compact Framework, ứng dụng không được thông báo rằng điều này đã xảy ra và do đó không có tùy chọn để giải phóng tài nguyên hoặc thực sự thoát.)
Qwertie

3
Thực sự, điều này có nghĩa là nói dối với người dùng của bạn để mang lại cho họ cảm giác ấm áp, mờ nhạt. Cuối cùng, tốt hơn hết là để cho các di tích của quá khứ rơi xuống lề đường, e rằng chúng sẽ tiếp tục là đồ đạc công nghệ vĩnh viễn. Di động và web là những nền tảng mới và dự kiến ​​sẽ không hoạt động giống như máy tính để bàn. Và thông thường, ít nhất, các quyết định về vòng đời của Android dường như đang gây chú ý với người dùng: khi ứng dụng lớn nhất của tôi vượt qua kỷ niệm 2 năm, tôi đã nhận thấy dòng yêu cầu của người dùng cuối đối với các nút "thoát" đang cạn dần khi họ quen với nền tảng mới.
Jon O

2
@Jon Bạn khuyên gì? Không cung cấp tùy chọn 'thoát' ở bất cứ đâu trong ứng dụng?
IgorGanapolsky

Chà, khi một người dùng yêu cầu một nút thoát, tôi sẽ giải thích cho họ chính xác cách mọi thứ hoạt động khác với trên máy tính để bàn (đó là lời giải thích tương tự tôi đưa ra cho họ khi họ đề cập đến những kẻ giết người nhiệm vụ). Bây giờ, thông tin dường như đã bắt kịp và tôi không nhận được những yêu cầu đó nữa. Vì vậy, tôi khuyên bạn nên giải thích nó một vài lần (có thể đưa ra phản hồi đóng hộp) và bỏ qua nút này. Hoặc đặt vào một nút thoát giả bật ra một hộp thoại giải thích tại sao không có thêm nút thoát. : D (Cũng trong Android 4+, người dùng có thể vuốt một ứng dụng "tắt" màn hình đa nhiệm để "tiêu diệt" nó.)
Jon O

3
Tôi cũng không tìm thấy lý do đằng sau tất cả những lời khuyên "đừng giết quá trình". Theo tôi, khách hàng luôn luôn đúng, vậy có gì sai khi cung cấp nút thoát sau khi được yêu cầu và "nói dối với người dùng của bạn để mang lại cho họ cảm giác ấm áp, mờ nhạt", nếu đó là điều họ muốn? Đây là một phần những gì viết ứng dụng tốt là tất cả về. Hầu hết người dùng không biết hoặc quan tâm những gì thực sự diễn ra dưới mui xe, nhưng nếu họ thích ứng dụng của bạn và nó làm những gì họ muốn và mong đợi, họ sẽ quay lại và mua thêm ứng dụng của bạn. Đó là những gì tất cả chúng ta muốn, phải không? Hay tôi đang thiếu một cái gì đó?
DDSports

37

Bạn có thể thoát, bằng cách nhấn Backnút hoặc bằng cách gọi finish()trong của bạn Activity. Chỉ cần gọi finish()từ một MenuItemnếu bạn muốn giết nó một cách rõ ràng.

Romain không nói rằng điều đó không thể thực hiện được, chỉ là điều đó là vô nghĩa - người dùng không cần quan tâm đến việc bỏ hoặc lưu công việc của họ hay bất cứ điều gì, vì cách mà vòng đời ứng dụng hoạt động khuyến khích bạn viết phần mềm thông minh tự động lưu và Khôi phục trạng thái của nó bất kể điều gì xảy ra.


5
Nó không phải là vô nghĩa nếu nó hoàn thành một mục đích, và trong ứng dụng của chúng tôi, nó làm điều đó. Ví dụ: chúng tôi muốn kiểm tra các bản cập nhật khi thoát khỏi ứng dụng. Chúng tôi không thể thoát khỏi ứng dụng, sau đó không thể cập nhật. Một số ý kiến ​​cho rằng nhấn nút quay lại hoàn toàn không giết ứng dụng (xem liên kết trong câu hỏi của tôi ở trên).
Ted

2
Như Romain nói, đó không phải là cách các ứng dụng cốt lõi hoạt động. Vì vậy, nếu người dùng đã quen nhấn "Quay lại" để thoát khỏi một ứng dụng, thì có vẻ như họ sẽ tiếp tục làm như vậy với ứng dụng của bạn thay vì rõ ràng chọn Thoát? Bạn có thể thực hiện kiểm tra cập nhật khi khởi động, hoặc onDestroy () hoặc sử dụng báo thức lặp lại .. có vẻ như đó không phải là thứ bắt buộc phải được kích hoạt bởi người dùng.
Christopher Orr

1
Tom: Tôi đã viết mã cho Windows Mobile được gần 5 năm rồi. Đó là một điện thoại với "tài nguyên hạn chế". Không có hành vi như vậy ở đó, và cũng không có vấn đề gì khi nó không hành động trong "người anh lớn" đó. "Ứng dụng thực" = nơi lập trình viên có nhiều quyền kiểm soát hơn, tức là thoát, khi công cụ GUI bị xóa, v.v ...
Ted

1
Jay: bởi vì nếu nó vẫn còn trong bộ nhớ, tôi không thể cập nhật ứng dụng Tôi đang nghĩ. Không thể xóa các tập tin đang sử dụng, phải không? Tôi muốn cập nhật khi thoát vì chúng tôi không thể buộc người dùng cập nhật khi bắt đầu. Điều đó có liên quan đến cách họ làm việc và những gì họ cần. Không ổn khi họ buộc phải cập nhật khi bắt đầu ca vì những lý do khác nhau. Nó hơi phức tạp.
Ted

1
Jay: Không, như tôi đã nói ở trên, nó KHÔNG phải là Ứng dụng thị trường và nó cũng sẽ không như vậy. Đây là một ứng dụng rất chuyên biệt, không sử dụng chung.
Ted

31

Cuộc tranh luận này tập trung vào câu hỏi lâu đời về việc liệu các nhà phát triển có biết rõ nhất hay liệu người dùng có biết rõ nhất hay không. Các nhà thiết kế chuyên nghiệp trong tất cả các lĩnh vực của các yếu tố con người đấu tranh với điều này mỗi ngày.

Ted đã đưa ra quan điểm rằng một trong những ứng dụng được tải xuống nhiều nhất trên Thị trường là 'Kẻ giết người ứng dụng'. Mọi người nhận được một chút serotonin khi họ thoát khỏi các ứng dụng. Họ đã quen với nó với một máy tính để bàn / máy tính xách tay. Nó giữ cho mọi thứ di chuyển nhanh chóng. Nó giữ cho bộ xử lý mát và quạt không bật. Nó sử dụng ít năng lượng hơn.

Khi bạn cho rằng một thiết bị di động là một con tàu nhỏ hơn nhiều, thì bạn có thể đặc biệt đánh giá cao sự khuyến khích của họ để 'ném lên trên những gì bạn không còn cần nữa'. Bây giờ các nhà phát triển của Android đã lý giải rằng HĐH biết rõ nhất và việc bỏ một ứng dụng là cổ. Tôi hết lòng ủng hộ điều này.

Tuy nhiên, tôi cũng tin rằng bạn không nên làm người dùng thất vọng, ngay cả khi sự thất vọng đó được sinh ra từ sự thiếu hiểu biết của chính họ. Do đó, tôi kết luận rằng việc có tùy chọn 'Thoát' là thiết kế tốt, ngay cả khi đó chủ yếu là nút giả dược không có gì khác hơn là đóng Chế độ xem.


8
Có, có nút 'Thoát' thực sự thân thiện với người dùng. Làm thế nào khác người dùng sẽ thoát khỏi ứng dụng nếu anh ta có 5 hoạt động sâu vào nó? Chắc chắn họ có thể nhấn lại nhiều lần, nhưng tôi không nghĩ họ thích điều đó.
IgorGanapolsky

4
Chỉ 5? Trình duyệt web Android 2.2 khiến tôi mất vài phút chạm vào nút quay lại cho đến khi cuối cùng tôi thoát
Joe Plante

3
Tôi sẽ bắt đầu lắng nghe các nhà phát triển của Android khi họ phát triển trình quản lý bộ nhớ mà CÔNG TRÌNH. Kể từ Froyo, nó hoạt động cực kỳ kém, tiêu diệt các ứng dụng ngẫu nhiên, khởi động lại các ứng dụng không cần (và không có ý định để khởi động chúng một cách hợp pháp) và OTOH, làm chậm quá trình thu thập thông tin HOÀN TOÀN khi bộ nhớ đạt 50 MB.
DVK

10
Khi tôn giáo của bạn nói rằng Android Task Killer là "không cần thiết", nhưng sử dụng ATK để tiêu diệt các tác vụ câm không có hoạt động kinh doanh sẽ thay đổi hệ điều hành từ thu thập dữ liệu ở tốc độ ~ 1-5% tốc độ bình thường trở lại 100% tốc độ bình thường ( được đo) 100% thời gian trên 1000 lần sử dụng ATK trong hơn 2 năm mỗi khi hệ thống đạt mức thấp 50 MB miễn phí, tôn giáo của bạn đã sai
DVK

@JoePlante Bạn có thể đóng tất cả các tab và cửa sổ đang mở trước rồi chỉ cần nhấn nút quay lại một lần để thoát :) Ít nhất là trên GS2 của tôi.
ldam

29

Ted, những gì bạn đang cố gắng thực hiện có thể được thực hiện, có lẽ không phải là cách bạn đang nghĩ về nó ngay bây giờ.

Tôi đề nghị bạn đọc lên về Hoạt động và Dịch vụ. Ngừng sử dụng thuật ngữ "ứng dụng" và bắt đầu đề cập đến các thành phần, tức là Hoạt động, Dịch vụ. Tôi nghĩ bạn chỉ cần tìm hiểu thêm về nền tảng Android; đó là một sự thay đổi trong suy nghĩ từ một ứng dụng PC tiêu chuẩn. Thực tế là không có bài đăng nào của bạn có từ "Hoạt động" (viết tắt của câu hỏi thường gặp, tức là không phải từ của bạn) trong đó cho tôi biết bạn cần đọc thêm.


Tôi đã đọc hầu hết các nội dung trên android.com =) và tôi có thể liên kết với một số câu hỏi của mình khi tôi nói về Hoạt động, vì vậy điều đó không đúng (ví dụ: stackoverflow.com/questions/2032335/ , hoặc stackoverflow.com/questions/ 2032335 / Vv, v.v ...) Tuy nhiên, tôi có thể cho nó đi lần cuối và cố gắng tạo ra "ứng dụng" làm người phục vụ ...
Ted

4
Một ứng dụng có thể chứa Dịch vụ và Hoạt động và có vẻ như ứng dụng của bạn có thể cần cả hai. Các hoạt động chỉ là phần UI.
Aaron

23

Bài viết trên blog Khi bao gồm nút thoát trong ứng dụng Android (Gợi ý: Không bao giờ) giải thích điều đó rất xa hơn tôi có thể. Tôi ước mọi nhà phát triển Android đã đọc nó.

Trích đoạn:

Theo kinh nghiệm của tôi, điều [người dùng] thực sự muốn là: Một cách rõ ràng để đảm bảo rằng một ứng dụng sẽ ngừng tiêu thụ tài nguyên (pin, chu kỳ CPU, truyền dữ liệu, v.v.).

Nhiều người dùng nhận thấy rằng một nút thoát thực hiện yêu cầu này và yêu cầu thêm nó. Các nhà phát triển, đang tìm cách làm hài lòng người dùng của họ, bắt buộc phải thêm một. Ngay sau đó cả hai đều thất bại.

  • Trong hầu hết các trường hợp, nút thoát chỉ đơn giản là gọi Activity.finish(). Điều này chính xác tương đương với việc nhấn nút quay lại. Chính xác. Dịch vụ tiếp tục chạy và bỏ phiếu tiếp tục xảy ra. Người dùng có thể nghĩ rằng họ đã giết ứng dụng nhưng họ không có, và họ sẽ còn khó chịu hơn nữa.
  • Hành vi thoát bây giờ là mơ hồ. Nút thoát của bạn chỉ nên đóng Hoạt động hay nó cũng nên dừng tất cả các Dịch vụ, Người nhận và Báo động được liên kết? Nên Backlàm gì? Điều gì xảy ra nếu họ đánh Homethay? Điều gì xảy ra nếu ứng dụng của bạn có một widget? Nút thoát cũng nên dừng cập nhật?

Giải pháp là làm cho nút quay lại hoạt động như bạn mong đợi nút thoát. Tốt hơn hết, chỉ cần ngừng tiêu thụ tài nguyên bất cứ khi nào ứng dụng không hiển thị.

Đi trước và đọc bài viết đầy đủ.


3
Thoát và Quay lại không phải lúc nào cũng được sử dụng cho cùng một mục đích. Lấy ví dụ, Pandora. Khi bạn quay lại để thoát khỏi ứng dụng này, nó sẽ không thoát khỏi ứng dụng (giữ cho ứng dụng phát ở chế độ nền dưới dạng dịch vụ).
IgorGanapolsky

@IgorG. Ứng dụng trình phát nhạc cần có nút "Dừng" để dừng phát nhạc, không phải nút "Thoát" để thoát khỏi ứng dụng.
Dheeraj Vepakomma

Bạn đã bao giờ sử dụng Pandora, iHeartRadio, Spotify, Jango và các ứng dụng phát nhạc khác chưa? Tất cả đều có nút thoát. Dừng phát nhạc KHÔNG PHẢI LÀ CÙNG NHAU như thoát khỏi một ứng dụng. Đặc biệt nếu bạn có một dịch vụ đang chạy trong thanh thông báo.
IgorGanapolsky

2
Huyền thoại hay không, người dùng nguyên thủy hay không, nhưng hầu như mọi phần mềm UI từng được viết - trên bất kỳ nền tảng và hệ điều hành nào - đều thực hiện nút thoát / đóng / thoát. Làm thế nào khác bạn sẽ thực hiện nó?
IgorGanapolsky

3
@ DheerajV.S., Đơn giản chỉ cần ngừng tiêu thụ tài nguyên bất cứ khi nào ứng dụng không hiển thị? Lời khuyên tệ. Rất. Rất x99. Bất cứ khi nào tôi cố gắng gửi email cho mình một bức ảnh, tôi phải giữ ứng dụng hiển thị trong 5 phút vì nếu tôi thu nhỏ nó, nó sẽ dừng gửi email cho ảnh. Chính xác, tôi không thể sử dụng điện thoại của mình trong 5 phút đầy đủ chỉ vì một số nhà phát triển cho rằng ứng dụng chỉ nên chạy khi hiển thị. Bây giờ hãy tưởng tượng gửi một tệp lớn hơn như video .....
Pacerier

21

Trả lời: (Romain Guy): Người dùng không, hệ thống tự động xử lý việc này. Đó là những gì vòng đời hoạt động (đặc biệt là onPause / onStop / onDestroy) dành cho. Bất kể bạn làm gì, đừng đặt nút ứng dụng "thoát" hoặc "thoát". Nó là vô dụng với mô hình ứng dụng của Android. Điều này cũng trái với cách các ứng dụng cốt lõi hoạt động.

1: Hoàn toàn thoát khỏi một ứng dụng có thể nói chung là không bắt buộc, nhưng nó không vô dụng. Nếu cửa sổ không có tùy chọn thoát thì sao? Hệ thống sẽ hoạt động chậm khi bộ nhớ đầy và hệ điều hành phải đoán xem bạn đã thực hiện chương trình nào. Tôi không quan tâm Romain Guy hay thậm chí là Larry Page và Sergey Brin nói gì - đây là những sự thật không thể nghi ngờ: Các hệ thống chạy chậm hơn khi chúng phải giết các nhiệm vụ để lấy bộ nhớ trước khi có thể khởi chạy ứng dụng mới. Bạn không thể nói với tôi rằng sẽ không mất thời gian để giết một ứng dụng! Ngay cả ánh sáng từ những ngôi sao xa xôi cũng mất thời gian ... Ở đó một số sử dụng trong việc cho phép người sử dụng các ứng dụng đầy đủ gần.

2: Trái ngược với cách các ứng dụng cốt lõi hoạt động? Điều đó có nghĩa là gì? Khi tôi chạy xong một ứng dụng bây giờ, nó không còn hoạt động nữa ... Nó chỉ chờ để bị HĐH giết chết khi cần bộ nhớ.

Tóm lại, có một sự khác biệt rõ rệt giữa giảm thiểu và thoát, và không có nhúm nào tốt cho người khác. Chúng ta có để lại một tuốc nơ vít trong mỗi ốc vít? Hoặc một chìa khóa trong mỗi cánh cửa? Chúng ta có để tất cả các thiết bị của mình ở trên cao cho đến khi máy cắt thổi và chúng ta cần bật một thiết bị khác không? Chúng ta có để máy rửa chén đầy bát đĩa không, và chỉ lấy ra đủ mỗi lần để nhường chỗ cho một số đồ bẩn mới? Chúng ta có để tất cả những chiếc xe chạy trên đường cho đến khi - ồ đừng bận tâm.

Nếu người dùng muốn thu nhỏ một ứng dụng, thì điều tốt nhất là giảm thiểu nó. Nếu người dùng muốn thoát khỏi một ứng dụng, thì bằng mọi cách, tốt nhất là thoát.

Là nó cau mày trên? Đó là quan điểm của Android - họ cau mày với nó. Và nhiều nhà phát triển Android tân binh độc lập cau mày với nó.

Nhưng khi nói đến nó, có mã hóa tốt và mã hóa xấu. Có mô hình dòng chương trình tốt và có mô hình dòng chương trình xấu.

Để lại các chương trình trong bộ nhớ khi người dùng biết rằng chúng được thực hiện với chúng đơn giản là luồng chương trình không tốt. Nó hoàn toàn không phục vụ mục đích gì và nó làm mọi thứ chậm lại khi khởi chạy ứng dụng mới hoặc khi chạy ứng dụng sẽ phân bổ thêm bộ nhớ.

Nó giống như chiếc xe của bạn: Có những lúc bạn để nó chạy, như dừng ở đèn dừng, hoặc có lẽ là thức ăn nhanh lái qua, hoặc dừng ở ATM. Nhưng có những tình huống khác mà bạn muốn tắt nó đi - như khi bạn đi làm, hoặc cửa hàng tạp hóa hoặc thậm chí về nhà.

Tương tự, nếu bạn đang chơi game và điện thoại đổ chuông, vâng. Tạm dừng trò chơi và tiếp tục chạy. Nhưng nếu người dùng đã hoàn thành trò chơi trong một thời gian, thì bằng mọi cách hãy để họ thoát ra.

Nút thoát trên một số ứng dụng nên ở phía trước nhiều hơn những ứng dụng khác. Các trò chơi, ví dụ, hoặc các chương trình mà người dùng có khả năng muốn thoát hoàn toàn, nên có một lối thoát rõ ràng. Các chương trình khác, như, có lẽ, các chương trình email, nơi thoát ra là một mong muốn không thể (để nó có thể tiếp tục kiểm tra email) - các chương trình này không nên lãng phí không gian màn hình kiểm soát chính với tùy chọn thoát, nhưng đối với luồng chương trình tốt, nó nên có một tùy chọn thoát. Điều gì sẽ xảy ra nếu ai đó quyết định rằng họ không muốn chương trình thư của họ cố kiểm tra email khi họ ở trong vùng phủ sóng kém, hoặc có thể trong một cuộc gọi Skype hoặc bất cứ điều gì? Hãy để họ thoát khỏi chương trình email nếu họ muốn!

Đình chỉ và thoát ra là hai nhiệm vụ quan trọng và không hoàn thành vai trò của người kia.


2
"Nếu người dùng muốn thu nhỏ một ứng dụng, thì điều tốt nhất là giảm thiểu nó. Nếu người dùng muốn thoát khỏi một ứng dụng, thì bằng mọi cách, tốt nhất là thoát ra." - Có một điều (dựa trên hơn thập kỷ kinh nghiệm đó): người dùng hiếm khi biết, họ muốn gì. Nếu bạn không giúp đỡ họ, bạn sẽ phải thay đổi nó. Về các mẫu ở trên: hãy để tôi cung cấp cho bạn mẫu khác: bạn đang làm việc trên một chiếc xe hơi và có một bàn trong tay cho mọi thứ. Bạn có luôn đặt ra để sửa tất cả các dụng cụ cần thiết cho tủ hoặc giữ những thứ được sử dụng nhiều nhất trong tay không? Và chỉ cần bỏ đi một cái cuối lớn được sử dụng để có chỗ cho những cái mới?
HoGo

4
HoGo, cảm ơn bình luận của bạn. Tự nhiên, tôi không đồng ý. Cụ thể, tốt nhất như tôi có thể nói, quan điểm của bạn là vì một số người dùng không biết họ nên làm gì, do đó, đừng để bất kỳ người dùng nào làm những gì họ nên làm, ngay cả những người biết họ nên làm gì. Nếu Android có cách để biết chính xác liệu nó có nên chấm dứt một ứng dụng thay vì thu nhỏ nó hay không, thì tốt thôi. Nhưng điều đó không xảy ra và buộc tất cả người dùng luôn phải sống với mức tối thiểu hóa khi họ muốn thoát dẫn đến hiệu suất thiết bị kém.
Jesse Gordon

Vấn đề là, hệ thống biết rằng khi bạn khởi động một ứng dụng và không có bộ nhớ thì nó sẽ giết ứng dụng cuối cùng. Người dùng không nên biết điều đó. Bạn chỉ muốn nó bởi vì bạn là một con người thích sự kiểm soát, bộ nhớ cơ bắp ngu ngốc, sự kiểm soát thậm chí vô nghĩa của nó phải đóng các chương trình. Máy tính được phát minh để tự động hóa, tôi muốn Windows hoạt động như Android và tự động đóng lại cho tôi, nhưng tôi phải nhớ lưu và thoát, điều đó thật ngớ ngẩn, tại sao tôi, người dùng phải làm điều đó? Máy tính nên quản lý bộ nhớ của họ, tôi có những thứ khác để quản lý.
Luiz Felipe

Trên thực tế tôi không đóng các chương trình trong máy Windows của mình, tôi có 32GB RAM, tôi chỉ để mọi thứ chạy, tôi đóng chúng khi tôi hoàn thành công việc. Tại sao đóng chương trình, để mở lại 5 phút sau, điều này vô nghĩa. Hãy nghĩ về một dự án C ++ lớn mất 2 phút để trở nên nhanh nhạy, tôi chỉ để Visual Studio mở mãi mãi. Và tôi hy vọng nó cũng không bị sập sau 15 ngày kể từ khi mở (và vâng, tôi sử dụng bộ nhớ ECC cho điều đó).
Luiz Felipe

Sự tương đồng với cửa hàng máy móc là một điều tốt, tôi cũng để các công cụ được sử dụng nhiều nhất trên bàn của mình, tôi không chọn công cụ, sử dụng nó và đặt lại mỗi lần. Ngoài ra, tôi không bắt đầu một ngày, bật máy tính, đợi nó khởi động, mở IDE, bất cứ điều gì. Tôi chỉ để nó chạy, máy tính hiện đại có thể nhàn rỗi ở 40w, tại sao phải đóng cửa? nó cũng mặc ít các thành phần hơn (không có dòng điện xâm nhập, EEs biết điều đó :))
Luiz Felipe

19

Tôi nghĩ vấn đề là không cần phải thoát ứng dụng trừ khi bạn có phần mềm lỗi. Android thoát khỏi ứng dụng khi người dùng không sử dụng và thiết bị cần thêm bộ nhớ. Nếu bạn có một ứng dụng cần chạy một dịch vụ trong nền, bạn có thể muốn có một cách để tắt dịch vụ.

Ví dụ: Google Listen tiếp tục phát podcast khi ứng dụng không hiển thị. Nhưng luôn có nút tạm dừng để tắt podcast khi người dùng hoàn thành nó. Nếu tôi nhớ chính xác, hãy lắng nghe, thậm chí đặt một phím tắt vào thanh thông báo để bạn luôn có thể nhanh chóng đến nút tạm dừng. Một ví dụ khác là một ứng dụng như ứng dụng twitter chẳng hạn, liên tục thăm dò một dịch vụ trên internet. Những loại ứng dụng này thực sự sẽ cho phép người dùng chọn tần suất thăm dò máy chủ hoặc thậm chí là thăm dò ý kiến ​​trong một luồng nền.

Nếu bạn cần phải có mã chạy khi thoát, bạn có thể ghi đè onPause (), onStop () hoặc onDestroy () nếu phù hợp. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


5
Cùng với những điều lộn xộn khác mà tôi phát hiện ra, tôi nghĩ rằng việc phát triển ứng dụng cho Android của chúng tôi sẽ không xảy ra. Quá nhiều "người anh lớn" của nó - mọi thứ đang diễn ra, nơi Android cho tôi biết ứng dụng nào nên chạy hay không. Tôi là một lập trình viên nên có sự lựa chọn đó, không phải google hay android = (
Ted

3
Hoạt động của bạn - giao diện người dùng đang hoạt động - biến mất khi một ứng dụng khác xuất hiện hoặc bạn nhấn lại hoặc bất cứ điều gì. Người dùng không tương tác với họ, vì vậy an toàn nhất là lưu trạng thái trong trường hợp người dùng không quay lại trong một thời gian dài, v.v., như bạn biết. Không có gì ngăn bạn viết Servicemặc dù để tiếp tục công việc đang diễn ra trong nền, như nhận được dữ liệu đẩy hoặc bất cứ điều gì. Google Talk không ngừng hoạt động khi bạn đang sử dụng một ứng dụng khác. Tương tự với trình phát nhạc. Nhìn vào các ứng dụng khác ngoài kia và cách chúng hoạt động.
Christopher Orr

3
Bạn sẽ có thể lưu thông tin đăng nhập để người dùng không cần đăng nhập mỗi khi họ nhận được một cuộc gọi điện thoại hoặc rời khỏi ứng dụng của bạn. Tôi khuyên bạn nên xem vòng đời của Android. Khi ứng dụng bị tạm dừng, dừng hoặc hủy, bạn có thể lưu tất cả dữ liệu có liên quan để khi ứng dụng mở lại, nó sẽ như khi họ rời khỏi nó. Người dùng thậm chí không cần biết rằng ứng dụng đã bị dừng.
Jay Askren

1
Tôi có thể tưởng tượng rằng một người dùng có thể muốn thoát khỏi một số ứng dụng thực sự tốn tài nguyên. Có lẽ nó chỉ nên giảm việc sử dụng tài nguyên khi bị tạm dừng, nhưng điều đó có thể không phải lúc nào cũng có thể
Casebash

1
Những câu hỏi này vẫn còn tồn tại tôi thấy, 4 năm sau khi tôi đưa nó lên =) Tôi thực sự đã chạy nó như một dịch vụ trong nền, nhưng tôi đã thêm nút thoát, vì tôi vẫn cảm thấy - 4 năm sau - đó là điều cần thiết và quan trọng. Và tôi thấy ngày càng nhiều ứng dụng cũng có điều đó (ví dụ Skype).
Ted

19

Nếu bạn không thể hiểu làm thế nào để làm cho dữ liệu / kết nối của bạn (và do đó "ứng dụng" của bạn) tồn tại, thì bạn sẽ không thể làm những gì bạn "cần" để làm với Android.

Những người tải xuống những Kẻ giết ứng dụng nhỏ bé dễ thương này thường thấy rằng chúng không giúp tiết kiệm pin hoặc sử dụng bộ nhớ, nhưng cản trở HĐH thực hiện công việc quản lý bộ nhớ hiệu quả ...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


Trong khi chúng ta đang nói về những kẻ giết người nhiệm vụ, một bài viết rất khai sáng đã xuất hiện trên Android reddit vài ngày trước. Ý chính là, sử dụng sát thủ nhiệm vụ một cách cẩn thận hoặc bạn thực sự có thể làm tổn hại đến tuổi thọ pin của bạn: reddit.com/r/Android/comments/cwhm6/
Lỗi

@Neil Traft, tôi thấy những bình luận trên bài rất ngộ. Đại diện bán hàng trong các cửa hàng đang khuyến nghị và cài đặt trình diệt nhiệm vụ cho khách hàng của họ :)
dipu

3
@Dan, Làm thế nào thậm chí có thể từ xa tôi có thể thoát hoàn toàn một ứng dụng mà tôi đã hoàn thành trong một tuần cản trở HĐH Android khỏi công việc của nó? Vì vậy, có nhiều bộ nhớ miễn phí. Điều đó không thể cản trở Android! Nó chắc chắn có thể tăng tốc mọi thứ sau này, mặc dù! Nếu tôi biết tôi đã hoàn thành với ứng dụng này một thời gian, nó hoàn toàn không phục vụ mục đích gì. Nó chỉ chiếm bộ nhớ, và sớm hay muộn, tôi sẽ khởi chạy một ứng dụng mới và HĐH sẽ có thêm độ trễ vì nó phải tiêu diệt một số ứng dụng mà tôi biết WEEKS trước đây mà tôi đã hoàn thành.
Jesse Gordon

@Jlie Gordon, Bạn đã xem các quy trình thực tế sau khi bạn giết một ứng dụng chưa? Họ được khởi động lại, hệ điều hành cho rằng có vấn đề ... Hệ điều hành sẽ giết ứng dụng khi cần bộ nhớ. Bạn thậm chí đã đọc bất cứ điều gì được đăng trong các bài viết được đề cập xung quanh đây?
Dan

@Dan, Để nghĩ rằng Android sẽ làm một cái gì đó như thế này .... nó thực sự cần một sự cải tạo nghiêm túc về việc rửa trắng.
Pacerier

18

Tôi sẽ cân nhắc đọc "Phát triển ứng dụng không dây Android" do Addison-Wesley xuất bản. Tôi chỉ đang hoàn thiện nó và nó RẤT kỹ lưỡng.

Dường như bạn có một số hiểu lầm cơ bản về nền tảng Android. Ban đầu tôi cũng hơi thất vọng với vòng đời ứng dụng của các ứng dụng Android, nhưng sau khi hiểu rõ hơn, tôi đã thực sự thích cách tiếp cận này. Cuốn sách này sẽ trả lời tất cả các câu hỏi của bạn và nhiều hơn nữa. Nó thực sự là tài nguyên tốt nhất tôi đã tìm thấy cho các nhà phát triển Android mới.

Ngoài ra, tôi nghĩ rằng bạn cần phải bỏ qua một cổng line-for-line của ứng dụng hiện có. Để chuyển ứng dụng của bạn sang nền tảng Android, một số thiết kế ứng dụng sẽ thay đổi. Vòng đời ứng dụng được sử dụng là cần thiết vì các thiết bị di động có nguồn lực rất hạn chế so với các hệ thống máy tính để bàn và cho phép các thiết bị Android chạy một số ứng dụng theo cách có trật tự và nhận biết tài nguyên. Nghiên cứu sâu hơn về nền tảng và tôi nghĩ bạn sẽ nhận ra rằng những gì bạn muốn làm là hoàn toàn khả thi. May mắn nhất.

Nhân tiện, tôi không có cách nào liên kết với Addison-Wesley hoặc bất kỳ cá nhân hay tổ chức nào liên quan đến cuốn sách này. Sau khi đọc lại bài viết của tôi, tôi cảm thấy rằng tôi đã có một chút hâm mộ. Tôi chỉ thực sự, thực sự thích nó và thấy nó vô cùng hữu ích. :)


2
Cảm ơn các mẹo cuốn sách. Tôi sẽ xem xét nó nếu tôi có thể và nếu tôi quyết định di chuyển trên cổng Android. Chỉ cần nói lại một lần nữa: người dùng của chúng tôi không cập nhật khi nói đến máy tính. Tôi sẽ rất khó để họ sử dụng, ví dụ như NotificationBar trong Android. Quá nhỏ (họ có ngón tay LỚN hehe). Đó là một thế giới khác đối với họ, vì vậy chúng tôi cần giữ cho nó đơn giản và không có tùy chọn cho người dùng. Chúng tôi đã xây dựng giải pháp .NET của mình với ý nghĩ đó - không cho họ lựa chọn =)
Ted

Tôi nghe thấy điều đó. Bạn phải cho rằng hầu hết người dùng không thông minh lắm.
Andy

8
Tôi cảm thấy mệt mỏi với câu thần chú về việc "tài nguyên" của một thiết bị di động có rất ít. Thức dậy, chúng đang chạy trên 500Mhz và có vô số bộ nhớ. Dell A xấp xỉ cũ của tôi có 128 MB RAM. Các thiết bị hiện tại thường có trên 512RAM và chạy trên 1GHZ! Con số này gấp 10 lần so với Pentium 90Mhz cũ của tôi và tôi không nghe thấy ppl nói rằng "tài nguyên rất hạn chế" này và đó. Đã đến lúc thức dậy và ngửi mùi cà phê - chúng ta đang ở trong năm 2010, không phải là những năm 80.
Ted

16

Gần 99% thời gian không cần ứng dụng Android để vượt qua vòng đời của chính nó. Hầu hết thời gian để lập kế hoạch tốt hơn hoặc thiết kế ứng dụng thông minh hơn. Ví dụ: thay vì xây dựng một dịch vụ nội bộ (không xuất) để xử lý tải xuống, v.v. hoặc thiết kế các hành động và tác vụ xung quanh quy trình làm việc của người dùng.

Nhưng điều đó đang được nói, nơi nào có ý chí sẽ có cách. Android cung cấp - thông qua lớp android.os.Process, API tốt hơn nhiều so với Java để kiểm soát quy trình cơ bản. Và không giống như Java, nó không đối xử với nhà phát triển như một kẻ ngốc bằng cách ẩn tất cả đằng sau một lệnh gọi java.lang.System.exit () đơn giản.

Vậy làm thế nào để bạn yêu cầu ứng dụng của bạn tự tử trong Android? Chà, mẹo rất đơn giản:

Tạo lớp ứng dụng Android của riêng bạn bằng cách kế thừa từ lớp android.app.Application tiêu chuẩn (hãy nhớ khai báo nó trong tệp AndroidManifest.xml).

Ghi đè phương thức onCreate () và lưu ID tiến trình đã khởi động ứng dụng của bạn:

this.pid = android.os.Process.myPid(); // Save for later use.

Bây giờ để hủy ứng dụng của bạn, hãy cung cấp phương thức kill ():

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

Bây giờ bất cứ khi nào bạn cần ứng dụng của mình để tự tử, chỉ cần gõ bối cảnh ứng dụng và gọi phương thức tiêu diệt của bạn!

((MySuicidalApp) context.getApplicationContext()).kill()

Chỉ cần nhớ rằng do các chính sách quản lý quy trình trong Android, liên quan cụ thể đến các dịch vụ, Android có thể chỉ chọn khởi động lại dịch vụ của bạn (xem Bạn không nên sử dụng trình diệt tác vụ trên Android ).


vâng, tôi chỉ đến đây vì tôi muốn đóng ứng dụng của mình trong một tình huống có ý nghĩa, bộ đệm dữ liệu OBB của tôi bị hỏng và tôi cần khởi động lại toàn bộ Ứng dụng
Luiz Felipe

14

Khi tôi hình dung một ứng dụng trong Android, tôi thấy nó theo cách này:

  • Bạn đang làm việc với ứng dụng của bạn
  • Điện thoại reo
  • Bạn nhận cuộc gọi
  • Khi kết thúc cuộc gọi, bạn quay lại ứng dụng của mình tại cùng địa điểm bạn đã

Để làm điều đó, bạn chỉ cần Backnút hoặcHome nút của điện thoại của bạn (bằng cách nhấn ngắn hoặc dài) và thanh thông báo.

Khi tôi thoát khỏi ứng dụng của mình, tôi chỉ sử dụng Backnút này cho đến khi tôi thoát khỏi ứng dụng đó hoặcHome nút đó.

Tôi nghĩ đó là cách mà hầu hết các ứng dụng được hình thành. Nhưng nếu tôi cần một số loại phiên hoặc kết nối, tôi đã nói rõ với người dùng bằng nút đăng nhập / đăng xuất và thông báo (thanh tiêu đề hoặc bất cứ thứ gì khác). Đây là một phong cách khá khác so với ứng dụng kiểu "thoát" thuần túy.

Trên PC, bạn có máy tính để bàn đa GUI và trên Android, rõ ràng bạn có nhiều tác vụ, nhưng bạn chỉ hiển thị một ứng dụng một lúc (Tôi không xem xét các tiện ích ở đây ^^). Và trên điện thoại di động, bất cứ lúc nào, bạn có thể có một thông báo cho một điều quan trọng hơn những gì bạn đang làm.

Vì vậy, toàn bộ khái niệm của một ứng dụng dựa trên một cái gì đó khác biệt là "nhập ứng dụng - làm việc - thoát ứng dụng".


12

Hừm ...

Tôi nghĩ rằng bạn không thấy ứng dụng Android đúng cách. Bạn có thể làm một cái gì đó gần giống như những gì bạn muốn một cách dễ dàng:

  • Do các hoạt động ứng dụng lưu / khôi phục trạng thái như được khuyến khích trong tài liệu vòng đời của nhà phát triển.

  • Nếu một số thông tin đăng nhập là cần thiết ở giai đoạn khôi phục (không có thông tin đăng nhập / phiên có sẵn) thì hãy thực hiện.

  • Cuối cùng, thêm nút / menu / thời gian chờ trong trường hợp bạn sẽ thực hiện finish()mà không lưu thông tin đăng nhập và thông tin phiên khác, làm cho kết thúc phiên phiên ứng dụng: vì vậy, nếu ứng dụng được khởi động / đưa ra phía trước một lần nữa, nó sẽ bắt đầu một phiên mới.

Bằng cách đó, bạn không thực sự quan tâm liệu ứng dụng có thực sự bị xóa khỏi bộ nhớ hay không.

Nếu bạn thực sự muốn xóa nó khỏi bộ nhớ (điều này không được khuyến khích và BTW vì mục đích gì?), Bạn có thể giết nó một cách có điều kiện vào cuối onDestroy()với java.lang.System.exit(0)(hoặc có lẽ restartPackage(..)?). Tất nhiên chỉ làm điều đó trong trường hợp bạn muốn "thực sự kết thúc ứng dụng", bởi vì đây onDestroy()là một phần của vòng đời hoạt động bình thường và hoàn toàn không phải là một ứng dụng.


11

Vì một Ứng dụng trong ngữ cảnh Android chỉ là một loạt các Hoạt động có liên quan mơ hồ, việc thoát khỏi Ứng dụng không thực sự có ý nghĩa nhiều. Bạn có thể hoàn thành () một Hoạt động và chế độ xem Hoạt động trước đó trong ngăn xếp Hoạt động sẽ được vẽ.


2
Bỏ một ứng dụng chắc chắn có thể có ý nghĩa trong một số tình huống. Nếu đó là một chương trình mà bạn sử dụng một vài lần một tháng trong vài phút, có một lợi ích không thể nghi ngờ là thoát khỏi ứng dụng đầy đủ. Lợi ích đó là HĐH sẽ không phải mất thời gian để thoát ứng dụng đó một tuần sau khi hết bộ nhớ và điện thoại của bạn đổ chuông và bạn đã nhấn nút trả lời và bạn đang chờ Android giải phóng bộ nhớ để bạn có thể trả lời cuộc gọi của bạn chẳng hạn. Hoặc có lẽ bạn đã nhận được email và bạn muốn đọc nó - bất kỳ ứng dụng nào cần nhiều bộ nhớ hơn sẽ khởi chạy nhanh hơn nếu hệ điều hành đầu tiên không giải phóng nó.
Jesse Gordon

3
Những gì @JesseGordon đã nói, một khía cạnh khác cho lý do này tại sao việc thoát ra có ý nghĩa: nếu tôi không thoát khỏi ứng dụng sử dụng nhiều tài nguyên này, tôi biết rằng tôi sẽ không sử dụng lại trong một tháng, đôi khi HĐH sẽ giết nhầm một số ứng dụng khác khi tài nguyên trở nên khan hiếm, trong khi để ứng dụng hog tài nguyên vô dụng này chạy ... làm cho ứng dụng đó mất nhiều thời gian để tiếp tục hơn mức cần thiết.
Don nở

10

Tôi đồng ý với Ted. Tôi hiểu rằng việc thoát khỏi ứng dụng không phải là "cách Android", nhưng có vẻ như không nên ngăn chặn. Dưới đây là ba lý do tại sao bạn có thể muốn một lối thoát thực sự cho ứng dụng (không chỉ hoạt động):

  1. Người dùng có thể muốn một số kiểm soát đối với ứng dụng nào bị giết trong trường hợp bộ nhớ thấp. Nếu ứng dụng quan trọng A đang chạy ẩn, thì bạn có thể muốn thoát ứng dụng B khi bạn hoàn thành với ứng dụng đó để ứng dụng A không bị hệ điều hành giết chết.

  2. Nếu ứng dụng của bạn có dữ liệu nhạy cảm được lưu trong bộ nhớ, bạn có thể muốn tắt ứng dụng để ứng dụng vi rút / sâu / lừa đảo không thể truy cập được. Tôi biết mô hình bảo mật được cho là để ngăn chặn điều đó, nhưng chỉ trong trường hợp ...

  3. Nếu ứng dụng của bạn sử dụng các tài nguyên (như mạng, CPU, cảm biến, v.v.) có thể ảnh hưởng xấu đến điện thoại, thì một cách để đảm bảo rằng các tài nguyên đó được giải phóng là thoát khỏi ứng dụng. Tôi hiểu rằng các ứng dụng hoạt động tốt sẽ giải phóng tài nguyên khi không cần thiết. Nhưng một lần nữa, thoát khỏi ứng dụng có vẻ như là một cách hợp lý để đảm bảo điều đó.


6
Bạn nghĩ gì đại diện cho "ứng dụng"? Nếu tôi mở ứng dụng Facebook và đặt ảnh hồ sơ mới - ứng dụng Máy ảnh hoặc Thư viện của tôi sẽ khởi động. Là người dùng, tôi vẫn thực hiện cùng một tác vụ (sử dụng Facebook). Sau đó, nếu tôi quyết định đóng Facebook, các ứng dụng Camera và Thư viện của tôi cũng phải đóng (vì chúng là các hoạt động được khởi chạy từ Facebook) ... Điều gì sẽ xảy ra nếu tôi đang chỉnh sửa một số bức ảnh khác của mình và chỉ có ý định đóng Facebook ? Bạn sẽ chuyển vấn đề sang mất dữ liệu tiềm năng.
seanhodges

Chà, tôi không nghĩ nó có thể đi xa đến mức mất dữ liệu. Nếu bạn có hoạt động của bên thứ ba hoạt động giống như hoạt động của chính bạn và hoạt động của bạn là hoạt động có nút thoát, thì người dùng phải đến finish()hoạt động của bên thứ ba trước khi có thể nhấn nút thoát. Và hoạt động của bên thứ ba nên lưu bất kỳ thông tin chưa được lưu nào tại thời điểm đó. Tôi không nghĩ rằng bạn có thể sử dụng trình chuyển đổi ứng dụng để quay lại hoạt động của nút thoát trừ khi nó chạy trong một tác vụ riêng biệt. Và nếu đó là một nhiệm vụ riêng biệt, thì đó là một quá trình riêng biệt và do đó sẽ không bị nút thoát.
Neil Traft

2
1. Tôi nghĩ 99,99% người dùng Android không nên lo lắng về cách HĐH quản lý các ứng dụng đằng sau màn cửa. Phần còn lại là các chuyên viên máy tính và sẽ tìm thấy các công cụ tiên tiến để làm cho hệ thống hoạt động chính xác như họ muốn. 2. Bạn luôn có thể dỡ bất kỳ dữ liệu nhạy cảm nào khi hoạt động bị tạm dừng hoặc dừng. 3. Tương tự như trên, tài nguyên có thể được giải phóng trong các phương thức gọi lại vòng đời. Khi hoạt động trở lại, tài nguyên có thể được phân bổ lại.
Zsolt Török

4
Tôi nghĩ khá thú vị khi nhiều người dùng Android đang cài đặt "Advanced Task Killer", một ứng dụng đóng các ứng dụng khác vì bạn thường không thể tự làm điều đó. Tôi sử dụng tất cả thời gian bản thân mình. Thoát khỏi một ứng dụng không phải là điều tôi cảm thấy bạn có thể làm mà không cần.
Ted

2
@ ZsoltTörök, 99,99% mọi người đối phó với máy tính / điện thoại chậm và buộc phải lựa chọn lo lắng về cách hệ điều hành quản lý các ứng dụng đằng sau màn cửa.
Pacerier

10

Nhân Linux có một tính năng gọi là Kẻ giết người hết bộ nhớ (như đã đề cập ở trên, các chính sách có thể định cấu hình ở cấp độ không gian người dùng cũng như nhân không phải là một tối ưu, nhưng không có nghĩa là không cần thiết).

Và nó được Android sử dụng rất nhiều:

Một số ứng dụng không gian người dùng có sẵn để hỗ trợ các ứng dụng tiêu diệt này, ví dụ:


9

Bạn rõ ràng đã tìm thấy câu trả lời bạn muốn trong lệnh finish (). Điều này sẽ không xóa ứng dụng của bạn khỏi bộ nhớ, nhưng Android sẽ làm như vậy bất cứ khi nào nó cần tài nguyên, vì vậy nó sẽ không tạo ra bất kỳ sự khác biệt nào mà bạn sẽ không làm điều đó một cách rõ ràng.

Tôi chỉ nói thêm rằng để đạt được hiệu quả đầy đủ mà lối thoát ứng dụng thường có, bạn sẽ muốn đặt lại trạng thái của ứng dụng về trạng thái bình thường tại thời điểm nó chạy lần đầu tiên sau khi khởi động thiết bị, chỉ trước để gọi kết thúc () trên tất cả các hoạt động của bạn. Bằng cách đó, nếu người dùng chọn lại ứng dụng của bạn, nó sẽ xuất hiện để được chạy "mới", không có bất kỳ trạng thái nào còn sót lại từ điểm trước khi "thoát" mô phỏng.

Nếu có một số hành động đặc biệt chỉ xảy ra khi "thoát", chẳng hạn như lưu công việc của người dùng hoặc bất cứ điều gì, bạn cũng có thể thực hiện chúng trước phần khởi tạo lại của thói quen trên.

Cách tiếp cận này cho phép bạn hoàn thành mục tiêu có lệnh "thoát" mà không vi phạm triết lý của Android là rời khỏi việc quản lý tài nguyên hệ điều hành, bao gồm cả việc đóng ứng dụng, trong tay hệ điều hành.

Cá nhân, tôi sẽ không sử dụng phương pháp này, bởi vì người dùng Android mong muốn một ứng dụng sẽ duy trì tính liên tục của nó khi họ xem lại nó và vì vậy họ không quen với phương thức "thoát" một ứng dụng. Thay vào đó, tôi sẽ hỗ trợ chức năng "xóa" mà người dùng có thể gọi để đặt lại ứng dụng về trạng thái ban đầu mặc định, mà không cần phải "bỏ" nó trong quy trình.

Một ngoại lệ sẽ là khi người dùng nhấn nút quay lại đủ số lần để khiến ứng dụng đóng lại. Trong tình huống đó, không có kỳ vọng về phần người dùng sẽ được lưu (và nếu có trạng thái chưa được lưu trong ứng dụng, thì bạn, với tư cách là nhà phát triển, nên có mã xử lý nút quay lại phát hiện dữ liệu chưa được lưu đó và nhắc người dùng lưu nó vào SharedPreferences hoặc vào một tệp hoặc vào một số phương tiện không bay hơi khác).

Về system.exit (0):

Nếu bạn quyết định sử dụng system.exit (0) để đóng ứng dụng của bạn với mức độ thô lỗ (ví dụ: do nhấn nút quay lại cuối cùng), thì tôi sẽ cảnh báo bạn rằng mặc dù đối với tôi điều này "hoạt động" và trong một số trường hợp là cách duy nhất tôi có thể đóng một ứng dụng mà không có bất kỳ dấu vết nào của ứng dụng đó, có một trục trặc nhỏ xảy ra trong Jelly Bean khi bạn sử dụng phương pháp này.

Cụ thể, nếu bạn sử dụng danh sách Ứng dụng gần đây để mở ứng dụng của mình, sau đó sử dụng nút quay lại để đóng ứng dụng (với cách thực hiện gần đó qua system.exit (0)), danh sách Ứng dụng gần đây sẽ hiển thị lại, vì nó sẽ hiển thị lại không bao giờ bị đóng cửa Nếu sau đó bạn nhấn vào mục nhập ứng dụng của bạn trong danh sách đó để chạy lại lần thứ hai từ danh sách Ứng dụng gần đây, đã mở, sẽ không có phản hồi.

Tôi nghi ngờ rằng nguyên nhân của việc này là do danh sách Ứng dụng gần đây đang giữ tham chiếu đến ứng dụng của bạn đã không hoạt động do bạn đã đóng ứng dụng bằng system.exit (0). Việc đóng ứng dụng văn minh hơn bằng cách sử dụng finish () có thể đã thông báo cho HĐH theo cách cho phép ứng dụng làm mới danh sách Ứng dụng gần đây, nhưng system.exit (0) dường như không làm điều này.

Bản thân đây không phải là một vấn đề lớn, vì rất ít người sẽ mở một ứng dụng từ Ứng dụng gần đây, sau đó thoát nó và sau đó mở lại ngay từ danh sách Ứng dụng gần đây đang mở. Và nếu họ nhấn vào nút home và sau đó mở lại danh sách Ứng dụng gần đây, mục nhập ứng dụng của bạn sẽ ở đó và nó sẽ có đầy đủ chức năng. Nhưng tôi nghĩ rằng nó cho thấy rằng việc sử dụng system.exit (0) có thể cản trở giao tiếp đúng đắn giữa ứng dụng của bạn và HĐH và điều này cho thấy có thể có những hậu quả khác, nghiêm trọng hơn, có thể tinh tế hơn khi sử dụng phương pháp này.


Bạn có thể có thể xóa mục ứng dụng gần đây trước khi gọi kết thúc ()? Đây là thứ tôi sẽ thử khi thời gian cho phép. Tôi có một Dịch vụ nền trước với một hoạt động phóng nhỏ. Vì Activity rất nhỏ, sẽ không có vấn đề gì lớn nếu nó không bị giết và chôn vùi, nhưng thật ý nghĩa khi nói với Android rằng nó có thể lấy cái này trước phần còn lại, nếu có thể.
nsandersen

9

Tôi hy vọng mọi thứ sẽ thay đổi theo thời gian. Người dùng sẽ có thể tắt ứng dụng hoặc xử lý nếu quy trình ứng dụng được hệ điều hành đóng hộp chính xác. Có một khái niệm rằng các ứng dụng nên được viết hoàn hảo hoặc người dùng sẽ chỉ sử dụng các ứng dụng tuân theo tất cả các đề xuất SDK. Tôi nghĩ rằng đó là một trật tự cao.


Tôi biết. Sản phẩm của Apple tốt cho một số người tiêu dùng. Chúng không tốt cho các nhà phát triển. Hệ điều hành Android có đầy đủ tiềm năng để trở thành giống như "Hệ điều hành Windows của thế giới PC" cho điện thoại di động. có thể tốt hơn Nó đã mở hơn các cửa sổ của thế giới PC, ngoại trừ việc nó không cho phép chúng ta viết một trình quản lý tác vụ.
dipu

7

Có một thiết kế (tương đối) đơn giản sẽ cho phép bạn đi xung quanh câu hỏi hóc búa "thoát". Làm cho ứng dụng của bạn có trạng thái "cơ sở" (hoạt động) chỉ là một màn hình trống. Trong lần đầu tiên tạo ra hoạt động, bạn có thể khởi chạy một hoạt động khác có chức năng chính của ứng dụng. "Thoát" sau đó có thể được thực hiện bằng cách kết thúc () trong hoạt động thứ hai này và quay lại cơ sở chỉ là một màn hình trống. HĐH có thể giữ màn hình trống này trong bộ nhớ miễn là nó muốn ...

Về bản chất, vì bạn không thể thoát ra khỏi HĐH, bạn chỉ cần biến thành một thứ tự tạo.


2
Ý tưởng tốt. Tuy nhiên, ngay cả việc hoàn thành một Hoạt động (hoặc Dịch vụ) cũng không dừng HĐH. Ồ không, ngay cả sau khi onDestroy đã được thực thi, tất cả các biến và công cụ vẫn còn đó. Tôi chỉ thấy rằng trong một Dịch vụ, mọi hoạt động đều giống nhau mặc dù onDestroy được gọi là ...
Ted

2
... và do đó System.exit (0) đã giúp đỡ =)
Ted

7

Nếu không có chức năng thoát cho nhà phát triển ứng dụng để giết ứng dụng của chính họ thì đó là một thiết kế rất tệ.

Ứng dụng của tôi cần cho phép người dùng tự động thay đổi dữ liệu trong thời gian chạy và người dùng cần khởi động lại ứng dụng của tôi để tạo hiệu ứng thay đổi, nhưng Android không cho phép ứng dụng của tôi tự khởi động lại. HĐH Android có vòng đời ứng dụng thiết kế rất tệ.


9
công khai void appRestart () {Intent i = new Intent (getBaseContext (), MyActivity. class); i.addFlags (Ý định.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); }
androidworkz

2
Mã nhận xét trên đây thực sự hoạt động tốt. Ít nhất bạn có thể chuyển sang hoạt động đầu tiên thay vì thoát hoàn toàn khỏi Ứng dụng. :)
Harpreet

7

Để đóng ứng dụng tại bất kỳ điểm nào, hãy sử dụng FLAG_ACTIVITY_CLEAR_TOPcờ trong Ý định và sau đósystem.exit();

Hoặc có cách tương tự, nhưng không có system.exit()khi bạn muốn thoát, hãy gọi phương thức này:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

Trong HomeActivity.onCreate()mã thêm sau của bạn

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

Điều này sẽ hoạt động mà không phá vỡ vòng đời Android.


7

Trước hết, không bao giờ không bao giờ sử dụng System.exit (0). Nó giống như làm cho một người ngủ đấm vào đầu anh ta!

Thứ hai: Tôi đang đối mặt với vấn đề này. Trước khi chia sẻ giải pháp của tôi, tôi muốn chia sẻ suy nghĩ của mình.

Tôi nghĩ rằng một "Nút thoát" là ngu ngốc. Thực sự thực sự thực sự ngu ngốc. Và tôi nghĩ rằng người dùng (người tiêu dùng) yêu cầu nút thoát cho ứng dụng của bạn cũng thật ngu ngốc. Họ không hiểu hệ điều hành hoạt động như thế nào và cách quản lý tài nguyên (và nó hoạt động rất tốt).

Tôi nghĩ rằng nếu bạn viết một đoạn mã tốt để thực hiện đúng việc (cập nhật, lưu và đẩy) vào đúng thời điểm và điều kiện và sử dụng đúng thứ (Dịch vụ và Người nhận) thì nó sẽ hoạt động khá tốt và không ai phàn nàn .

Nhưng để làm được điều đó bạn phải nghiên cứu và tìm hiểu cách mọi thứ hoạt động trên Android. Dù sao, đây là giải pháp của tôi để cung cấp cho người dùng "Nút thoát".

Tôi đã tạo Menu Tùy chọn luôn hiển thị trong mỗi hoạt động (Tôi có một siêu hoạt động thực hiện điều đó).

Khi người dùng nhấp vào nút đó, đây là những gì xảy ra:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

Vì vậy, tôi đang tiết kiệm trong SharedPreferences rằng tôi muốn giết ứng dụng của mình và tôi bắt đầu một Ý định. Hãy nhìn vào những lá cờ đó; những thứ đó sẽ xóa tất cả các backstack của tôi gọi Hoạt động DashBoard của tôi là hoạt động "nhà" của tôi.

Vì vậy, trong Hoạt động Bảng điều khiển của tôi, tôi chạy phương thức này trong onResume:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

Và nó sẽ hoạt động khá tốt.

Điều duy nhất tôi không hiểu tại sao nó lại xảy ra là khi tôi thực hiện lần hoàn thiện cuối cùng (và tôi đã kiểm tra: nó tuân theo tất cả dòng chảy chính xác của OnPause → onStop → onDestroy), ứng dụng vẫn đang hoạt động gần đây (nhưng nó trống).

Có vẻ như mục đích mới nhất (đã bắt đầu DashboardActivity) vẫn còn trong hệ thống.

Tôi phải đào thêm để loại bỏ nó.


8
Không nhiều người tiêu dùng biết hệ điều hành là gì nếu không một hệ thống hoạt động, điều này không làm cho họ ngu ngốc. Muốn có nút Thoát / Thoát / Tắt làm cho chúng bình thường. Khi bạn rời khỏi một căn phòng bạn tắt đèn, quan trọng hơn là khi bạn rời khỏi ngôi nhà của bạn, bạn khóa cửa và đây là lúc tôi thấy vấn đề với việc không thể thoát khỏi một chương trình đúng cách. Để chương trình sống trong nền là một rủi ro bảo mật lớn.
Squiggles

4
"Tôi nghĩ rằng" Nút thoát "là ngu ngốc". Hầu hết các ứng dụng phần mềm cung cấp một nút thoát.
IgorGanapolsky

Bạn đã nói "// TẠI ĐÂY DỪNG TẤT CẢ CÁC DỊCH VỤ CỦA BẠN" và sau đó sử dụng kết thúc (). Các dịch vụ Android không có phương thức finish (). Họ có unbindService (mConnection);
IgorGanapolsky

@Squiggles Nếu bạn có một căn phòng tự động tắt tất cả đèn và khóa cửa khi bạn rời đi, bạn không cần phải quan tâm đến nó.
Seshu Vinay

7

Vòng đời ứng dụng Android được thiết kế cho người dùng điện thoại di động, không phải người dùng máy tính.

Vòng đời ứng dụng là mô hình đơn giản tàn bạo cần có để biến máy chủ Linux thành thiết bị tiêu dùng.

Android là Java trên Linux, một hệ điều hành máy chủ đa nền tảng thực sự. Đó là cách nó lan truyền rất nhanh. Vòng đời ứng dụng gói gọn thực tế cơ bản của HĐH.

Đối với người dùng di động, các ứng dụng chỉ được cài đặt hoặc không được cài đặt. Không có khái niệm chạy hoặc thoát. Trong thực tế, các quy trình ứng dụng có nghĩa là chạy cho đến khi HĐH giải phóng chúng cho các tài nguyên nắm giữ của chúng.

Vì đây là Stack Overflow, bất kỳ ai đọc đây là người dùng máy tính và phải tắt 90% kiến ​​thức để hiểu vòng đời của ứng dụng di động.


Tôi không theo bước nhảy vọt của bạn để "người dùng máy tính phải tắt 90% kiến ​​thức của họ". Vâng, đó là những gì Romain Guy nói, nhưng điều đó không làm cho nó đúng. Dường như với tôi phần "Tùy chọn nâng cao cho người dùng máy tính", với nút "Thoát", sẽ phục vụ nhu cầu của mọi người.
Don nở

Tôi không biết "Romain Guy" này là ai, hoặc tại sao anh ấy lại trích dẫn tôi. Đóng các tác vụ gần đây sẽ thoát khỏi ứng dụng, cũng như dừng từ thông tin ứng dụng. ADB cho phép truy cập shell cho người dùng nâng cao.
Đaminh Cerisano

6

Tôi mất nhiều thời gian hơn để đọc Q & A này hơn là thực sự thực hiện Vòng đời ứng dụng Android bán đúng.

Đó là một ứng dụng GPS thăm dò điểm và gửi vị trí hiện tại đến dịch vụ web cứ sau vài giây bằng một luồng ... Điều này có thể được thăm dò cứ sau 5 phút trong trường hợp của Ted để cập nhật, sau đó onStop có thể chỉ cần bắt đầu hoạt động cập nhật Ted đã soo lo lắng về việc nếu một người được tìm thấy (Ted không đồng bộ, không mã như lập trình viên Windows hoặc các chương trình của bạn sẽ chạy như chương trình Windows ... eww, điều đó không khó lắm).

Tôi đã thực hiện một số mã ban đầu trong onCreate để thiết lập mọi thứ cho vòng đời hoạt động, bao gồm checkUpdate.start(); :

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

Mã này có thể sai hoàn toàn, nhưng nó hoạt động. Đây là một trong những ứng dụng Android đầu tiên của tôi.

Voilà, một ứng dụng không tiêu thụ CPU khi chạy ở chế độ nền, nhưng ngay lập tức sẵn sàng mở lại vì nó nằm trong RAM (mặc dù không giữ RAM như vòng đời của Android) ... một ứng dụng luôn sẵn sàng, đó là điện thoại , kẻ / cô gái. Nếu một ứng dụng sử dụng hết RAM và hệ điều hành không thể tắt thì điều đó có thể ngừng đổ chuông = P Đó là lý do tại sao HĐH cần có khả năng đóng ứng dụng của bạn khi ở chế độ nền (nếu ứng dụng của bạn không hoạt động Đây không phải là tài nguyên mà nó sẽ không bị đóng BTW), vì vậy hãy viết những ứng dụng tốt hơn.


Bạn không nên gọi super.onStop từ phương thức onPause .. Điều này có vẻ như nó sẽ làm mọi thứ trở nên khó khăn.
Matt Wolfe

1
Sau khi đọc qua 20 câu trả lời triết học mà chỉ né tránh câu hỏi .... +1 để có một số mã.
Pacerier

6

Mỗi khi bạn chuyển sang trang tiếp theo thông qua ý định, hãy sử dụng:

`YourActivityname.this.finish()`;

Thí dụ:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

Để không có hoạt động nào chạy trên nền và khi bạn muốn Thoát ứng dụng của mình, hãy sử dụng:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

Lối thoát này hoạt động như một cơ duyên đối với tôi :)


1
Nó không thoát khỏi ứng dụng thay vào đó là Mainactivity.
Sharath

1
Nhưng hãy cẩn thận - onPause () KHÔNG được gọi trong trường hợp killProcess và System.exit. Chúng tôi đã có một số vấn đề với điều đó.
Pavel Biryukov

4

Trong mọi trường hợp, nếu bạn muốn chấm dứt ứng dụng của mình, bạn luôn có thể gọi System.exit(0);.


5
System.exit()KHÔNG giết ứng dụng của bạn nếu bạn có nhiều hơn một hoạt động trên ngăn xếp. Một nhà phát triển Android sử dụng nó đã không hiểu vòng đời ứng dụng Android cơ bản. Đọc câu trả lời này .
Dheeraj Vepakomma

Giải pháp đầy đủ với System.exit(0); stackoverflow.com/questions/2033914/ từ
Sohail Zahid

2
Trên thực tế, System.exit () không giết ứng dụng của bạn. Tuy nhiên, nếu System.exit () được gọi từ một nơi nào đó ngoài hoạt động chính, android sẽ khởi động lại ứng dụng với một hoạt động ít hơn trên ngăn xếp. Đối với tôi đó có vẻ như là một phản ứng lố bịch đối với System.exit có chủ ý rõ ràng. Ý tôi là, nếu đó là một div0 hoặc một sự cố vô ý nào đó, có lẽ nó sẽ là lịch sự để khởi động lại. Nhưng những thứ đó thậm chí không gây ra tự động khởi chạy lại khi tôi nhớ lại. Nhưng trong mọi trường hợp, các ứng dụng được giết. Nó có thể được khởi động lại, nhưng điều đó không có nghĩa là nó không bị giết.
Jesse Gordon

3

Nếu bạn có 10,20 .. nhiều Hoạt động đang chạy và bạn muốn hoàn thành tất cả chúng và thoát khỏi hệ thống.

Tạo một mảng tĩnh trong application classhoặcconstants class.

Hằng số

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity Thêm tham chiếu hoạt động hiện tại trong mảng này

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}

1
Điều này có thể làm sập ứng dụng của bạn khi người dùng nhấn nút hai lần, đặc biệt là khi hệ thống đang tải nặng vì bất kỳ lý do gì. Điều này có thể được ngăn chặn bằng cách loại bỏ các hoạt động từ mảng.
Hy vọng hữu ích
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.