android 안드로이드 응용 프로그램을 쫓아 내고 있습니까?




구글 안드로이드 (24)

Android 애플리케이션 라이프 사이클은 컴퓨터 사용자가 아닌 휴대 전화 사용자를 위해 설계되었습니다.

앱 수명주기는 Linux 서버를 소비자 어플라이언스로 바꾸는 데 필요한 잔인하게 단순한 패러다임입니다.

안드로이드는 실제 플랫폼 간 서버 OS 인 Linux over Java입니다. 그것이 그렇게 빨리 퍼지는 방법입니다. 앱 라이프 사이클은 OS의 기본 현실을 캡슐화합니다.

모바일 사용자에게는 앱이 설치되었거나 설치되지 않았습니다. 실행 또는 종료의 개념은 없습니다. 사실, app 프로세스는 운영체제가 보유한 리소스를 위해 OS를 릴리스 할 때까지 실행됩니다.

스택 오버플로이므로이 내용을 읽는 사람은 컴퓨터 사용자이므로 모바일 앱 수명주기를 이해하려면 지식의 90 %를 꺼야합니다.

안드로이드를 배우려고 시도하면서 계속 전진 해 다음과 같이 읽었습니다 .

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

답 : (Romain Guy) : 사용자가 자동으로 처리하지 않습니다. 이것이 활동 라이프 사이클 (특히 onPause / onStop / onDestroy)의 목적입니다. 당신이 무엇을 하든지, "quit"또는 "exit"application button을 넣지 마십시오. Android의 애플리케이션 모델에서는 쓸모가 없습니다. 이는 또한 핵심 응용 프로그램의 작동 방식과 상반됩니다.

