청산 의도


111

내 Android 앱이 정보를 전달하는 인 텐트 (상태 표시 줄에 보류중인 인 텐트)에 의해 호출됩니다.

홈 버튼을 누르고 홈 버튼을 길게 눌러 앱을 다시 열면 인 텐트가 다시 호출되고 동일한 추가 항목이 여전히 존재합니다.

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
    }

이것은 예상대로 실행되지 않는 코드입니다.

    String imgUrl;
    Bundle extras = this.getIntent().getExtras();


    if(extras != null){
        imgUrl = extras.getString("imgUrl");
        if( !imgUrl.equals(textView01.getText().toString()) ){

            imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
            layout1.setVisibility(0);
            textView01.setText(imgUrl);//textview to hold the url

        }

    }

그리고 내 의도 :

public void showNotification(String ticker, String title, String message, 
    String imgUrl){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;        // icon from resources
    long when = System.currentTimeMillis();         // notification time
    CharSequence tickerText = ticker;              // ticker-text

    //make intent
    Intent notificationIntent = new Intent(this, activity.class);
    notificationIntent.putExtra("imgUrl", imgUrl);
    notificationIntent.setFlags(
        PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);
    PendingIntent contentIntent = 
        PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);

    //make notification
    Notification notification = new Notification(icon, tickerText, when);
    notification.setLatestEventInfo(this, title, message, contentIntent);
    //flags
    notification.flags = Notification.FLAG_SHOW_LIGHTS | 
        Notification.FLAG_ONGOING_EVENT | 
        Notification.FLAG_ONLY_ALERT_ONCE | 
        Notification.FLAG_AUTO_CANCEL;
    //sounds
    notification.defaults |= Notification.DEFAULT_SOUND;
    //notify
    mNotificationManager.notify(1, notification);
}

의도를 지우거나 이전에 사용되었는지 확인하는 방법이 있습니까?


코드를 게시 할 수 있습니까?
xandy

내 질문에 코드를 추가했습니다
Mars

인 텐트를 지우는 대신 시작 유형을 결정하고 그에 따라 앱 흐름을 처리 할 수 ​​있습니다. 백그라운드가 아닌 알림을 위해 실행되는 경우에만 Extras를 가져옵니다. stackoverflow.com/questions/4116110/clearing-intent/…
BB

답변:


168

최신 정보:

5 년 전에 처음 썼을 때이 답변이 그렇게 많이 언급 될 줄 몰랐습니다!

@ tato-rodrigo 답변에 따라 이것은 일부 상황에서 이미 처리 된 의도를 감지하는 데 도움이되지 않는다는 점을 분명히 할 것입니다.

또한 나는 이유를 위해 따옴표 안에 "명확"을 넣었다는 점을 지적해야합니다. 이 작업을 수행하여 의도를 실제로 지우는 것은 아닙니다. 이 의도가 이미 활동에 의해 표시되었다는 플래그로 여분의 제거를 사용하는 것입니다. .


나는 똑같은 문제가 있었다.

위의 답변은 저를 올바른 길로 인도했으며 더 간단한 해결책을 찾았습니다.

getIntent().removeExtra("key"); 

인 텐트를 "지우기"하는 메서드 호출.

1 년 전에 질문 한 이후로 약간 늦게 답변했지만, 앞으로 다른 사람들에게 도움이되기를 바랍니다.


4
removeExtra () 메서드가 String 매개 변수를 사용하지 않습니까? 이와 같이 getIntent (). removeExtra ( "String");
tony9099

25
@Maks 내가 틀렸을 수 있지만 다음 시나리오에서는 작동하지 않을 것이라고 생각합니다. 1) 알림을 통해 활동을 엽니 다. 2) 뒤로 버튼을 눌러 활동을 마칩니다. 3) 기록 (최근 앱)을 통해 활동을 다시 엽니 다. 또 다른 경우는 리소스 부족으로 인해 시스템이 앱을 종료하는 경우입니다 (개발자 옵션에서 "활동을 유지하지 않음"을 활성화 한 다음 홈을 누른 다음 기록에서 활동을 다시여십시오). 아래에 사용중인 솔루션을 게시했습니다. 이것에 대해 언급 할 수 있다면 좋을 것입니다.
tato.rodrigo 2014-08-27

