다른 활동에서 활동 완료


101

다음과 같이 다른 활동에서 한 활동을 완료하고 싶습니다.

활동 [A]에서 버튼을 클릭하면 활동 [A]를 끝내지 않고 활동 [B]를 호출합니다.

이제 활동 [B]에는 새로 만들기수정 두 개의 버튼이 있습니다 . 사용자가 수정을 클릭하면 모든 옵션이 선택된 상태로 스택에서 활동 [A]를 팝합니다.

하지만 사용자 가 Activity [B]에서 New 버튼을 클릭 하면 스택에서 Activity [A]를 완료하고 해당 Activity [A]를 스택에 다시로드해야합니다.

시도하고 있지만 스택에서 활동 [A]를 완료 할 수 없습니다. 어떻게해야합니까?

코드를 다음과 같이 사용하고 있습니다.

활동 [A]에서 :

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

같은 활동의 다른 방법

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

그리고 활동 [B]에서 버튼 클릭 :

setResult(1);
finish();

이봐, 당신은 다른 활동에서 하나의 활동을 끝내고 싶었습니다. 그런데 왜 투표를 했습니까?
Manjunath

여기에 몇 가지 좋은 답변이있는 스레드가 있습니다. stackoverflow.com/questions/14355731/…
ab

답변:


189
  1. 매니페스트 파일에서 활동 A를 만듭니다. launchMode = "singleInstance"

  2. 사용자가 new를 클릭 FirstActivity.fa.finish();하면 새로운 Intent를 실행하고 호출합니다.

  3. 사용자가 수정을 클릭하면 새 인 텐트를 호출하거나 단순히 활동 B를 완료합니다.

첫 번째 방법

첫 번째 활동에서 다음 Activity object과 같이 선언 하십시오.

public static Activity fa;
onCreate()
{
    fa = this;
}

이제 다른 개체 Activity에서이 개체를 사용하여 이와 같은 첫 번째 활동을 완료합니다.

onCreate()
{
    FirstActivity.fa.finish();
}

두 번째 방법

FirstActivity이동하자마자 끝내고 싶은 액티비티 를 호출하면서 호출하면서 플래그를 추가 할 수 있습니다.FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

그러나이 플래그를 사용하면 원하지 않는 경우에도 활동이 완료됩니다. 그리고 언젠가 onBack당신이 보여주고 싶다면 FirstActivity의도를 사용하여 호출해야 할 것입니다.


6
좋은 대답 .. !!
하기 Vaibhav Vajani

93
활동에 대한 정적 참조를 보유하고 있습니다. 어딘가에서 수동으로 지우지 않으면 절대 사라지지 않을 것입니다-> 메모리 누수가 발생합니다!
DArkO

5
글쎄요, 당신은 기본적으로 생각하는 것에 대한 +1을 가지고 있습니다. : D, 나는 단지 singleTop으로 바꿀 것입니다. 그러나 비슷한 일을 할 때 여전히 첫 번째 선택이 아닙니다. 정리 코드는 메모리 누수가 없도록 정적 참조를 제거하는 방법을 의미했지만 앱 구조에 따라 다릅니다.
DArkO

6
아무도 첫 번째 해결책을 사용하지 마십시오. 완전히 잘못되었습니다. 좀비 개체를 만드는 동안 정말 해키 방식으로 Android 프레임 워크를 우회하고 있습니다. BroadcastReceiver를 사용하십시오.
S-K '

1
멋진 솔루션. A-> B-> C 활동에서 C의 onBackPressed에서 B의 새 인스턴스를 시작하는 내 문제에 대해 매우 잘 작동했습니다. 그러나 B의 새 인스턴스에서 onBackPressed를 수행하면 A의 이전 인스턴스 (내가 원하는) 대신 B의 이전 인스턴스로 이동합니다. 나는 C의 onBackPressed에서 첫 번째 방법을 따라, 그리고 그것은 나에게 내가 원하는 동작 : 감사합니다 톤 : 준
SoulRayder

87

할 수 있지만 정상적인 활동 흐름을 깨서는 안된다고 생각합니다. 활동을 마치고 싶다면 활동 B에서 활동 A로 브로드 캐스트를 보낼 수 있습니다.