Hehe, 내가 안드로이드 세계에 걸릴 모든 단계마다 나는 어떤 종류의 문제에 빠진다 = (

분명히 Android에서 애플리케이션을 종료 할 수는 없습니다 (하지만 안드로이드 시스템은 느낄 때마다 앱을 완전히 파괴 할 수 있습니다). 그게 뭐야? 나는 "정상적인 앱"으로 기능하는 앱을 작성하는 것이 불가능하다고 생각하기 시작했습니다. 사용자가 앱을 종료 할 때 그 앱을 종료 할 수 있다는 것입니다. 그것은 OS에 의존해야하는 것이 아닙니다.

내가 만들려고하는 응용 프로그램은 Android 마켓 용 응용 프로그램이 아닙니다. 그것은 일반 대중이 "폭넓게"사용할 수있는 응용 프로그램이 아니며 매우 좁은 비즈니스 분야에서 사용되는 비즈니스 응용 프로그램입니다.

Windows Mobile 및 .NET에 존재하는 많은 문제를 해결하기 때문에 Android 플랫폼을 실제로 개발할 것을 고대하고있었습니다. 그러나 지난 주에 나에게 다소 방해가되었습니다 ... 안드로이드를 버릴 필요는 없지만 지금은별로 좋아 보이지 않습니다. = (

신청서를 정말로 종료 할 수있는 방법이 있습니까?


나는이 스레드의 미래 독자를 위해 여기에 수정을 추가하고 싶습니다. 이 특별한 뉘앙스가 내 이해를 오랫동안 벗어 났으므로 여러분 중 누구도 똑같은 실수를하지 않도록하고 싶습니다.

스택에 둘 이상의 활동이있는 경우 System.exit() 이 응용 프로그램을 종료하지 않습니다. 실제로 일어나는 일은 프로세스가 강제 종료되고 스택에서 한 번 적은 활동으로 즉시 재시작 된다는 입니다. Force Close 대화 상자를 통해 앱이 종료되거나 DDMS에서 프로세스를 종료하려고 할 때도 마찬가지입니다. 이것은 내가 아는 바에 따라 완전히 서류 미비 된 사실입니다.

간단히 말해서, 애플리케이션을 종료하려면 스택의 모든 활동을 추적하고 finish() 할 때 모든 작업을 finish() 해야합니다 (아니요, 반복 할 방법이 없습니다). 액티비티 스택이므로 모든 것을 직접 관리해야합니다. 심지어 이것이 실제로 프로세스 또는 사용자가 가질 수있는 매달린 참조를 죽이지는 않습니다. 단순히 활동을 끝내기 만하면됩니다. 또한, Process.killProcess(Process.myPid()) 가 더 잘 작동하는지 확실하지 않습니다. 나는 그것을 시험하지 않았다.

반면에 스택에 액티비티를 남겨 두는 것이 좋다면, Activity.moveTaskToBack(true) 는 프로세스를 배경으로하고 홈 화면을 표시하기 만하면됩니다.

긴 대답은이 행동 뒤에있는 철학에 대한 설명을 포함합니다. 이 철학은 여러 가지 가정에서 태어났다.

  1. 우선, 앱이 포 그라운드에있는 경우에만 발생합니다. 백그라운드에 있다면 프로세스가 정상적으로 종료됩니다. 그러나 포 그라운드에있는 경우 운영 체제는 사용자가 수행중인 작업을 계속 수행하려고한다고 가정합니다. (DDMS에서 프로세스를 종료하려는 경우 먼저 홈 단추를 누르고 죽여야합니다.)
  2. 또한 각 활동이 다른 모든 활동과 독립적이라고 가정합니다. 예를 들어 앱이 브라우저 활동을 시작한 경우 (예 : 완전히 분리되어 나와 작성되지 않은 경우)는 종종 사실입니다. 브라우저 활동은 매니페스트 특성에 따라 동일한 작업에서 생성되거나 생성되지 않을 수 있습니다.
  3. 귀하의 활동이 완전히 자립적이며 잠시 통고로 살해 / 복구 될 수 있다고 가정합니다. (오히려 onSaveInstanceState 동안 효율적으로 직렬화하기에는 너무 많은 캐시 된 데이터에 의존하는 많은 활동이 내 앱에 있기 때문에이 특정 가정을 싫어합니다.하지만 대부분 잘 작성된 Android 앱의 경우 사실이어야합니다. 왜냐하면 당신의 앱이 백그라운드에서 언제 죽게 될지 결코 알 수 없기 때문이다.
  4. 마지막 요소는 많은 가정이 아니라 오히려 OS의 한계입니다 . 앱을 명시 적으로 종료하는 것은 앱이 손상되는 것과 동일하며, Android가 메모리를 회수하기 위해 앱을 종료하는 것과 동일합니다. 앱이 종료되거나 추락했는지 여부를 안드로이드가 알 수 없기 때문에 사용자가 중단 한 부분을 반환하기를 원한다고 가정하기 때문에 ActivityManager가 프로세스를 다시 시작합니다.

생각할 때 이것은 플랫폼에 적합합니다. 첫째, 이것은 백그라운드에서 프로세스가 종료되고 사용자가 다시 돌아 왔을 때 발생하는 상황입니다. 따라서 중단 된 위치에서 다시 시작해야합니다. 둘째, 앱이 충돌하고 두려운 강제 닫기 대화 상자를 표시 할 때 발생합니다.

내 사용자가 사진을 찍어 업로드 할 수 있기를 바랍니다. 내 활동에서 Camera Activity를 실행하고 이미지를 반환하도록 요청합니다. 카메라가 현재 작업의 상단에 푸시됩니다 (자체 작업에서 생성되는 것이 아니라). 카메라에 오류가 발생하여 충돌이 발생하면 전체 응용 프로그램이 손상 될 수 있습니까? 사용자 입장에서는 카메라 만 실패하고 이전 활동으로 되돌려 야합니다. 따라서 스택에서 카메라를 제외한 모든 동일한 활동으로 프로세스를 다시 시작하기 만하면됩니다. 귀하의 활동 모자 한 방울에서 살해되고 복원 될 수 있도록 설계 되어야 하므로 문제가되지 않아야합니다. 불행히도, 모든 앱이 그런 식으로 디자인 될 수있는 것은 아니므로, Romain Guy 또는 다른 누구에게도 알려지지 않아도 많은 사람들이 문제가됩니다. 따라서 우리는 대안을 사용해야합니다.

그래서, 나의 마지막 조언 :

  • 그 과정을 죽이려고하지 마십시오. 모든 액티비티에 대해 finish() 를 호출하거나 moveTaskToBack(true) 호출 moveTaskToBack(true) .
  • 프로세스가 충돌하거나 죽게되면, 나처럼 현재 메모리에 있던 데이터가 필요하면 루트 작업으로 돌아 가야합니다. 이렇게하려면 Intent.FLAG_ACTIVITY_CLEAR_TOP 플래그가 포함 된 Intent와 함께 startActivity() 를 호출해야합니다.
  • Eclipse DDMS 관점에서 앱을 종료하려면 포 그라운드에 있지 않는 것이 좋으며, 그렇지 않으면 스스로 다시 시작됩니다. 먼저 홈 단추를 누른 다음 프로세스를 종료해야합니다.

음 ...

나는 당신이 안드로이드 애플 리케이션을 올바른 방법으로 보지 못한다고 생각한다. 원하는 것을 쉽게 할 수 있습니다.

  • 개발자의 라이브 사이클 문서에서 권장하는 것처럼 앱 활동이 상태를 저장 / 복원합니까?

  • 복원 단계에서 일부 로그인이 필요한 경우 (사용 가능한 로그인 / 세션 정보가 없음) 그런 다음 수행하십시오.

  • 결국 버튼 / 메뉴 / 타임 아웃을 추가 finish()하면 로그인 및 기타 세션 정보를 저장하지 않고 암시 적으로 앱 세션이 종료됩니다. 따라서 앱이 시작 / 다시 시작되면 새로운 세션이 시작됩니다.

그렇게하면 앱이 실제로 메모리에서 제거되는지 아닌지 신경 쓰지 않아도됩니다.

당신이 정말로 메모리에서 제거하려면 (이 어떤 목적을 위해 BTW 낙담하고있다?) 당신의 말에 조건을 죽일 수 onDestroy()java.lang.System.exit(0)(혹은 restartPackage(..)?). 물론 앱이 실제로 onDestroy()정상적으로 종료되기를 원하는 경우에만 수행하십시오. 앱 의 정상적인 라이프 사이클의 일부이며 앱의 종료가 아니기 때문 입니다.


답 : (Romain Guy) : 사용자가 자동으로 처리하지 않습니다. 이것이 활동 라이프 사이클 (특히 onPause / onStop / onDestroy)의 목적입니다. 당신이 무엇을 하든지, "quit"또는 "exit"application button을 넣지 마십시오. Android의 애플리케이션 모델에서는 쓸모가 없습니다. 이는 또한 핵심 응용 프로그램의 작동 방식과 상반됩니다.

1 : 응용 프로그램을 완전히 종료하면 일반적으로 문제가 발생할 수 있지만 쓸모가 없습니다. 창문에 출구 옵션이 없다면 어떨까요? 시스템은 메모리가 꽉 차서 OS가 느려졌을 것이며 운영 체제는 어떤 프로그램을 사용했는지 추측해야했습니다. Romain Guy 나 심지어 Larry Page와 Sergey Brin이 말하는 것은 신경 쓰지 않습니다. 이것은 의심 할 여지가없는 사실입니다. 새로운 앱을 시작하기 전에 작업을 죽여야 만 시스템이 느려질 수 있습니다. 앱을 죽일 시간이 없다고 말할 수는 없습니다. 먼 별에서조차 빛이 ... 시간이 걸릴 것입니다 사용자에게 완전히 가까운 애플 리케이션을 수 있도록 몇 가지 사용.

2 : 핵심 애플리케이션의 작동 방식과 반대? 그게 무슨 뜻이야? 지금 앱을 끝내면 더 이상 일을하지 않습니다 ... 메모리가 필요할 때 OS에 의해 죽기를 기다리고 있습니다.

요약하자면, 최소화와 종료 사이에는 뚜렷한 차이가 있으며, 다른 핀치는 잘 맞지 않습니다. 모든 나사에 스크루 드라이버를 남겨 두는가? 아니면 모든 문에 열쇠? 차단기가 끊어지고 다른 기기를 켜야 할 때까지 모든 기기를 높은 상태로 유지합니까? 우리는 접시 세탁기를 접시들로 가득 채우고, 매번 새로운 것을 더러운 것들을위한 공간을 만들기에 충분할 때만 꺼내 주나요? 우리는 모든 차가 차도에서 달릴 때까지 - 오 절대 신경 쓰지 마세요.

사용자가 앱을 최소화하려는 경우 가장 좋은 방법은 앱을 최소화하는 것입니다. 사용자가 앱을 종료하려는 경우 반드시 종료하는 것이 가장 좋습니다.

눈살을 찌푸 리니? 그것은 안드로이드의 관점이다. 그리고 많은 독립적 인 신인 안드로이드 개발자들이 눈살을 찌푸 리고 있습니다.

그러나 바로 여기까지 올 때 좋은 코딩과 나쁜 코딩이 있습니다. 좋은 프로그램 흐름 모델이 있고 나쁜 프로그램 흐름 모델이 있습니다.

사용자가 프로그램을 마쳤다는 것을 알 때 프로그램을 메모리에 남겨 두는 것은 좋은 프로그램 흐름이 아닙니다. 그것은 전혀 목적이 없으며 새로운 앱을 시작하거나 앱을 실행하면 더 많은 메모리를 할당 할 때 작업 속도가 느려집니다.

그것은 마치 차를 좋아하는 것과 같습니다 : 정지 신호등에서 멈추거나 패스트 푸드 드라이브를 통과하거나 ATM에서 멈추는 등의 달리기를하는 경우가 있습니다. 그러나 일을 할 때나 식료품 점이나 집에서와 같이 다른 상황을 차단해야하는 경우가 있습니다.

마찬가지로 게임을하고 전화벨이 울린다면 그렇습니다. 게임을 일시 중지하고 계속 실행하십시오. 그러나 사용자가 잠시 동안 게임을 마친 후에는 반드시 모두 나가게하십시오.

일부 애플리케이션의 이탈 버튼은 다른 애플리케이션보다 앞에 있어야합니다. 예를 들어 게임이나 사용자가 완전히 나가기를 원하는 프로그램은 명백한 이탈이 있어야합니다. 다른 프로그램, 예를 들어, 이메일 프로그램을 종료 할 가능성이 희박하므로 (전자 메일을 계속 확인할 수 있도록) 이러한 프로그램은 종료 옵션을 사용하여 주요한 제어 입력 화면 공간을 낭비하지 않아야하지만 좋은 프로그램 흐름을 위해서는 이탈 옵션이 있어야합니다. 누군가가 자신의 메일 프로그램이 서비스 지역이 불량하거나 Skype 통화 또는 다른 어떤 곳에서 이메일을 확인하고 싶지 않다고 결정하면 어떻게해야합니까? 원하는 경우 이메일 프로그램을 종료하십시오!

일시 중지 및 종료는 두 가지 중요한 작업이며 둘 다 중요한 역할을 수행하지 못합니다.


블로그 게시물 Android 앱에 종료 버튼을 포함해야하는 경우 (힌트 : 절대로) 내가 할 수있는 것보다 훨씬 더 나은 설명입니다. 모든 안드로이드 개발자가 이미 읽었 으면 좋겠습니다.

발췌 :

내 경험에 따르면 사용자가 정말로 원하는 것은 다음과 같습니다. 앱이 리소스 (배터리, CPU주기, 데이터 전송 등)를 소비하지 않도록 보장하는 분명한 방법입니다.

많은 사용자는 이탈 버튼이이 요구 사항을 구현하고 추가해야한다고 요구합니다. 사용자를 기쁘시게하려는 개발자는 의무적으로 개발자를 추가합니다. 그 직후 그들은 둘 다 실패합니다.

  • 대부분의 경우 exit 버튼은 단순히 Activity.finish() 를 호출합니다. 이것은 뒤로 버튼을 치는 것과 정확히 같습니다. 정확하게. 서비스는 계속 실행되며 폴링은 계속 발생합니다. 사용자는 앱을 죽였다고 생각할 수 있지만 그렇지 않은 경우 곧 더 괴롭습니다.
  • 이탈 동작이 모호합니다. 종료 단추로 활동을 닫아야합니까? 아니면 관련된 모든 서비스, 수신기 및 경보도 중지해야합니까? 뒤로 해야 할 일은 무엇입니까? 그들이 대신 집에 타면 어떻게 될까요?앱에 위젯이 있으면 어떻게됩니까? 나가기 버튼이 업데이트를 중지해야합니까?

해결 방법은 이탈 버튼을 예상대로 뒤로 버튼을 동작시키는 것입니다. 더 나아가 앱이 보이지 않을 때마다 리소스 사용을 중단하십시오.

가서 전체 기사를 읽으십시오.


이 논쟁은 개발자가 가장 잘 알고 있는지 또는 사용자가 가장 잘 알고 있는지에 대한 오래된 질문으로 이어집니다. 인적 요소의 모든 분야에 종사하는 전문 디자이너는 매일 이와 같이 고심하고 있습니다.

Ted는 Market에서 가장 많이 다운로드 한 앱 중 하나가 'App Killer'라는 점을 지적했습니다. 사람들은 응용 프로그램을 종료 할 때 약간의 추가 세로토닌을 얻습니다. 데스크톱 / 랩탑에서 익숙합니다. 그것은 빠르게 움직이고 있습니다. 프로세서 냉각 및 팬 작동을 유지합니다. 그것은 적은 전력을 사용합니다.

모바일 장치가 훨씬 작은 우주선이라고 생각하면 특히 더 이상 필요없는 것을 선상에 던지라는 인센티브를 특히 높이 평가할 수 있습니다. 이제 Android 개발자는 OS가 가장 잘 알고 응용 프로그램을 종료하는 것이 골동품이라고 추론합니다. 전심으로 이것을지지합니다.

그러나 나는 또한 좌절감이 자신의 무지에서 비롯된 경우에도 사용자를 좌절시키지 않아야한다고 생각합니다. 그렇기 때문에 '종료'옵션을 사용하는 것이 좋은 디자인이라고 결론을 짓습니다. 대부분보기를 닫는 것 외에는 아무것도하지 않는 위약 버튼 일지라도 말입니다.


많은 전문가가 공헌 한 흥미롭고 통찰력있는 토론입니다. 안드로이드 OS의 핵심 디자인 중 하나를 중심으로이 포스트가 안드로이드 개발 메인 웹 사이트에서 돌아와야한다고 생각한다.

나는 또한 여기에 두 센트를 추가하고 싶다.

지금까지 안드로이드의 라이프 사이클 이벤트 처리 방법에 깊은 인상을 받았으며 웹과 같은 경험이라는 개념을 네이티브 앱에 가져 왔습니다.

아직 Quit (종료) 버튼이 있어야한다고 저는 믿습니다. 왜? ... 나 또는 Ted 또는 여기의 기술 전문가 중 한 명은 아니지만 최종 사용자 요구를 충족하기위한 유일한 목적입니다.

비록 내가 Windows의 팬은 아니지만 오래 전에 그들은 대부분의 최종 사용자가 익숙한 (X 버튼) 개념을 도입했습니다 ... "나는 '하고 싶을 때 위젯을 종료하고 싶습니다.

그렇다고 누군가 (OS, 개발자?)가 자신의 재량에 따라 처리 할 수 ​​있다는 것을 의미하지는 않습니다. "예전의 Red X 버튼이 어디에 사용 되는가"를 의미합니다. 내 행동은 '버튼을 누를 때 전화 끊기', '버튼을 눌러 기기를 끄는'등과 비슷해야합니다. 그렇게하는 것이 인식입니다. 나의 행동이 실제로 그 목적을 달성한다는 것은 만족 그 자체를 가져옵니다.

개발자가 여기 제시된 제안을 사용하여이 동작을 속일 수는 있지만, 응용 프로그램이 최종 사용자의 요구에 따라 독립적이고 신뢰할 수있는 중립적 인 소스 (OS)에 의해 완전히 기능을 중지해야한다는 인식이 여전히 남아 있습니다.


데이터 / 연결 방법 (그리고 "응용 프로그램")을 영구히 유지하는 방법을 모르는 경우 Android를 사용하여 "필요한"작업을 수행 할 수 없습니다.

사람들은 일반적으로 배터리 수명이나 메모리 사용을 돕지 않지만 OS를 효율적으로 관리하는 일을 방해합니다.

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


시간이 지남에 따라 상황이 바뀌기를 바랍니다. 앱 프로세스가 OS에 의해 올바르게 샌드 박싱되면 사용자는 앱이나 프로세스를 종료 할 수 있어야합니다. 앱을 완벽하게 작성해야한다는 생각이 들거나 사용자가 모든 SDK 권장 사항을 따르는 앱만 사용하게됩니다. 나는 그것이 큰 명령이라고 생각한다.


응용 프로그램 개발자가 자체 응용 프로그램을 종료 할 수있는 종료 기능이 없으면 이는 매우 나쁜 설계입니다.

내 응용 프로그램은 사용자가 동적으로 데이터를 동적으로 변경하도록 허용해야하며 변경 효과를 적용하려면 사용자가 응용 프로그램을 다시 시작해야하지만 Android는 응용 프로그램을 다시 시작할 수 없습니다. Android OS의 디자인 응용 프로그램 수명주기가 매우 나쁩니다.


리눅스 커널은 Out-of-memory killer 라고 불리는 기능을 가지고있다. (위에서 언급했듯이, 정책은 사용자 공간 수준에서 구성 할 수있을뿐 아니라 커널은 최적의 것이 아니라 불필요한 것이 아니다.)

그리고 그것은 안드로이드에서 많이 사용됩니다 :

일부 사용자 공간 앱은 다음과 같이 이러한 킬 (kill) 앱을 지원할 수 있습니다.


finish () 명령에서 원하는 대답을 찾은 것 같습니다. 이렇게해도 메모리에서 앱이 삭제되지는 않지만 Android가 리소스가 필요할 때마다 그렇게하므로 Android에서 명시 적으로 변경하지 않아도됩니다.

응용 프로그램 종료가 일반적으로 갖는 모든 효과를 얻으려면 응용 프로그램의 상태를 장치의 부팅 후 처음 실행될 때 상태가 정상 상태가되도록 재설정해야합니다. 모든 활동에 대해 finish ()를 호출하는 것. 이렇게하면 사용자가 앱을 다시 선택하면 시뮬레이트 된 '이탈'이전의 지점에서 상태가 남지 않고 '신선한'상태로 실행 된 것처럼 보입니다.

사용자 작업을 저장하는 것과 같은 "종료"에서만 발생해야하는 특수 작업이있는 경우 위의 루틴을 다시 초기화하기 전에 작업을 수행 할 수도 있습니다.

이 방법을 사용하면 운영 체제의 손에 앱 종료와 같은 OS 리소스 관리를 맡기는 안드로이드의 철학을 위반하지 않고 "exit"명령을 수행한다는 목표를 달성 할 수 있습니다.

개인적으로 안드로이드 사용자는 앱이 다시 방문 할 때 앱의 연속성을 유지할 것으로 기대하므로 앱을 종료하는 방식에 익숙하지 않기 때문에 개인적으로이 방법을 사용하지 않을 것입니다. 대신 사용자가 프로세스에서 "이탈"할 필요없이 기본 초기 상태로 응용 프로그램을 재설정 할 수있는 "명확한"기능을 지원할 것입니다.

한 가지 예외는 사용자가 앱을 닫는 데 충분한 횟수만큼 뒤로 버튼을 눌렀을 때입니다. 이 상황에서 상태가 저장 될 것이라는 사용자의 기대는 없습니다 (그리고 앱에 저장되지 않은 상태가있는 경우 개발자는 저장되지 않은 데이터를 감지하는 뒤로 버튼을 처리하는 코드를 가지고 있어야합니다. 사용자에게 SharedPreferences 나 파일 또는 다른 비 휘발성 매체에 저장하라는 메시지를 표시합니다.

system.exit (0)에 관해서 :

system.exit (0)을 사용하여 마지막 최종 버튼 누름의 결과처럼 무의미한 최종 결과로 앱을 닫으 려한다면 나에게 이것은 "작동"하고 일부는 사례가 남은 흔적없이 앱을 닫을 수있는 유일한 방법이었습니다.이 접근법을 사용할 때 Jelly Bean에서 발생하는 사소한 결함이 있습니다.

특히 최근 앱 목록을 사용하여 앱을 연 다음 다시 버튼을 사용하여 앱을 닫으면 (close close (system.exit (0)을 통해 구현 됨) 최근 앱 목록이 다시 표시됩니다. 절대로 닫히지 않았습니다. 그런 다음 해당 목록의 앱 항목을 탭하여 이미 열려있는 최근 앱 목록에서 두 번째 로 실행하면 응답이 없습니다.

나는 이것이 최근 Apps 목록이 system.exit (0)을 사용하여 응용 프로그램을 종료했기 때문에 작동하지 않는 응용 프로그램에 대한 참조를 보유하고 있다고 의심합니다. finish ()를 사용하여 응용 프로그램을 더 문명화하면 OS에 알리면 최근 응용 프로그램 목록을 새로 고칠 수 있지만 system.exit (0)은이 작업을 수행하지 않습니다.

아주 소수의 사람들이 Recent Apps에서 응용 프로그램을 연 다음 종료하고 같은 공개중인 Recent Apps 목록에서 다시 열어 본다는 점에서 큰 문제는 아닙니다. 또한 홈 버튼을 탭한 다음 최근 앱 목록 을 다시 열면 앱의 항목이 표시되며 완전히 작동합니다. 하지만 system.exit (0)을 사용하면 앱과 OS 간의 적절한 통신을 방해 할 수 있으며,이 방법을 사용하면 더 심각하고 미묘한 결과가 발생할 수 있음을 알 수 있습니다.


나는 Ted와 동의한다. 애플리케이션을 종료하는 것이 'Android 방식'이 아니라는 것을 이해합니다. 그러나 배제해야하는 것처럼 보이지는 않습니다. 액티비티뿐만 아니라 애플리케이션으로의 실제 이탈을 원하는 세 가지 이유는 다음과 같습니다.

  1. 사용자는 메모리가 부족한 경우 앱이 종료되는 것을 제어 할 수 있습니다. 중요한 응용 프로그램 A가 백그라운드에서 실행중인 경우, 응용 프로그램 A가 운영 체제에 의해 종료되지 않도록 응용 프로그램 B를 끝내고 나면 응용 프로그램 B를 종료 할 수 있습니다.

  2. 응용 프로그램에 중요한 데이터가 메모리에 캐시되어있는 경우 바이러스 / 웜 / 악성 앱이 침입 할 수 없도록 응용 프로그램을 종료 할 수 있습니다. 나는 보안 모델이 그것을 방지하기로되어 있다는 것을 알고 있지만 다만 ...

  3. 응용 프로그램이 전화에 나쁜 영향을 미칠 수있는 자원 (예 : 네트워크, CPU, 센서 등)을 사용하는 경우 해당 자원을 확보하는 한 가지 방법은 응용 프로그램을 종료하는 것입니다. 잘 작동하는 앱은 필요하지 않을 때 리소스를 확보해야한다는 것을 알고 있습니다. 그러나 다시 한 번, 응용 프로그램을 종료하면이를 보장하는 합리적인 방법처럼 보입니다.


인 텐트를 통해 다음 페이지로 이동할 때마다 다음을 사용하십시오.

`YourActivityname.this.finish()`;

예:

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

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

배경에서 아무런 활동도 수행하지 않으 려면 앱 을 종료 할 때 다음을 사용하십시오.

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

이 끝내는 것은 나를 위해 매력처럼 일했다 :)


시간의 거의 99 %가 안드로이드 애플리케이션이 자체 라이프 사이클을 인수 할 필요가 없습니다. 대부분의 경우 응용 프로그램의보다 나은 계획 또는 더 똑똑한 디자인이 필요합니다. 예를 들어 다운로드 등을 처리하거나 사용자 워크 플로와 관련된 작업 및 작업을 디자인하기 위해 내부 서비스 (내보내기되지 않음)를 작성하십시오.

그러나 그것이 유언장이있는 곳에서는 방법이있다. 안드로이드는 - android.os.Process 클래스를 통해 자바보다 훨씬 나은 API를 제공하여 기본 프로세스를 제어합니다. 자바와 달리 개발자는 단순한 java.lang.System.exit () 호출 뒤에 모든 것을 숨겨서 바보처럼 취급하지 않는다.

그렇다면 Android에서 자살을 신청하는 방법은 무엇입니까? 자, 트릭은 간단합니다.

표준 android.app.Application 클래스를 상속 받아 자신 만의 Android 애플리케이션 클래스를 작성하십시오 (AndroidManifest.xml 파일에서 선언해야 함).

onCreate () 메서드를 재정의하고 응용 프로그램을 시작한 프로세스 ID를 저장합니다.

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

이제 응용 프로그램을 종료하려면 kill () 메소드를 제공하십시오.

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

이제 자살을 위해 앱이 필요할 때마다 애플리케이션 컨텍스트를 입력하고 kill 메소드를 호출하십시오!

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

Android의 프로세스 관리 정책, 특히 서비스와 관련된 서비스 때문에 Android는 서비스를 다시 시작하기 만 할 수도 있습니다 ( Android에서 작업 킬러를 사용하면 안됨을 참조하십시오 ).


나는 당신이 버그가있는 소프트웨어를 가지고 있지 않다면 애플 리케이션을 종료 할 필요가 없다는 것이 중요하다고 생각한다. 사용자가 앱을 사용하지 않고 기기에 더 많은 메모리가 필요한 경우 Android가 앱을 종료합니다. 백그라운드에서 서비스를 실행해야하는 앱이있는 경우 서비스를 사용 중지 할 수 있습니다.

예를 들어 Google Listen은 앱이 표시되지 않을 때 계속 팟 캐스트를 재생합니다. 그러나 사용자가 Podcast를 끝내면 Podcast를 끄는 일시 중지 버튼이 항상 있습니다. 필자가 올바르게 기억하면 '듣기 (Listen)'는 알림 표시 줄에 바로 가기를 추가하여 항상 일시 중지 버튼을 빠르게 얻을 수 있습니다. 또 다른 예는 끊임없이 인터넷에서 서비스를 조사하는 트위터 앱과 같은 앱입니다. 이러한 유형의 앱은 실제로 사용자가 서버를 폴링하는 빈도를 선택하거나 백그라운드 스레드에서 폴링할지 여부를 선택할 수 있어야합니다.

끝낼 때 실행되는 코드가 필요할 경우 onPause (), onStop () 또는 onDestroy ()를 적절하게 재정의 할 수 있습니다. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


어떤 경우에도 응용 프로그램을 종료하려면 언제든지 전화를 걸 수 있습니다. System.exit(0); .


모든 응용 프로그램은 버튼을 종료하고 ... 나는 자주 사용자 때문에 긍정적 인 의견을 얻습니다. 플랫폼이 응용 프로그램에서 필요하지 않아야하는 방식으로 플랫폼을 설계했는지는 중요하지 않습니다. "그 (것)들을 거기 두지 말라"는 말은 어색하다. 사용자가 종료하고 싶다면 ... 나는 그들에게 정확히 할 수있는 액세스를 제공합니다. 나는 그것이 안드로이드가 전혀 작동하지 않는 방법을 줄이고 좋은 연습처럼 보인다고 생각하지 않는다. 나는 라이프 사이클을 이해하고있다 ... 그리고 내 관찰은 안드로이드는 그것을 처리하는데있어서 좋은 일을하지 않는다는 것이었다 .... 그리고 그것은 기본적인 사실이다.


10,20 .. 여러 활동이 실행 중이고 모두 끝내고 시스템에서 나가기를 원한다면

application class또는에 정적 배열 만들기constants class.

상수

public class Constants {

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

}

MainActivity 이 배열에 현재 활동 참조 추가

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);
            }
        });
    }
}