2
불행히도 그것은 우리에게 효과가 없습니다. 우리는 새로운 활동을 시작하여 차례로 초기 활동을 시작하면 OnNewIntent가 동일한 의도로 다시 실행된다는 것을 발견했습니다.
Le-roy Staines 2014

2
인 텐트를 지우는 대신 시작 유형을 결정하고 그에 따라 앱 흐름을 처리 할 수 ​​있습니다. 백그라운드가 아닌 알림을 위해 실행되는 경우에만 Extras를 가져옵니다. stackoverflow.com/questions/4116110/clearing-intent/…
BB

2
나를 위해 일하지 않았다. 나는 @ tato.rodrigo가 알림을 통해 활동이 열리거나 기록 또는 그가 언급 한 다른 이유에서 의도가 지워지지 않는 곳에서 언급 한 것과 동일한 문제에 직면했기 때문에 의도 정보를 소비 한 후 의도를 재설정하는 것이 었습니다. 이것 setIntent(new Intent())과 지금은 잘 작동합니다.
Shubhral 2017-06-20

43

편집 : 사용중인 완전한 솔루션을 게시하기 위해 편집 중입니다.

이 솔루션은 문제가 "활동이 기록 (최근 앱)에서 시작될 때 일부 코드를 실행하지 않음"인 경우 작동합니다 .

우선, a boolean를 선언하여 이미 소비 Activity되었는지 여부를 나타냅니다 Intent.

    private boolean consumedIntent;

그런 다음 onSaveInstanceStateonCreate메서드를 사용하여이 값을 안전하게 저장하고 복원하여 구성 변경 사항과 시스템이 Activity백그라운드로 전환 될 때 시스템이 죽일 수있는 경우를 처리합니다 .

    private final String SAVED_INSTANCE_STATE_CONSUMED_INTENT = "SAVED_INSTANCE_STATE_CONSUMED_INTENT";

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT, consumedIntent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //set content view ...

        if( savedInstanceState != null ) {
            consumedIntent = savedInstanceState.getBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT);
        }

        //other initializations
    }

이제 onResume메서드에서 코드를 실행할 수 있는지 확인하십시오 .

    @Override
    protected void onResume() {
        super.onResume();

        //check if this intent should run your code
        //for example, check the Intent action
        boolean shouldThisIntentTriggerMyCode = [...];
        Intent intent = getIntent();
        boolean launchedFromHistory = intent != null ? (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 : false;
        if( !launchedFromHistory && shouldThisIntentTriggerMyCode && !consumedIntent ) {
            consumedIntent = true;
            //execute the code that should be executed if the activity was not launched from history
        }
    }

또한가로 Activity구성된 경우 singleTop새 항목 Intent이 전송 될 때 플래그를 재설정해야합니다 .

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        consumedIntent = false;
    }

12
감사합니다! 내가이 코드를 도왔 (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)으므로 이제 활동 시작이 언제 역사에서 왔는지 알아낼 수 있고 추가 항목을 무시할 수 있습니다.
Roman Nazarevych 2014

1
@Lemberg 저도 같은 문제를 가지고 있고, 당신처럼 해결했습니다. 푸시 알림에서 나온 추가 기능을 사용하는 경우 기록에서 활동을 시작하고 추가 항목을 소비하고 동일한 작업으로 리디렉션 할 위험이 있습니다. 푸시 알림. 플래그 launchedFromHistory 당신이 알고하는 데 도움이 될 수 있습니다
Stoycho 안드리

활동이 파괴 되어도 히스토리 스택에서 다시 열어도 작동합니까?
user25

큰! 앱이 파괴 된 경우에도 작동하는 것 같습니다 ...하지만 @ tato.rodrigo boolean shouldThisIntentTriggerMyCode = [...];를 답변에서 제거하십시오 (무엇을 위해 사용됩니까?)
user25

특정 사용자에 대한 다중 알림의 경우 알림 Uid consumedIntentString포함하는 것이 더 나은 사용자 입니다. 이 Uid는 백엔드의 알림에 현재 타임 스탬프로 간단히 추가 할 수 있습니다. 또한이 Uid는 onSaveInstanceStateIntent가 생성 된 경우에만 저장해야합니다 onCreate. 즉, .NET에서 Uid를 저장하지 않아야합니다 onNewIntent.
Konstantin Konopko

