응용 프로그램을 종료하는 것은 눈살을 찌푸리고 있습니까? 활동 라이프 사이클 (특히 onPause

Android를 배우려는 시도 에서 다음을 읽었습니다 .

질문: 메뉴 옵션을 종료하지 않으면 사용자가 응용 프로그램을 종료 할 수 있습니까? 그러한 옵션이 없으면 사용자는 어떻게 응용 프로그램을 종료합니까?

답변 : (Romain Guy) : 사용자는 그렇지 않습니다. 시스템은 이것을 자동으로 처리합니다. 그것이 활동 라이프 사이클 (특히 onPause / onStop / onDestroy)의 목적입니다. 무엇을 하든지 “종료”또는 “종료”응용 프로그램 단추를 넣지 마십시오. 안드로이드의 응용 프로그램 모델에는 쓸모가 없습니다. 이것은 또한 핵심 응용 프로그램의 작동 방식과 상반됩니다.

Hehe, 내가 안드로이드 세계에서 취한 모든 단계에 대해 일종의 문제가 발생합니다 = (

분명히 Android에서 응용 프로그램을 종료 할 수는 없지만 Android 시스템은 느낌이들 때마다 앱을 완전히 파괴 할 수 있습니다. 무슨 일이야? “일반 앱”으로 기능하는 앱을 작성하는 것이 불가능하다고 생각하기 시작했습니다. 사용자가 앱을 종료하기로 결정할 때 앱을 종료 할 수 있습니다. 그것은 OS가해야 할 일이 아닙니다.

내가 만들려고하는 응용 프로그램은 Android 마켓 용 응용 프로그램이 아닙니다. 일반인의 “광범위한 사용”용 응용 프로그램이 아니며, 매우 좁은 비즈니스 분야에서 사용되는 비즈니스 응용 프로그램입니다.

실제로 Android 플랫폼 개발은 Windows Mobile 및 .NET에 존재하는 많은 문제를 해결하기 때문에 실제로 기대했습니다. 그러나 지난주에 다소 나빴습니다 … 안드로이드를 포기할 필요는 없지만 지금은 그다지 좋지 않습니다 = (

응용 프로그램 을 실제로 종료 할 수있는 방법이 있습니까?



답변

이것은 결국 귀하의 질문에 도달 할 것이지만, 먼저이 글을 쓰는 시점에 이미 제공된 다양한 답변에 대한 다양한 의견에서 제기 한 많은 문제를 다루고 싶습니다. 나는 당신의 마음을 바꿀 생각이 없습니다. 차라리 미래에이 글을 읽게 될 다른 사람들을위한 것입니다.

요점은 안드로이드가 앱 종료 시점을 결정할 수 없다는 것입니다. 그것은 반드시 사용자의 선택이어야합니다.

수백만의 사람들이 환경이 필요에 따라 애플리케이션을 닫는 모델에 완전히 만족합니다. 이러한 사용자는 단순히 웹 페이지를 “종료”하거나 온도 조절기를 “종료”하는 것 이상으로 Android 앱을 “종료”하는 것에 대해 생각하지 않습니다.

iPhone 사용자는 iPhone 버튼을 누르는 것이 앱이 종료 된 것처럼 느껴질 필요는 없다는 점에서 거의 동일합니다. 왜냐하면 많은 iPhone 앱은 앱이 실제로 종료 된 경우에도 사용자가 중단 한 위치를 선택하기 때문입니다 (iPhone 만 현재 한 번에 하나의 타사 앱을 허용합니다).

위에서 말했듯이 내 앱에는 많은 일이 있습니다 (데이터는 장치에 푸시되고 항상 있어야하는 작업 목록 등).

“항상 있어야하는 작업 목록”이란 무엇을 의미하는지 모르겠지만 “데이터를 장치에 푸시하는”것은 쾌적한 소설이며 어떤 경우에도 활동으로 수행해서는 안됩니다. 을 통해 예약 된 작업을 사용하여 AlarmManager최대의 안정성을 위해 데이터를 업데이트하십시오.

Google 사용자는 전화를 걸고 전화를받을 때마다 Android에서 앱을 종료하기로 결정하고 로그인 할 수 없습니다.

이를 다루는 많은 iPhone 및 Android 응용 프로그램이 있습니다. 일반적으로 사용자가 매번 수동으로 로그인하지 않고 로그온 자격 증명을 보유하기 때문입니다.

예를 들어, 응용 프로그램을 종료 할 때 업데이트를 확인하려고합니다

그것은 모든 운영 체제에서 실수입니다. 아시다시피, 응용 프로그램이 “종료”되는 이유는 OS가 종료되고 업데이트 프로세스가 중간에 실패하기 때문입니다. 일반적으로 이것은 좋지 않습니다. 시작시 업데이트를 확인하거나 예약 된 작업을 통해 완전히 비동기식으로 업데이트를 확인하고 종료하지 마십시오.

일부 의견은 뒤로 버튼을 눌러도 앱이 전혀 종료되지 않는다고 제안합니다 (위의 질문에서 링크 참조).

BACK 버튼을 눌러도 “앱이 종료되지 않습니다”. 사용자가 BACK 버튼을 눌렀을 때 화면에 표시된 작업을 마칩니다.

사용자가 종료하고 싶을 때만 종료해야합니다. 안드로이드에서와 같이 동작하는 앱을 작성할 수 없다면, 안드로이드를 실제 앱을 작성하는 데 사용할 수 없다고 생각합니다 = (

그러면 웹 애플리케이션도 마찬가지입니다. 또는 모델을 올바르게 이해하면 WebOS (아직 게임 할 기회가 없었습니다). 이 모든 것에서 사용자는 아무것도 “종료”하지 않고 그냥 떠납니다. iPhone은 현재 한 번에 한 가지만 실행할 수 있다는 점에서 약간 다릅니다 (몇 가지 예외 제외).

응용 프로그램을 실제로 종료 할 수있는 방법이 있습니까?

다른 사람들이 말했듯이 BACK을 통해 사용자 또는을 통해 코드를 통해 finish()현재 실행중인 활동을 닫을 수 있습니다. 사용자는 일반적으로 웹 응용 프로그램을 사용하기 위해 “종료”옵션이 필요한 것보다 적절하게 작성된 응용 프로그램에 대해 다른 것을 필요로하지 않습니다.


정의상 두 응용 프로그램 환경이 동일하지 않습니다. 즉, 새로운 환경이 생겨나 고 다른 환경이 묻히면 환경의 트렌드를 볼 수 있습니다.

예를 들어 “파일”개념을 제거하려는 움직임이 커지고 있습니다. 대부분의 웹 응용 프로그램은 사용자가 파일을 생각하도록 강요하지 않습니다. iPhone 앱은 일반적으로 사용자가 파일을 생각하도록 강요하지 않습니다. Android 앱은 일반적으로 사용자가 파일을 생각하도록 강요하지 않습니다. 등등.

마찬가지로 앱을 “종료”한다는 개념을 제거하려는 움직임이 커지고 있습니다. 대부분의 웹 응용 프로그램에서는 사용자가 강제로 로그 아웃하지 않고 일정 시간 동안 사용하지 않으면 암시 적으로 사용자를 로그 아웃합니다. 안드로이드와 마찬가지로 아이폰과 웹 OS도 마찬가지다.

이를 위해서는 비즈니스 목표에 중점을두고 이전 애플리케이션 환경과 연계 된 구현 모델을 고수하지 않고 애플리케이션 설계에 더욱 중점을 둡니다. 이를 수행 할 시간이나 성향이없는 개발자는 기존의 정신 모델을 깨뜨리는 새로운 환경에 좌절 할 것입니다. 이것은 어느 환경의 결점도 아닙니다. 그 이상의 폭풍이 산을 통과하는 것이 아니라 산의 결점 이상입니다.

예를 들어 Hypercard 및 Smalltalk와 같은 일부 개발 환경에서는 응용 프로그램과 개발 도구가 하나의 설정으로 통합되었습니다. 이 개념은, 예를 들어 (응용 프로그램에, 많은 언어 확장의 외부를 잡을하지 않았다 VBA를엑셀 , AutoCAD에서 리스프 ). 따라서 앱 자체에 개발 도구가 있다고 가정 한 정신 모델을 개발 한 개발자는 모델을 변경하거나 모델이 적용되는 환경으로 제한해야했습니다.

당신이 쓸 때 :

내가 발견 한 다른 지저분한 것들과 함께 Android 용 앱 개발이 일어나지 않을 것이라고 생각합니다.

그것은 당신을 위해 지금 당장 최고인 것처럼 보일 것입니다. 마찬가지로, Android에서보고 한 동일한 문제 중 일부는 웹 응용 프로그램에서도 발견 될 수 있으므로 (예 : “종료”없음) 응용 프로그램을 웹에 이식하려고 시도하지 말라고 조언합니다. 또는, 반대로, 언젠가 경우 어떻게 포트 웹에 응용 프로그램을, 당신은 웹 응용 프로그램의 흐름이 안드로이드에 대한 더 적합하다는 사실을 발견 할 수있다, 당신은 그 시간에 안드로이드 포트를 다시 방문 할 수 있습니다.


답변

이 스레드의 미래 독자를 위해 여기에 수정 사항을 추가하고 싶습니다. 이 특별한 뉘앙스는 오랫동안 내 이해를 벗어 났으므로 아무도 같은 실수를 저 지르지 않기를 원합니다.

System.exit()스택에 둘 이상의 활동이있는 경우 앱을 종료하지 않습니다. 실제로 발생하는 일은 프로세스가 종료 되고 스택에서 하나의 적은 활동으로 즉시 재시작 됩니다. 이는 강제 종료 대화 상자에서 앱을 종료하거나 DDMS에서 프로세스를 종료하려고 할 때도 발생합니다. 이것은 내 지식에 완전히 문서화되어 있지 않은 사실입니다.

짧은 대답은 응용 프로그램을 종료하려면 스택의 모든 활동과 finish()사용자가 종료하려고 할 때 모든 활동을 추적해야한다는 것입니다 (그리고 활동 스택을 반복 할 수있는 방법이 없습니다) 따라서이 모든 것을 직접 관리해야합니다.) 이것조차도 실제로 프로세스 또는 매달려있는 참조를 죽이지는 않습니다. 단순히 활동을 마칩니다. 또한 Process.killProcess(Process.myPid())더 잘 작동 하는지 잘 모르겠습니다 . 나는 그것을 테스트하지 않았습니다.

반면에 스택에 활동이 남아있는 것이 괜찮다면 작업을 쉽게 수행 할 수있는 또 다른 방법이 있습니다. Activity.moveTaskToBack(true)프로세스를 배경으로하고 홈 화면을 표시합니다.

긴 대답은이 행동의 배경이되는 철학에 대한 설명입니다. 이 철학은 다음과 같은 여러 가정에서 나옵니다.

  1. 우선, 이것은 앱이 포 그라운드에있을 때만 발생합니다. 백그라운드에 있으면 프로세스가 정상적으로 종료됩니다. 그러나 포 그라운드에있는 경우 OS는 사용자가 수행 한 작업을 계속 수행하려고한다고 가정합니다. (DDMS에서 프로세스를 종료하려는 경우 먼저 홈 단추를 누른 다음 종료해야합니다)
  2. 또한 각 활동이 다른 모든 활동과 독립적이라고 가정합니다. 예를 들어 앱이 브라우저 활동을 시작하는 경우가 종종 있는데, 이는 완전히 별개이며 사용자가 작성하지 않은 것입니다. 브라우저 활동은 매니페스트 속성에 따라 동일한 작업에서 생성되거나 생성되지 않을 수 있습니다.
  3. 각 활동이 완전히 자립적이며 잠시 후에 종료 / 복원 될 수 있다고 가정합니다. (내 앱에는 많은 양의 캐시 된 데이터에 의존하는 활동이 많기 때문에 너무 직렬화하기에는 너무 크지 onSaveInstanceState만 그래야 할 것입니까?) 대부분 잘 작성된 Android 앱의 경우, 앱이 백그라운드에서 언제 종료되는지 알 수 없기 때문입니다.
  4. 마지막 요인은 많은 가정이 아니라 OS의 한계입니다 . 앱을 명시 적으로 종료하는 것은 앱 충돌과 동일하며 메모리를 확보하기 위해 앱을 종료하는 Android와 동일합니다. 안드로이드는 앱이 종료되었거나 백그라운드에서 종료되었는지 알 수 없기 때문에 사용자가 중단 한 곳으로 돌아 가기를 원한다고 가정하므로 ActivityManager가 프로세스를 다시 시작합니다.

당신이 그것에 대해 생각할 때, 이것은 플랫폼에 적합합니다. 첫째, 이것은 프로세스가 백그라운드에서 종료되고 사용자가 프로세스로 돌아 왔을 때 발생하는 것과 정확히 일치하므로 중단 된 위치에서 다시 시작해야합니다. 둘째, 이것은 앱이 충돌하고 무서운 강제 종료 대화 상자를 표시 할 때 발생합니다.

사용자가 사진을 찍고 업로드 할 수 있기를 원한다고 가정 해 보겠습니다. 활동에서 카메라 활동을 시작하고 이미지를 반환하도록 요청합니다. 카메라는 자신의 작업으로 생성되지 않고 현재 작업의 상단으로 푸시됩니다. 카메라에 오류가 발생하여 충돌이 발생하면 전체 앱이 중단됩니까? 사용자의 입장에서는 카메라 만 실패했으며 이전 활동으로 돌아와야합니다. 따라서 스택에서 동일한 활동을 모두 빼고 카메라를 빼고 프로세스를 다시 시작합니다. 활동 모자를 쓰러 뜨리면 죽이고 회복 될 수 있도록 설계 되어야 하므로 문제가되지 않습니다. 불행히도 모든 앱을 그런 식으로 디자인 할 수있는 것은 아니므로 것입니다Romain Guy 또는 다른 사람이 말한 것에 관계없이 많은 사람들에게 문제가됩니다. 따라서 해결 방법을 사용해야합니다.

따라서 닫는 조언 :

  • 프로세스를 죽이려고하지 마십시오. 어느 전화 finish()의 모든 활동이나 통화 moveTaskToBack(true).
  • 프로세스가 충돌하거나 종료되면 나와 같이 메모리에 있던 데이터가 필요하면 현재 손실 된 데이터가 필요한 경우 루트 활동으로 돌아 가야합니다. 이렇게하려면 플래그 startActivity()가 포함 된 인 텐트로 호출해야합니다 Intent.FLAG_ACTIVITY_CLEAR_TOP.
  • Eclipse DDMS 관점에서 앱을 종료하려면 포 그라운드에 있지 않은 것이 좋거나 자체적으로 다시 시작됩니다. 먼저 홈 버튼을 누른 다음 프로세스를 종료해야합니다.

답변

모든 응용 프로그램에는 종료 버튼이 있습니다 … 그리고 나는 그 때문에 사용자로부터 긍정적 인 의견을 얻습니다. 플랫폼이 응용 프로그램에 필요하지 않은 방식으로 설계되었는지는 중요하지 않습니다. “그것을 거기에 두지 마십시오”라고 말하는 것은 우스운 일입니다. 사용자가 종료하고 싶다면 … 그들에게 정확하게 그렇게 할 수있는 액세스 권한을 제공하십시오. 나는 그것이 안드로이드가 전혀 작동하는 방식을 감소시키지 않으며 좋은 습관처럼 보인다고 생각하지 않습니다. 나는 라이프 사이클을 이해합니다 … 그리고 내 관찰은 안드로이드가 그것을 잘 처리하지 못한다는 것입니다 …. 그것은 기본 사실입니다.


답변

응용 프로그램을 단일 응용 프로그램으로 생각하지 마십시오. 사용자가 ‘애플리케이션’및 Android 서비스를 통해 제공되는 ‘기능’과 상호 작용할 수있는 UI 화면 세트입니다.

당신의 신비한 앱이 무엇을하는지 모르는 것은 실제로 중요하지 않습니다. 보안 성이 뛰어난 회사 인트라넷으로 터널링하여 모니터링 또는 상호 작용을 수행하고 사용자가 “응용 프로그램을 종료”할 때까지 로그인 상태를 유지한다고 가정 해 봅시다. IT 부서에서 명령을하기 때문에 사용자는 인트라넷의 IN 또는 OUT에 대해 매우주의해야합니다. 따라서 사용자가 “종료”하는 것이 중요하다는 사고 방식.

이것은 간단합니다. 알림 표시 줄에 “인트라넷에 있거나 실행 중”이라는 알림을 표시하는 서비스를 만드십시오. 해당 서비스가 응용 프로그램에 필요한 모든 기능을 수행하도록하십시오. 사용자가 “응용 프로그램”과 상호 작용하는 데 필요한 UI 비트에 액세스 할 수 있도록 해당 서비스에 바인딩 된 활동이 있어야합니다. 그리고 서비스를 종료하도록 알리고 활동 자체를 닫는 Android 메뉴-> 종료 (또는 로그 아웃 또는 기타) 버튼이 있습니다.

이것은 모든 의도와 목적을 위해 정확히 당신이 원하는 것을 말합니다. 안드로이드 방식을 완료했습니다. 이 “종료”의 예는 Google 토크 또는 Google지도 내비게이션을 참조하십시오. 유일한 차이점은 활동에서 뒤로 단추를 누르면 사용자가 응용 프로그램을 부활시키려는 경우를 대비하여 UNIX 프로세스가 대기 상태에있게 될 수 있다는 것입니다. 이것은 실제로 최근에 액세스 한 파일을 메모리에 캐시하는 최신 운영 체제와 다르지 않습니다. Windows 프로그램을 종료 한 후에는 필요한 리소스가 여전히 메모리에 있으며 더 이상 필요하지 않은 다른 리소스로 대체되기를 기다리는 중입니다. 안드로이드도 마찬가지입니다.

나는 정말로 당신의 문제를 보지 못합니다.


답변

이것은 많은 전문가들이 참여하는 흥미롭고 통찰력있는 토론입니다. 이 게시물은 Android 개발 기본 웹 사이트에서 다시 돌아 가야한다고 생각합니다 .Android OS의 핵심 디자인 중 하나를 중심으로하기 때문입니다.

또한 여기에 2 센트를 추가하고 싶습니다.

지금까지 라이프 사이클 이벤트를 처리하는 Android의 방식에 감명을 받아 웹과 같은 경험 개념을 기본 앱에 적용했습니다.

나는 여전히 Quit버튼 이 있어야한다고 믿는다 . 왜? … 나나 Ted 또는 여기에 기술 전문가가 아니라 최종 사용자 요구를 충족시키기위한 목적으로 만 사용됩니다.

나는 Windows의 열렬한 팬은 아니지만 오래 전부터 대부분의 최종 사용자가 (X 버튼)에 익숙한 개념을 소개했습니다 … ” ‘내가 원할 때 위젯 실행을 종료하고 싶습니다”.

그것은 누군가 (OS, 개발자?)가 자신의 재량에 따라 그것을 처리한다는 것을 의미하지는 않습니다. 단지 “내가 익숙한 Red X 버튼은 어디에 있습니까”를 의미합니다. 내 행동은 ‘버튼을 누르면 전화를 끊는 것’, ‘버튼을 누르면 장치를 끄는 것’등과 유사해야합니다 … 등 인식입니다. 내 행동이 실제로 그 목적을 달성한다는 것은 만족스러운 결과를 가져옵니다.

개발자가 여기에 제시된 제안을 사용하여이 동작을 스푸핑 할 수는 있지만 여전히 인식은 여전히 ​​남아 있습니다. 즉, 최종 사용자의 요구에 따라 독립적이고 신뢰할 수 있고 중립적 인 소스 (OS)에 의해 애플리케이션이 기능을 완전히 중단해야합니다 (현재).


답변

당신은 할 수 가압에 의해 중, 종료 Back버튼 또는 호출하여 finish()당신에 Activity. 명시 적으로 종료하려면 finish()a에서 전화 MenuItem하십시오.

Romain은 할 수 없다고 말하지 않고 단지 무의미하다고 말합니다. 사용자는 응용 프로그램 수명주기가 작동하는 방식에 따라 자동으로 저장하고 저장하는 스마트 소프트웨어를 작성하도록 장려하므로 작업을 종료하거나 저장하는 데 신경 쓸 필요가 없습니다. 어떤 일이 있어도 상태를 복원합니다.


답변

이 토론은 개발자가 가장 잘 알고 있는지 또는 사용자가 가장 잘 알고 있는지에 대한 오래된 질문으로 요약됩니다. 모든 인적 요소 영역의 전문 디자이너가 매일이 문제로 어려움을 겪고 있습니다.

Ted는 마켓에서 가장 많이 다운로드 된 앱 중 하나가 ‘App Killer’라고 지적했습니다. 사람들은 응용 프로그램을 종료 할 때 약간의 세로토닌을 얻습니다. 그들은 데스크탑 / 랩톱에 익숙합니다. 물건을 빠르게 움직입니다. 프로세서를 식히고 팬이 켜지지 않도록합니다. 적은 전력을 사용합니다.

모바일 장치가 훨씬 작은 선박이라고 생각하면 ‘더 이상 필요없는 것을 배 밖으로 던지다’는 인센티브에 특히 감사 할 수 있습니다. 이제 Android 개발자는 OS가 가장 잘 알고 있고 앱을 종료하는 것이 골동품이라고 생각했습니다. 나는 진심으로 이것을 지원합니다.

그러나 좌절감이 자신의 무지에서 벗어나더라도 사용자를 좌절시키지 않아야한다고 생각합니다. 그 때문에 ‘종료’옵션을 사용하는 것이보기를 닫는 것 이상을 수행하지 않는 위약 버튼 인 경우에도 좋은 디자인이라고 결론을 내 렸습니다.