준 품질 Android 애플리케이션 라이프 사이클을 실제로 구현하는 것보다이 Q & A를 읽는 데 더 오래 걸렸습니다.

포인트를 폴링하고 스레드를 사용하여 몇 초마다 웹 서비스에 현재 위치를 전송하는 GPS 앱입니다. Ted의 경우 5 분마다 업데이트를 폴링하여 onStop이 업데이트 작업을 간단히 시작할 수 있습니다. Ted was soo (비동기 테드, Windows 프로그래머와 같은 코드를 작성하지 않거나 프로그램이 Windows 프로그램과 같이 실행되는 경우 ... eww, 그렇게 어렵지는 않습니다.)

onCreate에서 몇 가지 초기 코드를 사용하여 활동 기간에 대한 작업을 설정했습니다. 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();
}

이 코드는 완전히 잘못되었을 수도 있지만 작동합니다. 이것은 내 안드로이드 응용 프로그램 중 하나입니다.

Voilà는 백그라운드에있을 때 CPU를 소비하지 않지만 RAM에 있기 때문에 RAM에 있기 때문에 즉시 다시 열 준비가됩니다 (Android 라이프 사이클과 같이 RAM을 보유하지는 않지만) ... 앱은 항상 준비되어 있으며 전화입니다 , 남자 / 여자 친구. 응용 프로그램이 모든 RAM을 다 사용하고 OS에 의해 종료 될 수 없다면 문제는 멈출 수 있습니다. 즉, OS가 배경에있을 때 응용 프로그램을 닫을 수 있어야합니다 (응용 프로그램이 리소스 호그가 아니라면 BTW), 더 나은 응용 프로그램을 작성해 봅시다.