22

Maks 대답은 추가 항목을 지우는 데 효과적입니다.

    getIntent().removeExtra("key"); 

또 다른 유용한 명령은 다음과 같습니다.

    getIntent().setAction("");

다음을 호출하여 인 텐트에 태그를 지정할 수도 있습니다.

    getIntent().putExtra("used", true);

그런 다음 값을 확인하십시오.


21

History (최근 앱)에서 Android 앱을 시작하면 주로 세 가지 다른 인 텐트 플래그를 사용하여 앱을 시작할 수 있습니다.

  1. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    최소화 된 앱의 기록에서 활동이 시작되는 경우입니다 (홈 키를 길게 누름).
    상수 값 : 1048576 (0x00100000)
  2. FLAG_ACTIVITY_NEW_TASK
    이것은 "애플리케이션 아이콘 클릭"또는 " 의도 필터 " 를 통해 활동이 시작되는 경우 입니다. 여기서 활동은이 기록 스택에서 새 작업의 시작이됩니다.
    상수 값 : 268435456 (0x10000000)
  3. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
    뒤로 버튼을 눌러 앱을 종료 한 다음 기록 (최근 앱)에서 다시 시작했을 때입니다.
    상수 값 : 269484032 (0x10100000)

상수 값은 다음을 통해 검색 할 수 있습니다. getIntent().getFlags()

세 번째 경우 Android는 메모리에서 마지막 인 텐트 값을 다시로드합니다. 따라서 앱의 의도 (getIntent )는 앱을 시작한 마지막 인 텐트의 값을 갖게됩니다.

실제로 앱은 이전 출시의 인 텐트 값이 아닌 새로 출시 된 인 텐트 값을 사용하여 새로 출시 된 것처럼 동작해야합니다. 이 동작은 앱 아이콘을 클릭하여 앱을 시작하면 볼 수 있으며 이전 인 텐트 값이 없습니다. 이는 Android가이 시나리오에 대해 다음 인 텐트 필터를 사용하기 때문입니다.

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

그러나 세 번째 경우 (종료 된 앱, 최근 앱 기록에서 시작됨)의 경우 Android OS는 종료되기 전에 앱을 시작한 마지막 인 텐트를 사용합니다 (뒤로 버튼을 눌러). 따라서 오래된 의도 값이 생기고 앱 흐름이 적절하지 않습니다.

의도를 제거하는 것은 문제를 해결하는 한 가지 방법이지만 문제를 완전히 해결하지는 못합니다! Android OS는 시작 인 텐트의 마지막 인스턴스가 아닌 마지막 실행 앱에서 인 텐트를 다시로드합니다.

이를 방지하는 깨끗한 방법은 Intent 유형을 가져 와서 처리하는 것입니다. 은 시작 유형을 결정하기 위해 입니다.

따라서 LaunchActivity (매니페스트에 인 텐트 필터가 정의 된 것) onCreate()에서 onStart(), 또는 onResume()메서드 에 다음 코드를 사용할 수 있습니다 .

if(getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) {
    //app is launched from recent apps after it was closed
        normalLaunch();
    } else {
        String intentAction = getIntent().getAction();
        String scheme = getIntent().getScheme();
        //app is launched via other means
        // URL intent scheme, Intent action etc
        if("https".equalsIgnoreCase(scheme)) {
            // URL intent for browser
        } else if("com.example.bb".equalsIgnoreCase(intentAction)) {
            // App launched via package name
        } else {
            // App was launched via Click on App Icon, or other means
            normalLaunch();
        }
    }

normalLaunch()텐트의 매개 변수를 사용해서는 안된다고 생각합니다. 그렇지 않으면 Intent 매개 변수를 사용하지 않도록 기본 시작 방법을 분리하고 최적화해야합니다.


1
모든 영웅이 모자를 쓰는 것은 아닙니다!
Sdghasemi

모르겠지만 getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY다른 활동 (startActivity 메서드)에서 활동을 시작하거나 히스토리 스택 (최근 앱)에서 다시 여는 경우 항상 true를 반환합니다 .
user25 apr

다른 플래그, 어쩌면 FLAG_ACTIVITY_NEW_TASK와 함께 사용 할 것이다
BB

