런처에서 아이콘을 눌러 시작하면 앱이 완전히 다시 시작됩니다.


80

몇 명의 테스터에게 보낼 첫 번째 Android 앱의 릴리스 빌드를 만드는 중입니다. 그러나 나는 그것에 문제가 생겼다. 앱을 종료 한 다음 아이콘을 통해 실행하여 다시 입력하면 이전 위치로 돌아 가지 않고 전체 앱을 다시 시작합니다. 퇴장 후 바로 재 입장하더라도 발생합니다. 하지만 홈 버튼을 누른 상태에서 최근 앱 목록을 통해 실행하면 발생하지 않습니다.

나는이 문제가있는 다른 사람들을 온라인으로 검색했고 몇 가지가 있지만, 왜 그들에게 일어나는지에 대한 확실한 답을 가진 사람은 없습니다. 매니페스트 파일에서 launchmode를 singletask 또는 singleinstance로 설정하는 것이 오래된 질문에서 제안되었지만 도움이되지 않았습니다. 게다가 내가 이해하는 바에서 Android의 기본 동작은 작업의 이전 상태로 돌아가는 것입니다. 이 상황에서는 왜 그렇게하기 위해 특별한 매니페스트 옵션이 필요한지 모르겠습니다.

이 문제에 대한 가장 기이 한 점은 이클립스와 디버거를 사용하여 앱을 내 폰에 넣으면이 문제가 발생하지 않는다는 것입니다. 디버거에 연결할 필요조차 없습니다. 앱의 디버그 버전이 있으면 문제가 발생하지 않는 것 같습니다. 그러나 릴리스 버전을 사용하면 (이클립스에서 Android 도구-서명 된 애플리케이션 패키지 내보내기 메뉴 옵션을 사용하여 생성) 문제가 발생합니다. 이 문제의 원인에 대한 통찰력이있는 사람이 있다면 여러분의 생각을 듣고 싶습니다.


2
따라서 앱을 설치 한 장치를 다시 시작하면이 문제가 사라집니다. 이제는 멋지고 모든 것이지만 내 앱의 경우 다운로드 할 때 전화를 다시 시작하기 전에 그런 식으로 작동하면 사용자에게 여전히 매우 성 가실 것입니다.
LayfieldK 2013

스택 추적 또는 로그를 제공 할 수 있습니까?
TryTryAgain 2013-04-21

2
아니요, 앱의 릴리스 버전을 사용할 때만 발생하므로 스택 추적이나 로그가 없습니다.
LayfieldK 2013

3
저도 같은 문제를 겪었습니다. 해결책을 찾았습니까? 또는 원인? 또는 장치를 다시 시작한 후 동작을 재현 할 수 있습니까?
-btw

2
이 문제에 대한 유효한 대답은 다음에서 찾을 수 있습니다. stackoverflow.com/questions/19545889/…
Mythul

답변:


59

나는 응용 프로그램에 동일한 문제가 있었고 AndroidManifest.xml 파일 의 선언 "android:launchMode="singleTop""대신 플래그 를 추가 하여이 동작을 해결했습니다 . 이것이 누군가를 도울 수 있기를 바랍니다."android:launchMode="singleTask""<activity>


3
이 접근 방식은 다른 데이터로 동일한 활동을 두 번 열고 자하는 경우 위험합니다.
hkaraoglu

6
다른 데이터로 동일한 활동을 열려면 onNewIntent ()에서이를 처리 할 수 ​​있습니다.
Tas

또한 android:launchMode속성을 완전히 제거하면 효과가 있음을 알았 습니다. 기본값이 "표준"인지 확실하지 않지만 어떤 아이디어라도 도움이 될 것입니다. 나는이 위대한 설명을 찾았지만 그것은 나에게 외국어처럼 보이는 그래서 지금 늦게 : inthecheesefactory.com/blog/...
여호수아 핀터에게

안녕하세요, 모든 활동에 android : launchMode = "singleTop"을 추가해야하나요?.
jmarkstar

제 경우에는 작동하지 않았습니다. 내 앱에는 무언가의 링크를 만들고 공유하는 기능이 있습니다. 앱이 백그라운드에 있고 사용자가 공유 링크를 클릭하면 내 launchMode가 'singleTop'또는 'singleInstance'로 설정된 경우 앱의 완전한 새 인스턴스가 열립니다.
tech_human 19:34:28

33

지금까지 실제 장치에 설치하는 방법에 따라 문제가 있음을 발견했습니다. 특히 다음과 같습니다.

  1. APK를 복사하여 기기의 로컬 저장소에 붙여넣고 서명 여부에 관계없이 기기에서 설치하면이 동작이 표시되고 메뉴 아이콘에서 앱이 다시 시작됩니다.

