다음과 같이 다른 활동에서 한 활동을 완료하고 싶습니다.
활동 [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();
답변
-
매니페스트 파일에서 활동 A를 만듭니다.
launchMode = "singleInstance"
-
사용자가 new를 클릭
FirstActivity.fa.finish();
하면 새로운 Intent를 실행하고 호출합니다. -
사용자가 수정을 클릭하면 새 인 텐트를 호출하거나 단순히 활동 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
의도를 사용하여 호출해야 할 것입니다.
답변
할 수 있지만 정상적인 활동 흐름을 깨서는 안된다고 생각합니다. 활동을 마치고 싶다면 활동 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);
나는 그것이 당신에게 효과가 있기를 바랍니다 …
답변
이것은 상당히 표준적인 의사 소통 질문입니다. 한 가지 접근 방식은 활동 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());
그런 식으로 시도하십시오.
답변
귀하의 경우에 사용할 수있는 한 가지 접근 방식이 있습니다.
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
}
답변
요청 코드로 활동 시작 :
StartActivityForResult(intent,1234);
다음과 같은 다른 활동에서 닫을 수 있습니다.
finishActivity(1234);
답변
Stack Overflow 질문에 대한 내 답변 보기 이전 모든 활동 완료 . .
필요한 것은 Intent.FLAG_CLEAR_TOP
. 이 플래그는 스택에서 대상 활동 위의 모든 활동이 완료되고 표시되는지 확인합니다.
필요한 또 다른 것은 SINGLE_TOP
깃발입니다. 이 기능을 사용하면 스택에 이미 생성 된 액티비티가있는 경우 Android에서 새로운 액티비티를 생성하지 못합니다.
활동이 이미 생성 된 경우 이러한 플래그가있는 인 텐트 onNewIntent(intent)
는 대상 활동에서 호출 된 메서드 (이를 처리하려면 오버로드해야 함)로 전달됩니다 .
그런 다음 onNewIntent
다시 시작이라는 메서드 또는 finish()
자체에 대한 새로운 인 텐트를 호출 하고 시작하는 repopulate()
메서드 또는 새 데이터를 설정 하는 메서드가 있습니다. 저는 두 번째 방법을 선호합니다. 비용이 적게 들고 onCreate
채우기를 위해 호출 할 수있는 별도의 메서드로 논리를 추출
할 수 있습니다.
답변
방금 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);
}