1
Dev 설정 "Do n't keep activities"로 인해 백그라운드에서 활동이 종료되면 작동하지 않습니다. 이 경우 getIntent () getFlags ()는 활동이 처음 시작되었을 때와 동일합니다.
Malachiasz

설명을 주셔서 감사하지만, 같은 목적으로하지 않습니다
Azlan 자말

18

의도 개체 지우기 :

intent.replaceExtras(new Bundle());
intent.setAction("");
intent.setData(null);
intent.setFlags(0);

2
이것은 받아 들여진 대답이어야합니다. 정말 잘 작동합니다!
Martin Erlic 2015

2
때 "활동을 유지하지 않는다"작업은 개발자 옵션에 체크하지 않습니다
Jemshit Iskenderov에게

8

짧은 대답은 No way

긴 대답. "일회성"의도와 같은 것은 없습니다. 실험을 통해 현대 Android의 최근 활동 내역은 "의도 내역"에 지나지 않습니다. 활동에 전달 된 최신 인 텐트는 시스템에 로그인하기 만하면됩니다. 위의 사람들은 사용을 제안합니다.

setAction("")

그러나 인 텐트는 onNewIntent () 또는 onStart () 메서드 내부에서 가져올 때까지 이미 기록되어 있기 때문에 작동하지 않습니다.

의도 사용을 피하여 문제를 해결했습니다. 내 문제는 저자가 게시 한 것과 비슷했습니다. 알림 영역의 제어를 통해 응용 프로그램에서 Global Exit를 구현하려고했습니다. 기본 서비스를 중지하고 앱의 모든 활동을 닫아야합니다. Waze 애플리케이션에서도 동일한 동작을 찾을 수 있습니다.

알고리즘 :

  1. 활동에 "종료"조치를 전달하는 알림 제어를위한 PendingIntent를 작성하십시오. 그러나 단순한 대리인 특별한 활동에.
  2. 프록시 활동 onStart () 코드는 인 텐트를 파싱하고 작업을 확인하며 일부 모델의 상태를 "종료 됨"으로 설정합니다.
  3. 프록시 활동 onStart () 코드는 setIntent ( "")를 사용하여 원래 인 텐트를 지운 다음 startActivity (intent)를 호출하여 대상 "루트"활동으로 전달합니다.
  4. 프록시 활동 onStart () 코드는 finish ()를 호출합니다.
  5. 대상 활동의 onStart () 및 onNewIntent () 내부에서 모델 상태를 확인하고 "Exited"인 경우 finish ()를 호출합니다 (제 경우에는 stopService ()도 호출합니다).

나는 인터넷에서 답을 찾지 못했기 때문에 이것이 누군가에게 도움이되기를 바랍니다.


"의도를 지우는 것"이 ​​반드시 "특정 추가 항목 제거"를 의미하는 것은 아니기 때문에 이것이 가장 정확한 대답이라고 생각합니다. 그렇게하는 쉬운 방법도 없다고 생각합니다.
mdelolmo

5

사용 중인지 확인 PendingIntent.FLAG_UPDATE_CURRENT에 대한 플래그를 PendingIntent .

PendingIntent pendingIntent = PendingIntent.getActivity(this, 100, mPutIntent, PendingIntent.FLAG_UPDATE_CURRENT);

어디 mPutIntent당신입니다Intent .

이것이 당신을 도울 것입니다.


1
내 생명을 구했어 !!
eren130

1
나는 이것이 어떻게 받아 들여지지 않는 대답인지 이해하지 못합니다. 내 유일한 후회는 단 하나입니다 : 하나의 찬성 투표를하는 것입니다. 건배.
Andy

2

최근에이 문제가 발생했으며 타임 스탬프를 인 텐트에 추가 매개 변수로 추가하여 해결했습니다.

private void launchActivity(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra("KEY_EXTRA_TIMESTAMP", System.currentTimeMillis());
    context.startActivity(intent);
}

그런 다음 공유 환경 설정에 타임 스탬프를 저장합니다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    long time = getIntent().getLongExtra("KEY_EXTRA_TIMESTAMP", -1);
    long previousTime = getPreferences(MODE_PRIVATE).getLong("timestamp", -1);

    //ignore if the timestamp is the same as the previous one  
    if (time != previousTime) {
        handleIntent(getIntent());
        if (time != -1) {
            //save the timestamp
            getPreferences(MODE_PRIVATE).edit().putLong("timestamp", time).apply();
        }
    }
}