활동을 시작하기 전에 broadcast receiver를 만듭니다 B :

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

B에서 활동 A를 완료하려면 활동 B에서 활동 A로 브로드 캐스트를 보냅니다.

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

나는 그것이 당신에게 효과가 있기를 바랍니다 ...


"registerReceiver (broadcast_reciever, new IntentFilter ("finish_activity "));"에 "토큰의 구문 오류, 대신 AnnotationName이 예상됩니다."라는 오류가 표시됩니다. 뭐가 문제 야?
Behzad

2
"당신은 정상적인 활동의 흐름을 깨지 말아야합니다"이것에 대한 +1
S-K '

11
등록 취소 broadcast_receiver를 잊지 마세요unregisterReceiver()
Jaec 2014


이것이 해결책입니다. 좋은 일
Parinda Rajapaksha

17

이것은 상당히 표준적인 의사 소통 질문입니다. 한 가지 접근 방식은 활동 A에서 ResultReceiver를 사용하는 것입니다.

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

그런 다음 활동 B에서 다음과 같이 요청에 따라 완료 할 수 있습니다.

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

그런 식으로 시도하십시오.


6
+1 just, ((ResultReceiver) getIntent (). getParcelableExtra ( "finisher")). send (1, new Bundle ());
Hamidreza Sadegh

12

귀하의 경우에 사용할 수있는 한 가지 접근 방식이 있습니다.

1 단계 : 활동 A에서 활동 B 시작

startActivity(new Intent(A.this, B.class));

2 단계 : 사용자가 수정 버튼을 클릭하면 FLAG_ACTIVITY_CLEAR_TOP.Also를 사용하여 활동 A를 시작 하고 추가로 플래그를 전달합니다.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

3 단계 : 사용자가 추가 버튼을 클릭하면 FLAG_ACTIVITY_CLEAR_TOP.Also를 사용하여 활동 A를 시작하고 추가로 플래그를 전달합니다. FLAG_ACTIVITY_CLEAR_TOP대상까지 열려있는 모든 활동을 지우고 대상 활동에 시작 모드가 정의되지 않은 경우 다시 시작합니다.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

4 단계 : 이제 onCreate()활동 A의 메서드, 해당 플래그를 검색해야합니다.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}


5

Stack Overflow 질문에 대한 내 답변 보기 이전 모든 활동 완료 . .

필요한 것은 Intent.FLAG_CLEAR_TOP . 이 플래그는 스택에서 대상 활동 위의 모든 활동이 완료되고 표시되는지 확인합니다.

필요한 또 다른 것은 SINGLE_TOP 깃발입니다. 이 기능을 사용하면 스택에 이미 생성 된 액티비티가있는 경우 Android에서 새로운 액티비티를 생성하지 못합니다.

활동이 이미 생성 된 경우 이러한 플래그가있는 인 텐트 onNewIntent(intent)는 대상 활동에서 호출 된 메서드 (이를 처리하려면 오버로드해야 함)로 전달됩니다 .

그런 다음 onNewIntent다시 시작이라는 메서드 또는 finish()자체에 대한 새로운 인 텐트를 호출 하고 시작하는 repopulate()메서드 또는 새 데이터를 설정 하는 메서드가 있습니다. 저는 두 번째 방법을 선호합니다. 비용이 적게 들고 onCreate채우기를 위해 호출 할 수있는 별도의 메서드로 논리를 추출 할 수 있습니다.


4

방금 Nepster의 솔루션을 적용했으며 매력처럼 작동합니다. 조각에서 실행하기위한 사소한 수정이 있습니다.

당신의 파편에

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

그리고 다시 시작하려는 활동의 OnNewIntent ()에.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

2

B에서 new를 누르는 가장 쉬운 방법이있는 것 같아요 ..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

그리고 A에서 그것을 얻으십시오

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

1

나는 이것이 오래된 질문이라는 것을 알고 있으며, 이러한 방법 중 일부는 나를 위해 작동하지 않았으므로 미래를 찾고 있거나 내 문제가있는 사람에게는 이것이 나를 위해 일했습니다.

나는 그 메서드를 오버로딩 onPause하고 호출 finish()했습니다.


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