android - pie - 구글 안드로이드




응용 프로그램을 쫓아 내고 있습니까? (20)

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


결국 궁금증이 생길지 모르지만, 나는 먼저이 글을 쓰는 시점에 이미 주어진 여러 가지 대답에 대해 다양한 의견에서 제기 한 여러 가지 문제를 해결하고자합니다. 나는 당신의 마음을 바꾸려는 의도가 없습니다. 오히려 미래에이 게시물을 읽는 사람들을위한 것입니다.

요점은 안드로이드가 언제 내 앱이 종료 될지를 결정하는 것을 허용 할 수 없다는 것입니다. 이는 사용자의 선택이어야합니다.

수백만 명의 사람들이 환경이 필요에 따라 응용 프로그램을 닫는 모델에 완벽하게 만족합니다. 그 사용자는 단순히 웹 페이지를 "종료"하거나 자동 온도 조절기를 "종료"하는 것 이상으로 Android 앱을 "종료"하는 것에 대해 생각하지 않습니다.

아이폰 사용자는 앱이 종료 된 것처럼 아이폰 버튼을 누르는 것이 반드시 종료되는 것처럼 느껴지지 않는다. 많은 아이폰 앱이 사용자가 중단 한 부분을 픽업하기 때문에 앱이 실제로 종료 된 경우에도 (아이폰 이후부터) 한 번에 하나의 타사 앱 허용).

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

나는 "항상 거기에 있어야하는 작업 목록"이 무엇인지는 모르지만 "장치에 푸시 된 데이터"는 유쾌한 허구이며 어떤 경우에도 활동으로해서는 안됩니다. AlarmManager 를 통해 예약 된 작업을 사용하여 최대한의 안정성을 위해 데이터를 업데이트하십시오.

우리 사용자는 로그인하여 전화를 걸 때마다 안드로이드가 앱을 죽이기로 결정할 수 없습니다.

이를 처리하는 많은 iPhone 및 Android 응용 프로그램이 있습니다. 일반적으로 사용자가 매번 수동으로 로그인하도록 강요하는 대신 로그온 자격 증명을 보유하기 때문입니다.

예를 들어, 애플리케이션을 종료 할 때 업데이트를 확인하려고합니다.

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

일부 의견은 뒤로 버튼을 누르면 전혀 응용 프로그램을 죽이지 않는 것이 좋습니다 (내 질문에 위의 링크 참조).

BACK 버튼을 눌러도 "앱을 죽이지"않습니다. 사용자가 BACK 버튼을 눌렀을 때 화면 상에있는 활동을 끝냅니다.