1

나는 똑같은 문제가 있습니다. 내 해결책은 '사용' boolean할 때 설정 한 변수 Intent와이를 if기반으로하는 문 을 추가하여 사용 boolean여부를 확인하는 것이 Intent었습니다.


3
활동이 중지 된 다음 다시 시작될 때 부울 값이 다시 생성되기 때문에 (활성에서 전역으로 선언 된 경우) 작동하지 않을 수 있습니다. (예 : 홈 버튼 클릭)
tony9099

1

인 텐트 처리가 완료되면 다음을 수행하십시오.

setIntent(null);

처리 된 인 텐트를 다시 볼 수 없으며 처리 된 인 텐트의 내용을 편집하여 문제를 마스킹하지 않습니다.


1

Intent Extra를 제거하는 방법을 찾을 수 없습니다 . "활동을 유지하지 않음" 을 활성화하면 인 텐트에서 추가 항목을 제거하는 것에 대한 답변이 작동 하지 않습니다.개발자 옵션에서 " (그러면 활동을 제거하고 추가 항목이 아직 있는지 테스트하기 위해 돌아올 수 있습니다).

문제에 대한 해결책 으로 Intent Extras가 처리 된 후 SharedPreferences 에 부울 값을 저장했습니다 . 동일한 Intent가 Activity에 다시 전달되면 SharedPreference 값을 확인하고 Intent Extra를 처리하기로 결정합니다. 동일한 Activity에 다른 새로운 Intent Extra를 보내는 경우 SharedPreference 값을 false로 설정하면 Activity가 처리합니다. :

// Start Activity with Intent Extras
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("someData", "my Data");
// Set data as not processed
context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", false).commit();
context.startActivity(intent);

...

public class MyActivity{

    ...
    public void someMethod(){
        boolean isExtrasProcessed = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).getBoolean("myActivityExtraProccessed", false);  
         if (!isExtrasProcessed) {
              // Use Extras

              //Set data as processed
              context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", true).commit();
         }
    }

}

startActivity를 사용하여 활동을 시작했는지 또는 History Stack에서 다시 열 었는지 모르기 때문에 환경 설정이 의미가 없습니다.
user25

@ user25 최근 앱에서 시작되었는지 감지하는 방법이 있다고 생각합니다. 그러나 중요합니까, 의도 추가는 소비되거나 소비되지 않는 경우 공유 환경에서 그것을 알고 있습니다. 푸시 알림을 추가로 사용하기 위해 이것을 사용했으며 내 경우에 활동이 어떻게 열리는지는 중요하지 않습니다.
Jemshit Iskenderov

0

Intent 및 Intent Extras가 파싱 된 후 수동으로 지운 후에도 Activity.getIntent ()가 항상 Activity를 시작한 원래 Intent를 반환하는 것처럼 보입니다.

이 문제를 해결하려면 다음과 같은 것이 좋습니다.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Intent provided by getIntent() (and its extras) will persist through a restore
    // via savedInstance.  Because of this, restoring this activity from a
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior
    // (ie...infinite loop of sending the user directly to somewhere else because of a
    // pre-defined alternate destination in the Intent's extras).
    //
    // To get around this, if restoring from savedInstanceState, we explicitly
    // set a new Intent *** to override the original Intent that started the activity.***
    // Note...it is still possible to re-use the original Intent values...simply
    // set them in the savedInstanceState Bundle in onSavedInstanceState.
    if (savedInstanceState != null) {
        // Place savedInstanceState Bundle as the Intent "extras"
        setIntent(new Intent().putExtras(savedInstanceState));
    }

    processIntent(getIntent())
}

private void processIntent(Intent intent) {
    if (getIntent().getExtras() == null) {
        // Protection condition
        return;
    }

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));

    final String somethingIDontWantToPersist = 
        intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");

    if(somethingIDontWantToPersist != null) {
        doSomething(somethingIDontWantToPersist);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save selective extras from original Intent...
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
    super.onSaveInstanceState(savedInstanceState);
}

