2011-02-05 2 views
5

일부 정보가 들어있는 SMS 메시지를 가로 채고 있습니다. 그런 다음 내 SmsListener에서 상태 표시 줄에 표시 할 알림을 만들고 있습니다. 사용자가 알림을 클릭 할 때 그런 다음, I (예 : 활동이 존재하지 않는 아직 작성해야하는 경우)액티비티를 포어 그라운드로 가져 오는 방법 (또는 존재하지 않는 경우 생성)

  1. 일부 UI를 수행 SMS
  2. 에서 데이터를
  3. 패스 전경 MainActivity를 가져와 원하는 이 MainActivity에서이 데이터를 근거로 변경

내 활동

<activity 
     android:name=".MainActivity" 
     android:screenOrientation="sensor" 
     android:label="@string/app_name" 
     android:launchMode="singleTask"/> 
으로 정의된다3210

활동

나는 방법 onNewActivity 오버라이드 (override) 한 내 활동 또한
Intent i = new Intent(); 
i.setClass(context, MainActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(i); 

으로 시작됩니다

@Override 
public void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); 

    // I have data from broadcast in intent variable passed to this activity 
    processDataFromBroadcast(intent); 
} 

그것은 MainActivity이 이미 존재하는 경우 잘 작동하지만, MainActivity가 존재하지 않는 경우 그러나 onNewIntent 아니었다 시작

그런 다음 onCreate : processDataFromBroadcast(getIntent())에서 processDataFromBroadcast를 호출하려고했습니다. 첫 번째 데이터가 내 브로드 캐스트에서 활동으로 올바르게 전달됩니다. 그러나 MainActivity가 백그라운드로 전송 된 다음 다시 foreground로 가져 오면 onCreate 또는 onNewIntent가 호출되고 processDataFromBroadcast가 브로드 캐스트로 전송 된 의도로 다시 실행되므로 내 MainActivity가 앱이 포 그라운드로 가져올 때마다 브로드 캐스트 데이터로 업데이트됩니다. 후자는 원하지 않습니다. 처음으로 처리 한 후이 의도를 잊어 버릴 수있는 방법은 무엇입니까? Here is sample application.

답변

5

활동이 자체의 단 하나의 인스턴스를 실행하기 위해 는 <activity> 매니페스트 요소에서 봐 가지고, 특히 android:launchMode. singleTask 또는 singleInstance 중 하나로 구성하려고합니다.

활동에 데이터를 전달하려면 데이터를 열기 위해 사용하는 Intent에 데이터를 추가하십시오. 인 텐트가있는 데이터를 전달하려면 해당 데이터를 보내기 전에 putExtra() 의도 메소드를 사용하고 수신 활동에서 가져 오는 방법은 getExtra() 메소드를 사용하십시오.

대략 의도가 어떻게 작동하는지 알고 있다고 가정하지만, 그렇지 않다면 this Android 개발자 문서를 살펴보고 의도에 대해 자세히 알 수 있습니다. 난 그냥 같은 문제로 실행되면서 문제가 여전히 해결되지 않은 경우

+0

응답 해 주셔서 감사합니다. 그러나 질문에 대한 내 업데이트를 참조하십시오. – Solvek

+0

활동에는 활동을 트리거 한 의도를 검색하는 getIntent() 메소드가 있습니다. 첫 번째 인스턴스화에 대한 의도 만 처리하려는 경우 onCreate()에서이 작업을 수행 할 수 있습니다. 아시다시피 onCreate()는 액티비티가 메모리에 없을 때만 호출됩니다. – rogerkk

+0

흠, 죄송합니다. 벌써 해 보았으므로 업데이트 내용을 제대로 읽지 못했습니다. 난 당신이 내 애플 리케이션 중 하나에서 뭘하고 꽤 많이하고 있어요, 그리고 지금 볼 수있는 유일한 차이점은 내가 singleInstance launchmode를 사용하고, android : alwaysRetainTaskState를 true로 설정했다는 것입니다. 내 onCreate()는 활동을 다시 열 때 확실히 트리거되지 않습니다. – rogerkk

1

, 여기에 내가 그것을 해결 방법은 다음과 같습니다

내가 그것을 창조의 기간 동안 의도에 따라 추가로 intentId으로 타임 스탬프를 걸었습니다. 처음으로, 나는 목적을 처리하고 있습니다 onCreate() 또는 onNewIntent() 나는 intentId를 읽고 마지막 의도를 처리하여 저장합니다. 그래서 다음 번에 onCreate() 또는 onNewIntet()이 호출됩니다. intentId를 검사 할 수 있으며 처리 된 마지막 의도의 ID와 같으면 무시합니다! 이것은 당신의 경우에 도움이되는지, 아마도 당신이 그것을 채택 할 수 있는지 모르겠습니다.

intentId를 활동 수명주기와 독립적으로 유지하려면 userdefaults에 유지할 수 있습니다.

나는 onNewIntentsetIntent(new Intent())을 부르는 것이 트릭을해야한다고 동의합니다.

0

답변이 늦었지만 해결책을 찾는 다른 사용자에게 도움이 될 수 있습니다.

그냥 코드 줄 아래에 추가 : SplashActivity 응용 프로그램의 첫 화면이다 초기 응용 프로그램의 이름입니다

Intent mIntent = new Intent(this, SplashActivity.class); 
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting the activity from a service 
mIntent.setAction(Intent.ACTION_MAIN); 
mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

.

희망이 있습니다. :)

관련 문제