사용자가 종료하려고 할 때만 종료되어야하며 다른 방법으로는 절대 사용할 수 없습니다. Android에서와 같이 작동하는 앱을 작성할 수 없다면 Android를 실제 앱 작성에 사용할 수 없다고 생각합니다. = (

그렇다면 웹 애플리케이션도 마찬가지입니다. 또는 WebOS , 모델을 올바르게 이해했다면 (아직 게임을 할 기회가 없었 음) 이 모든 경우 사용자는 아무 것도 "종료하지"않습니다. iPhone은 현재 약간의 차이가 있습니다. 한 번에 한 가지만 실행할 수 있기 때문에 (몇 가지 예외가 있음) 앱을 종료하는 즉시 앱이 즉시 종료됩니다.

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

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

정의에 따라 두 가지 응용 프로그램 환경이 동일하지 않습니다. 즉, 새로운 환경이 생겨나 고 다른 환경이 묻힐 때 환경의 추세를 볼 수 있습니다.

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

마찬가지로 앱을 "종료"한다는 개념을 없애려는 움직임이 커지고 있습니다. 대부분의 웹 응용 프로그램은 사용자가 강제로 로그 아웃하지 않고 일정 기간 사용하지 않으면 암시 적으로 사용자를 로그 아웃합니다. 안드로이드와 마찬가지로, 그리고 그보다는 덜한, 아이폰 (그리고 아마도 WebOS).

이를 위해서는 비즈니스 목표에 중점을두고 이전 응용 프로그램 환경과 연결된 구현 모델을 고수하지 말고 응용 프로그램 디자인에보다 중점을 두어야합니다. 이를 수행 할 시간이나 성향이 부족한 개발자는 기존의 정신 모델을 깨뜨리는 새로운 환경에 좌절감을 느낍니다. 이것은 어느 환경에서든 잘못이 아니며, 폭풍이 퍼져 나가기보다는 오히려 주위를 돌고있는 폭풍우에 대한 산의 잘못입니다.

예를 들어 Hypercard 및 Smalltalk와 같은 일부 개발 환경에서는 응용 프로그램과 개발 도구가 한 번에 하나의 설정으로 통합되었습니다. 이 개념은 응용 프로그램에 대한 언어 확장 (예 : Excel VBA , AutoCAD의 Lisp ) 이외에 많은 부분을 파악하지 못했습니다. 따라서 앱 자체에 개발 도구의 존재를 가정 한 정신 모형을 개발 한 개발자는 모델을 변경하거나 자신의 모델이 실제로 적용될 수있는 환경으로 제한해야했습니다.

그래서, 당신이 쓸 때 :

내가 발견 한 다른 지저분한 것들과 함께, 나는 안드로이드를위한 우리의 앱을 개발하는 것이 일어나지 않을 것이라고 생각한다.

그것은 지금 당장 당신을 위해서 최선의 것 같습니다. 마찬가지로, 안드로이드에서보고 한 것과 같은 문제 중 일부는 웹 애플리케이션에서도 발견 될 수 있으므로 (예 : "해지"없음) 웹 애플리케이션을 웹에 이식하려는 것에 대해 자문 해드립니다. 반대로 앱을 웹에 포팅한다면 언젠가는 웹 애플리케이션의 흐름이 Android와 더 잘 어울릴 수 있으며 그 당시 Android 포트를 다시 방문 할 수 있습니다.


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

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

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

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

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

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

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


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


음 ...

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

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

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

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

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

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


응용 프로그램을 모 놀리 식 응용 프로그램으로 생각하지 마십시오. 그것은 사용자가 귀하의 "응용 프로그램"과 상호 작용할 수있는 UI 화면 세트이며 안드로이드 서비스를 통해 제공되는 "기능"입니다.

신비한 앱이하는 일이 무엇인지 알지 못하는 것은 정말로 중요하지 않습니다. 사용자가 "응용 프로그램을 종료 할 때까지 일부 모니터링 또는 상호 작용을 수행하고 로그인 된 상태로 유지되는 일부 보안이 안전한 회사 인트라넷에 있다고 가정 해 봅시다. IT 부서에서 명령을 내리기 때문에 사용자는 인트라넷에서 언제 또는 언제 인하는지 매우 숙지해야합니다. 따라서 사용자가 "종료"하는 것이 중요합니다.

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

이것은 모든 의도와 목적에 맞게 정확히 말하고 싶은 것입니다. Android 방식으로 완료되었습니다. Google 토크 나 Google지도 내비게이션을 보면이 "이탈"의 예가 가능한 사고 방식입니다. 유일한 차이점은 사용자가 응용 프로그램을 다시 작동시키려는 경우에 대비하여 활동에서 단추를 뒤로 밀면 UNIX 프로세스가 대기 상태에 빠질 수 있습니다. 이것은 실제로 메모리에 최근에 액세스 한 파일을 캐시하는 현대적인 운영 체제와 다르지 않습니다. Windows 프로그램을 종료 한 후 필요한 리소스는 여전히 메모리에 남아 있으므로 더 이상 필요없는 다른 리소스로 대체되기를 기다리고 있습니다. Android도 마찬가지입니다.

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


테드, 당신이 성취하고자하는 것은 지금 당장 생각하고있는 방법이 아니라 아마도 끝낼 수 있습니다.

나는 당신이 활동과 서비스에 대해 읽어 보길 권한다. "앱"이라는 용어 사용을 중단하고 구성 요소 (예 : 활동, 서비스)를 시작하십시오. Android 플랫폼에 대해 더 많이 배워야한다고 생각합니다. 그것은 표준 PC 응용 프로그램에서 사고 방식의 변화입니다. 귀하의 게시물 중 아무도 "활동"이라는 단어가 없다는 사실 (사실, 귀하의 단어가 아닌)은 귀하가 좀 더 읽을 필요가 있음을 알려줍니다.


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

우선 System.exit (0)을 사용하지 마십시오. 그것은 사람이 머리에 그를 펀치 수면을 만드는 것과 같습니다!

둘째 : 나는이 문제에 직면 해있다. 내 솔루션을 공유하기 전에 내 생각을 공유하고 싶습니다.

나는 "Exit Button"이 어리 석다 고 생각한다. 정말 정말 바보 야. 그리고 귀하의 응용 프로그램에 대한 종료 단추를 요청하는 사용자 (소비자)도 어리 석다 고 생각합니다. 그들은 OS의 작동 방식과 리소스 관리 방법을 이해하지 못합니다 (훌륭한 일을합니다).

올바른 순간과 조건에서 올바른 일 (업데이트, 저장 및 푸시)을 수행하고 올바른 작업 (서비스 및 리시버)을 사용하여 코드를 작성하면 문제가 없을 것이며 아무도 불만을 제기하지 않을 것이라고 생각합니다. .

하지만 그렇게하려면 Android에서 어떻게 작동하는지 배우고 학습해야합니다. 어쨌든, 이것은 사용자에게 "나가기 버튼"을 제공하는 나의 해결책입니다.

나는 각 활동에서 항상 볼 수있는 옵션 메뉴를 만들었다 (나는 그것을하는 슈퍼 액티비티를 가졌다).

사용자가 해당 버튼을 클릭하면 다음과 같은 결과가 발생합니다.

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

그래서 SharedPreferences에서 앱을 죽이고 싶습니다. Intent를 시작합니다. 그 깃발을보세요. 그것들은 내 모든 백 스택을 지우고 내 DashBoard 활동을 내 "집"활동이라고합니다.

따라서 대시 보드 활동에서 나는 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();
    }
}

