런처에서 아이콘을 눌러 시작하면 앱이 완전히 다시 시작됩니다.
몇 명의 테스터에게 보낼 첫 번째 Android 앱의 릴리스 빌드를 만드는 중입니다. 그러나 나는 그것에 문제가 생겼다. 앱을 종료 한 다음 아이콘을 통해 실행하여 다시 입력하면 이전 위치로 돌아 가지 않고 전체 앱을 다시 시작합니다. 퇴장 후 바로 재 입장하더라도 발생합니다. 하지만 홈 버튼을 길게 누르고 최근 앱 목록을 통해 실행하면 안됩니다.
나는이 문제가있는 다른 사람들을 온라인으로 검색했고 몇 가지가 있지만, 왜 그들에게 일어나는지에 대한 확실한 답을 가진 사람은 없습니다. 매니페스트 파일에서 launchmode를 singletask 또는 singleinstance로 설정하는 것이 오래된 질문에서 제안되었지만 도움이되지 않았습니다. 게다가 내가 이해하는 바에서 Android의 기본 동작은 작업의 이전 상태로 돌아가는 것입니다. 이 상황에서는 왜 그렇게하기 위해 특별한 매니페스트 옵션이 필요한지 모르겠습니다.
이 문제에 대한 가장 기이 한 점은 이클립스와 디버거를 사용하여 앱을 내 폰에 넣으면이 문제가 발생하지 않는다는 것입니다. 디버거에 연결할 필요조차 없습니다. 앱의 디버그 버전이 있으면 문제가 발생하지 않는 것 같습니다. 그러나 릴리스 버전을 사용하면 (이클립스에서 Android 도구-서명 된 애플리케이션 패키지 내보내기 메뉴 옵션을 사용하여 생성) 문제가 발생합니다. 이 문제의 원인에 대한 통찰력이있는 사람이 있다면 여러분의 생각을 듣고 싶습니다.
나는 응용 프로그램에 동일한 문제가 있었고 AndroidManifest.xml 파일 의 선언 "android:launchMode="singleTop""
대신 플래그 를 추가 하여이 동작을 해결했습니다 . 이것이 누군가를 도울 수 있기를 바랍니다."android:launchMode="singleTask""
<activity>
지금까지 실제 장치에 설치하는 방법에 따라 문제가 있음을 발견했습니다. 특히 다음과 같습니다.
- APK를 복사하여 기기의 로컬 저장소에 붙여넣고 서명 여부에 관계없이 기기에서 설치하면이 동작이 표시되고 메뉴 아이콘에서 앱이 다시 시작됩니다.
다음 옵션 중 하나를 사용하여 설치하면이 문제가 나타나지 않습니다.
터미널 또는 명령 프롬프트를 사용하여 sdk / tools /로 이동 한 다음 입력
adb install <FILE PATH OF .APK FILE>
Linux에서는 다음을 입력합니다.
./adb install <FILE PATH OF .APK FILE>
Eclipse에서 프로젝트를 실행하기 만하면됩니다.
베타 테스트를 위해 올바른 APK를 배포 할 수있는 방법이 있는지 알고 싶습니다. APK를 복사하여 붙여넣고 수동으로 설치하면 악성 동작이 표시되기 때문에 이미 서명 된 APK 내보내기를 시도했습니다.
최신 정보:
해결책을 찾았습니다. 다음 두 단계를 따르십시오.
- 활동 태그 내의 AndroidMainifest.xml
android:launchMode="singleTask" = true
에서 앱의 모든 활동에 대해 설정 합니다 . 이 코드를 런처 활동의
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의 버그입니다. 특별한 경우가 아닙니다.
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>
또 다른 이상한 원인은 Copy-to-Device-&-Install 후 "OPEN"을 클릭하여 앱이 시작된 경우에만 다시 시작된다는 것입니다.
OS8.1에서 테스트하고 launchMode가 작동하지 않습니다.
Android의 기본 동작입니다. 디버그 빌드의 경우 어떤 이유로 든 다르게 작동합니다. android:launchMode="singleInstance"
활동 에 추가 하여 해결할 수 있으며 아이콘에서 시작한 후 다시 시작하고 싶습니다.
// 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;
}
write the above code in your launcher activity before calling setContentView. This will solve the problem
Add this to your first activity:
if (!isTaskRoot()) {
finish();
return;
}
super.onCreate(savedInstanceState);
You can try to set android:alwaysRetainTaskState="true"
for your launcher activity in AndroidManifest.xml.
<activity
android:name=".YourMainActivity"
android:alwaysRetainTaskState="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
For details you can see https://developer.android.com/guide/topics/manifest/activity-element.html#always
Try using android:alwaysRetainTaskState
as shown in the following example:
<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>
When you press the back button in Android, the onDestroy
method is invoked (as opposed to pressing the home button, where only the onPause()
method is invoked).
If you need your app to continue where it left off, save the state of the app in your onDestroy()
method and load that state in the onCreate()
method.
위의 모든 솔루션이 내 모든 장치에서 일관되게 작동하지 않았습니다. 일부 삼성에서는 작동했지만 전부는 아닙니다.
나에게 문제의 원인은 APK를 수동으로 설치하는 것이 었습니다.
나를 위해 수정은 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)]
2019 년 Android TV에서이 문제를 확인했습니다. 더 나은 해결책이 있나요? 이것 말고도
if (!isTaskRoot()) {
finish();
}
작동하지만 실제 솔루션보다 해킹처럼 보입니다.
나를 위해 NoHistory = true
활동 속성에 잘못 게시했음을 알았습니다.
[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]
이로 인해 앱이이 활동으로 다시 시작되지 않고 다시 시작되었습니다.
'Program Tip' 카테고리의 다른 글
AngularJS 컨트롤러를 동적으로로드 (0) | 2020.11.21 |
---|---|
HTML 다중 선택 상자 (0) | 2020.11.21 |
TypeScript 제네릭에 대해 여러 유형 제약 조건을 지정할 수 있습니까? (0) | 2020.11.21 |
Python에서 텍스트 파일의 특정 줄 편집 (0) | 2020.11.20 |
메서드에는 "String method ()… [etc]…"서명이 있어야하지만 "void method ()"서명이 있어야합니다. (0) | 2020.11.20 |