이렇게하면 원래 의도 / 의도 엑스트라의 특정 부분을 명시 적으로 유지하는 기능을 유지하면서 원래 의도를 덤프하는 메커니즘이 있습니다.

모든 활동 시작 모드를 테스트하지는 않았습니다.


0

간단한 방법은 onCreate () 이외의 메서드에서 getIntent () 호출을 피하는 것입니다. 그러나 사용자가 홈 버튼을 탭하여 활동을 종료하면 다음 실행 중에 문제가 발생합니다. 나는이 문제에 완전한 기능적 해결책이 없다고 생각한다.


0

나는 같은 문제에 직면하고 위의 방법을 사용하려고 시도하지만 작동하지 않습니다.

싱글 탑 모드를 사용했던 acitvity의 런치 모드의 원인이 아닐까 생각합니다.

앱을 백그라운드로 사용하고 RamEater를 사용하여 의도가 항상 추가되는 문제를 시뮬레이션 할 때 null을 설정하거나 키를 제거합니다.

Android에서 기본 설정 저장소를 사용하여 통과했는지 확인하면 문제가 사라집니다.


0

추가 항목이 소비되었는지 여부를 알기 위해 다른 추가 항목을 추가하는 것은 좋은 습관이 아닙니다. 왜 이렇게하지 않습니까? :

if (intent.hasExtra(EXTRA_NAME) && intent.getBooleanExtra(EXTRA_NAME, false)) {
    // consume extra here after that set it to false
    putExtra(EXTRA_NAME, false)
}   

-1

이건 어때요? newIntent를 인 텐트로 설정합니다.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

1
나는 그것이 효과가 있다고 생각하지 않는다. 활동이 기록에서 다시 생성 될 때 의도는 영향을받지 않습니다.
mdelolmo

-1

의도를 지우고 싶을 때-빈 것으로 바꾸는 것은 어떻습니까?

예.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override 
public void onResume() {
    super.onResume();

    Intent theIntent = getIntent();
    if ("myaction".equals(theIntent.getAction()) {
         handleIntent();
         onNewIntent(new Intent());  // <--- "clear" the intent by setting empty one
    }
}

-1

이것은 모두에게 도움이 될 것입니다. 그래서 먼저 우리는 의도를 얻습니다.

//globally
Intent myIntent;

이것을 어딘가에 배치하십시오.

myIntent = getIntent();
String data = myIntent.getStringExtra("yourdata");
//Your process here

이제 앱이 파괴되거나 종료 될 때마다 데이터를 제거하도록 설정하겠습니다.

@Override
protected void onDestroy() {
    //TODO: Clear intents
    super.onDestroy();
    myIntent.removeExtra("data");
}
@Override
protected void onBackPressed() {
    //TODO: Clear intents
    super.onBackPressed();
    myIntent.removeExtra("data");
}

이것이 충분하지 않다면 더 많은 'on'콜백을 찾으십시오.


인 텐트는 앱을 종료 할 때만 지워집니다. 최근 항목을 스 와이프합니다.
Pixeldroid Modding

-2

Intent.removeExtra("key")는 엑스트라에서 특정 키 하나를 제거 하지만 매개 변수로 전달되는 경우 Intent에서 전체 엑스트라를 삭제하는 데 사용할 수있는 Intent.replaceExtras (Bundle) 메서드도 있습니다 null.

문서에서 :

인 텐트의 엑스트라를 주어진 엑스트라 번들로 완전히 교체하십시오.

매개 변수
extras Intent의 새로운 추가 항목 집합이거나 모든 추가 항목을 지우려면 null입니다.

putXXX () 메서드는 null 인 경우 새로운 Bundle로 엑스트라를 초기화하므로 문제가되지 않습니다.


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addCategory(Intent.CATEGORY_HOME);  
startActivity(intent);

2
수행중인 작업과 OP의 질문에 대한 답변에 대한 세부 정보를 제공하여 답변에 대해 자세히 설명해야합니다.
forsvarir

1
@Ramkumar 이것은 사용자를 집으로 데려갑니다. onPause, onStop 또는 onDestroy가 호출 될 수있는 10000 개의 케이스 중 단 하나의 케이스입니다.
tony9099

이것은 질문과 멀게도 관련이 없습니다
Hossein Shahdoost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.