그리고 그것은 꽤 잘 될 것입니다.

내가 왜 그런 일이 일어나고 있는지 이해할 수없는 유일한 이유는 마지막으로 마칠 때 (그리고 내가 확인한 것은 onPause → onStop → onDestroy의 모든 올바른 흐름을 따른다는 것입니다) 응용 프로그램은 여전히 ​​최근 활동에 있습니다 (그러나 그것은 비어있다).

DashboardActivity를 시작한 최신 의도가 여전히 시스템에있는 것처럼 보입니다.

나는 그것을 제거하기 위해서 더 많이 파야했습니다.


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

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

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

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

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


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

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

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


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


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

`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();

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


준 품질 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), 더 나은 응용 프로그램을 작성해 봅시다.


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


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 간의 적절한 통신을 방해 할 수 있으며,이 방법을 사용하면 더 심각하고 미묘한 결과가 발생할 수 있음을 알 수 있습니다.


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

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

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


당신은 "출구"수수께끼를 얻을 수있는 (상대적으로) 간단한 디자인이 있습니다. 앱에 빈 화면 인 '기본'상태 (활동)를 만듭니다. 액티비티의 첫 번째 onCreate에서 앱의 주요 기능이있는 또 다른 액티비티를 시작할 수 있습니다.이 두 번째 액티비티를 finish () 한 다음 빈 화면으로 돌아가서 "exit"를 수행 할 수 있습니다. OS는이 빈 화면을 원하는만큼 메모리에 유지할 수 있습니다.

본질적으로, OS를 종료 할 수 없으므로 단순히 자체 생성 된 무의미로 변환 할 수 있습니다.


시간의 거의 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에서 작업 킬러를 사용하면 안됨을 참조하십시오 ).


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







android