뒤로 단추를 누르거나 Activity 에서 finish() 를 호출하여 종료 있습니다 . 명시 적으로 제거하려는 경우 MenuItem 에서 finish() 를 호출하기 만하면됩니다.

Romain은 그것을 끝낼 수 없다는 말은 아니며 단지 무의미한 것입니다. 사용자는 응용 프로그램 수명주기 작동 방식에 따라 자동 저장 및 저장하는 스마트 소프트웨어를 작성하도록 권장하므로 업무를 중단하거나 저장하는 데 신경을 쓸 필요가 없습니다. 무슨 일이 있어도 상태를 복원합니다.


Android에서 응용 프로그램을 구상 할 때 다음과 같이 표시됩니다.

  • 귀하는 귀하의 신청서를 가지고 일하고 있습니다.
  • 전화가 울렸다.
  • 너는 전화를 받는다.
  • 통화가 끝나면 같은 장소에서 신청서를 다시 볼 수 있습니다.

그렇게하기 위해서는 짧게 또는 길게 눌러 전화기 의 Back버튼이나 Home버튼과 알림 바 만 있으면 됩니다.

애플리케이션을 종료하면 Back버튼이나 버튼을 사용할 때까지 버튼 만 사용 Home합니다.

그것이 대부분의 응용 프로그램이 생각하는 방식입니다. 하지만 세션이나 연결이 필요한 경우 로그인 / 로그 아웃 버튼과 알림 (제목 표시 줄 등)을 통해 사용자에게 명확하게 알립니다. 이것은 순수한 "이탈"스타일 응용 프로그램과는 다소 다른 스타일입니다.

