2017-09-11 11 views
2
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.jatin.notification"> 

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity" 
      android:launchMode="singleInstance" > <!-- Activity A --> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".NotificationActivity" 
      > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".MainActivity" /> 
     </activity> 
     <activity 
      android:name=".DialogActivity" 
      android:excludeFromRecents="true" 
      android:noHistory="true" 
      android:theme="@style/Theme.AppCompat.Dialog.MinWidth" /> 
     <activity 
      android:name=".SecondActivity" /><!-- Activity B --> 
    </application> 

</manifest> 

단일 인스턴스에 따르면 시스템은 인스턴스를 보유하는 작업에 다른 활동을 실행하지 않습니다. 활동은 항상 그 작업의 단 하나의 유일한 구성원입니다. 이 작업으로 시작된 모든 활동은 별도의 작업으로 열립니다.단일 인스턴스 : 실행 프로그램 활동 시작 모드

하지만 새로운 작업 활동 B가 아닌 활동 A (실행 프로그램 활동) -> 활동 B에서 startActivity (인 텐트 *)를 통해 탐색 할 때 활동 A의 작업 위에 B가옵니다. startActivity (intent *)를 통해 B에서 A로 이동했을 때 A의 단일 인스턴스를 표시하지만

* 아무런 플래그도 추가되지 않았습니다.

새 작업을 만드는 대신 활동 B가 활동 A의 맨 위에 밀어 넣은 이유는 무엇입니까 (활동에 시작 모드가 "singleInstance"였기 때문에)? 활동

목록 :

TaskRecord {14ba4a25 # 18 A = com.example.nischay.notification U = 0 SZ = 2} 실행 # 1 : ActivityRecord {2a37b313 U0의 com.example.nischay. 알림/.SecondActivity의 T18} 실행 # 0 : ActivityRecord {1ab16fa7의 U0의 com.example.nischay.notification/.MainActivity의 T18}

mResumedActivity: ActivityRecord{2a37b313 u0 com.example.nischay.notification/.SecondActivity t18} mLastPausedActivity: ActivityRecord{1ab16fa7 u0 com.example.nischay.notification/.MainActivity t18}

세부 사항 :

장치 : 레노버 k50a40 안드로이드 버전 : 5.0 CompileSdkVersion : 25

코드

Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE_NOTIFY);

+0

매니페스트 게시 –

+0

@DavidWasser 매니페스트를 게시했습니다. 감사. –

+0

시도해보십시오. 전화로 앱을 설치하십시오. 이제 앱을 종료하십시오 (설정 -> 앱 -> YourApp-> 강제 종료). 이제 App-Icon을 클릭하여 HOME 화면에서 응용 프로그램을 시작하십시오. 이제'ActivityB'를 시작하십시오. 이제'adb shell dumpsys activity activities'를 사용하고 목록에서 당신의 작업을 점검하십시오. 1 개의 작업 또는 2 개의 작업이 있습니까? 귀하의 질문에 관련 정보를 게시하십시오. –

답변

1

빙고! 마침내이 이상한 행동에 대한 설명!

당신은이 같은 MainActivity에서 SecondActivity을 시작했다 :

Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
startActivityForResult(intent, REQUEST_CODE_NOTIFY); 

startActivityForResult()를 사용하여, 를 시작하는 Activity이 결과를 기대 Activity 같은 작업에서 실행해야합니다 (예 : 발사 Activity). 그렇기 때문에 Android는 launchModeMainActivity이고 처음 작업이 SecondActivity 인 것을 무시합니다.

문서화되지 않은 충돌이 발생했습니다. 문제를 해결하려면 원하는 것을 결정해야합니다. startActivityForResult()을 호출하는 singleInstanceActivity을 가질 수 없습니다. SecondActivityMainActivity 사이에서 통신 할 다른 메커니즘을 선택하거나 MainActivity의 특수 실행 모드를 제거하십시오.

어쨌든 MainActivitysingleInstance으로 바꾸시겠습니까? 이것에 대한 이유가 있습니까?

+0

고마워요. 예, 이것이 이유였습니다. 나는 이것을 생각했지만 문서에 따라 혼란 스러웠습니다. ** 예를 들어, 실행중인 활동이 FLAG_ACTIVITY_NEW_TASK를 사용하면 작업에서 실행되지 않으므로 즉시 취소 결과를 받게됩니다. **. 기본적으로 나는 "singleInstance"를 달성하는 편집기 (MainActivity)를 만들었습니다. –

+0

'singleInstance'가 필요한 이유가 아직도 이해가 안됩니다. 일반적으로 홈 화면 대체품을 만드는 경우에만 필요합니다 (그렇지 않은 경우). –

+0

도움이 되었다면 내 대답을 수락 할 수 있습니다. 답이없는 질문 목록에서 질문을 제거합니다. 아니면 여전히 문제가 있습니까 ?? –