다음 옵션 중 하나를 사용하여 설치하면이 문제가 나타나지 않습니다.

  1. 터미널 또는 명령 프롬프트를 사용하여 sdk / tools /로 이동 한 다음 입력

    adb install <FILE PATH OF .APK FILE>
    

    Linux에서는 다음을 입력합니다.

    ./adb install <FILE PATH OF .APK FILE>
    
  2. Eclipse에서 프로젝트를 실행하기 만하면됩니다.

베타 테스트를 위해 올바른 APK를 배포 할 수있는 방법이 있는지 알고 싶습니다. APK를 복사하여 붙여넣고 수동으로 설치하면 악성 동작이 표시되기 때문에 이미 서명 된 APK 내보내기를 시도했습니다.

최신 정보:

해결책을 찾았습니다. 다음 두 단계를 따르십시오.

  1. 활동 태그 내의 AndroidMainifest.xmlandroid:launchMode="singleTask" = true 에서 앱의 모든 활동에 대해 설정 합니다 .
  2. 이 코드를 런처 활동의 onCreate().

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    

이 동작은 Android의 버그입니다. 특별한 경우가 아닙니다.


2
나는 이것을 권장하지 않습니다. launchMode를 설정하면 안됩니다. 이상한 행동을 유발할 수 있기 때문에 목적이 있어야합니다. (경험에서 말하면서;))
Boy

앱이 핀 잠금과 같은 기능을 지원하는 경우 android : launchMode = "singleTask"를 설정할 때 신중하게 처리해야합니다.
Logan Guo

10

또 다른 이상한 원인은 Copy-to-Device-&-Install 후 "OPEN"을 클릭하여 앱이 시작된 경우에만 다시 시작된다는 것입니다.

OS8.1에서 테스트하고 launchMode가 작동하지 않습니다.

여기에 이미지 설명 입력


해결책이 있습니까?
Abhay Koradiya 19.06.06

7

AndroidManifest.xml 의 Launcher 활동에 대한 singleTop 으로 launchMode를 사용할 수 있습니다.

       <activity
        android:name="<YOUR_ACTIVITY>"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

5
 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

setContentView를 호출하기 전에 런처 활동에 위 코드를 작성하십시오. 이것은 문제를 해결할 것입니다


3

Android의 기본 동작입니다. 디버그 빌드의 경우 어떤 이유로 든 다르게 작동합니다. android:launchMode="singleInstance"활동 에 추가 하여 해결할 수 있으며 아이콘에서 시작한 후 다시 시작하고 싶습니다.


3

다음을 첫 번째 활동에 추가하십시오.

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);

2
이것은 내 경우에 작동합니다 마녀는 응용 프로그램에 대한 모든 진입 점을 처리하는 시작 화면을 가지고 있으므로 시작 화면이 이미 작업을 완료하고 처음에 올바른 위치로 리디렉션되면 다시 할 필요가 없습니다
Ahmed na

2

android:alwaysRetainTaskState다음 예와 같이 사용해보십시오 .

<activity
    android:name="com.jsnider.timelineplanner.MainActivity"
    android:alwaysRetainTaskState="true"
    android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2

나를 위해 NoHistory = true활동 속성에 잘못 게시했음을 알았습니다.

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

이로 인해 앱이이 활동으로 다시 시작되지 않고 다시 시작되었습니다.



1

2019 년 Android TV에서이 문제를 확인했습니다. 더 나은 해결책이 있나요? 이것 말고도

if (!isTaskRoot()) {
    finish();
}

작동하지만 실제 솔루션보다 해킹처럼 보입니다.


0

위의 모든 솔루션이 모든 장치에서 일관되게 작동하지 않았습니다. 일부 삼성에서는 작동했지만 전부는 아닙니다.

나에게 문제의 원인은 APK를 수동으로 설치하는 것이 었습니다.


0

나를 위해 수정은 LaunchMode = LaunchMode.SingleTop주요 활동에 대한 활동 속성 에 추가 되었습니다.

/// <summary>
    /// The main activity of the application.
    /// </summary>
    [Activity(Label = "SilhuettePhone",
        Icon = "@drawable/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop,
        WindowSoftInputMode = SoftInput.AdjustResize)]

-1

Android에서 뒤로 버튼을 누르면 onDestroy메소드가 호출됩니다 (메소드 만 호출되는 홈 버튼을 누르는 것과는 반대로 onPause()).

앱이 중단 된 지점에서 계속 진행해야하는 경우 onDestroy()메서드에 앱 상태를 저장하고 메서드에 해당 상태를로드합니다 onCreate().


1
홈 버튼을 눌러 앱을 종료합니다.
LayfieldK 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.