PC에서는 다중 GUI 데스크탑이 있고 Android에서는 분명히 다중 태스크가 있지만 한 번에 하나의 애플리케이션 만 표시합니다 (여기에서는 위젯을 고려하지 않습니다 ^^). 그리고 휴대 전화에서는 언제든지 자신이하는 일보다 더 중요한 것에 대한 알림을받을 수 있습니다.

따라서 응용 프로그램의 전체 개념은 "응용 프로그램 종료 응용 프로그램 입력"과 다른 다른 것에 의존합니다.


Addison-Wesley가 발행 한 "Android 무선 애플리케이션 개발"을 읽는 것을 고려할 것 입니다. 나는 그것을 끝내고 있고 그것은 아주 철저하다.

Android 플랫폼에 대한 근본적인 오해가있는 것으로 보입니다. 저도 처음 엔 Android 앱의 애플리케이션 라이프 사이클에 조금 좌절감을 나타 냈습니다. 그러나 더 큰 이해를 얻은 후에 저는이 접근법을 정말로 즐기기 위해 왔습니다. 이 책은 모든 질문에 대한 답변을 제공합니다. 그것은 정말로 내가 새로운 안드로이드 개발자를 위해 찾은 최고의 리소스입니다.

또한 기존 앱의 line-for-line 포트를 놓아 줘야한다고 생각합니다. 애플리케이션을 Android 플랫폼에 이식하려면 일부 애플리케이션 디자인이 변경 될 것입니다. 모바일 장치는 데스크톱 시스템에 비해 리소스가 매우 제한적이므로 Android 장치가 순서 있고 리소스를 인식하는 방식으로 여러 응용 프로그램을 실행할 수 있으므로 사용되는 응용 프로그램 수명주기가 필요합니다. 플랫폼에 대한 깊이있는 연구를 좀 더 해보십시오. 당신이하고 싶은 것이 전적으로 실현 가능하다는 것을 깨닫게 될 것입니다. 행운을 빕니다.

덧붙여서, 나는 Addison-Wesley 또는이 책과 관련된 사람이나 단체와 아무런 관계가 없습니다. 내 게시물을 다시 읽은 후 나는 조금 fanboyish 떨어져 왔다고 느낀다. 나는 정말로, 정말로 그것을 즐겼고, 그것이 매우 도움이되는 것을 알았다. :)


Android 컨텍스트의 응용 프로그램은 모호한 관련 활동의 무리 일 뿐이므로 응용 프로그램을 종료하는 것은별로 의미가 없습니다. 액티비티를 완료 할 수 있으며 액티비티 스택의 이전 액티비티 뷰가 그려집니다.





android