IT TIP

한 번에 모든 활동 완료

itqueen 2020. 12. 31. 23:13
반응형

한 번에 모든 활동 완료


여러 페이지가있는 응용 프로그램이 있습니다. 즉, 여러 활동 중 일부는 열려 있습니다.

모든 활동을 한 번에 닫는 방법이 있습니까?


열려있는 모든 활동을 종료하려면 애플리케이션이 시작될 때 실행 되는 첫 번째 활동로드하는 버튼을 누른 다음 다른 모든 활동을 지운 다음 마지막 남은 활동을 완료해야합니다. 그렇게하려면 프로젝트에 다음 코드를 적용하십시오.

Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

위의 코드는 FirstActivity를 제외한 모든 활동을 완료합니다. 그런 다음 FirstActivity를 완료해야합니다. Firstactivity의 oncreate에 아래 코드를 입력하십시오.

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}

그리고 당신은 끝났습니다 ....


현재 활동과 모든 상위 활동을 완료 하는 finishAffinity()방법이 Activity있지만 Android 4.1 이상에서만 작동합니다.

API 16+의 경우

finishAffinity();

더 낮은 (Android 4.1 이하)의 경우

ActivityCompat.finishAffinity(YourActivity.this);

내가 찾은 최고의 솔루션은 API 레벨이 11 미만인 장치와 호환됩니다.

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

이 솔루션에는 Android 지원 라이브러리가 필요합니다.


API 16+의 경우

finishAffinity();

낮은 경우 사용

ActivityCompat.finishAffinity(YourActivity.this)

명확한 활동 기록을위한 세 가지 솔루션이 있습니다.

1) finish()새로운 활동을 시작할 때 의도를 통해 쓸 수 있습니다 .

2) Androidmanifest.xml 파일 android:noHistory="true"에 모든 <activity>태그를 작성합니다. 새 활동을 열고 그 시점에 finish ()를 작성하지 않은 경우 이전 활동이 항상 완료되면이를 사용하여 활동을 작성한 후 다음과 같이 보입니다.

<activity
    android:name=".Splash_Screen_Activity"
    android:label="@string/app_name"
    android:noHistory="true">

</activity>

3) system.exit(0)애플리케이션 종료를 위해 쓰기 .


나는 같은 문제로 고심하고 있었다. 정보 페이지를 finish();열고 거기에서 호출 하면 앱이 닫히지 않고 이전 활동으로 이동했으며 정보 페이지 자체에서 앱을 닫고 싶었습니다.

이것은 나를 위해 일한 코드입니다.

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 
finish();

도움이 되었기를 바랍니다.


finishAffinity()현재 활동과 모든 상위 활동을 완료하는 방법을 사용할 수 있습니다 . 그러나 API 16+.

API 16 이상 사용 :

finishAffinity();

API 16 이하 사용 :

ActivityCompat.finishAffinity(this); //with v4 support library

전체 앱을 종료하려면 :

finishAffinity(); // Close all activites
System.exit(0);  // closing files, releasing resources

보다 "책에 의해"그리고 방법 론적으로 설계된 (BroadcastReceiver 사용) 솔루션을 찾고 있다면 다음 링크를 참조하십시오 . http://www.hrupin.com/2011/10 / how-to-finish-all-activities-in-your-android-application-through-simple-call .

A slight change is required in the proposed implementation that appears in that link - you should use the sendStickyBroadcast(Intent) method (don't forget to add the BROADCAST_STICKY permission to your manifest) rather than sendBroadcast(Intent), in order to enable your paused activities to be able to receive the broadcast and process it, and this means that you should also remove that sticky broadcast while restarting your application by calling the removeStickyBroadcast(Intent) method in your opening Activity's onCreate() method.

위에서 언급 한 startActivity (...) 기반 솔루션은 언뜻보기에 매우 멋지고 우아하고 짧고 빠르고 쉽게 구현할 수있는 것처럼 보이지만 (활동을 시작하는 데-가능한 모든 것을 포함하여) 그것을 죽이기 위해 필요하고 관련 될 수있는 오버 헤드와 자원? ...)


두 개의 깃발을 따라 가면 나를 위해 일했습니다. 그들은 것 모두 취소 이전 활동을하고 새로운 시작

  Intent intent = new Intent(getApplicationContext(), MyDetails.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

도움이 되었기를 바랍니다.


위에서 언급 한 답변 중 어느 것도 나를 위해 일하지 않았습니다. 그러나 나는 더 많은 것을 조사하고 마침내 답을 얻었습니다.

실제로 필요에 따라 앱을 닫으라고 요청했습니다. 그래서 다음 코드를 추가하십시오

finishAffinity();

이것이 여러분에게 도움이되기를 바랍니다.


finishAffinity () 만 시도 할 수 있습니다. v4.1 이상에서 작동하는 모든 현재 활동을 닫습니다.


의 문제 finishAffinity()는 현재 작업의 활동 만 닫혀 있지만 singleInstancelaunchMode 및 다른 작업의 활동 은 계속 열려 있고 finishAffinity(). 문제 System.exit(0)는 모든 백그라운드 서비스와 모든 할당 된 메모리로 앱 프로세스를 완료하고 이로 인해 원하지 않는 부작용이 발생할 수 있다는 것입니다 (예 : 더 이상 알림을받지 않음).

두 가지 문제를 모두 해결하는 다른 두 가지 대안 은 다음과 같습니다 .

  1. ActivityLifecycleCallbacks앱 클래스에서 사용 하여 생성 된 활동을 등록하고 필요할 때 닫습니다 : https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10
  2. 테스트에서 다음을 사용할 수 있습니다 ActivityLifecycleMonitorRegistry. https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15

모든 활동이 완료되어야하는지 여부를 나타내는 부울 플래그를 저장할 수 있습니다 (공유 환경 설정에서 더 선호 됨). onStart()각 활동의 메소드는 다음과 같아야합니다.

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
    finish();
}else
{
    //...
}

분명히 다음과 같이 모든 활동 (현재 활동에서)을 완료해야 할 때 마다이 플래그를 설정할 수 있으므로 현재 활동에서 finish () 메서드를 호출하여 현재 활동을 종료하고 활동을 하나씩 쌓을 수 있습니다. 하나, 각각의 onStart () 메소드가 실행되고 종료됩니다.

SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();

@letsnurture가 제안한 방법을 사용하면 @gumuruh가 묻는 질문에 직면하게됩니다.


사용하다

finishAffinity ();

대신에:

System.exit(); or finish();

전체 응용 프로그램 또는 모든 활동을 종료합니다.


루팅 된 경우 :

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");

앱 종료

Intent intent = new Intent(getApplicationContext(), Splash_Screen.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("EXIT", true);
                startActivity(intent);

열린 첫 번째 활동의 oncreate 및 onResume에 이것을 넣으십시오. 전의. 시작 화면 활동에 있습니다.

if (getIntent().getBooleanExtra("EXIT", false)) {
            this.finish();
            System.exit(0);
        }

다음 코드를 사용할 수 있습니다.

Intent i = new Intent(OldActivity.this, NewActivity.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(i);

in LoginActivity

@Override
    public void onBackPressed() {
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);
        finish();
        super.onBackPressed();
    }

나는 자바 / 안드로이드의 스타터입니다.이 간단한 솔루션이 도움이 될 수 있습니다.

먼저 정적 클래스를 만듭니다.

public class ActivityManager {

    static Activity  _step1;
    static Activity _step2;
    static Activity _step3;

    public static void setActivity1(Activity activity)
    {
        _step1 = activity;
    }

    public static void setActivity2(Activity activity)
    {
        _step2 = activity;
    }

    public static void setActivity3(Activity activity)
    {
        _step3 = activity;
    }

    public static void finishAll()
    {
        _step1.finish();
        _step2.finish();
        _step3.finish();
    }

}

그런 다음 새 활동을 실행할 때 관리자에 대한 링크 저장 (1 단계) :

ActivityManager.setActivity1(this);
AddValuesToSharedPreferences();
Intent intent = new Intent(Step1.this, Step2.class);
startActivity(intent);

그런 다음 마지막 단계에서 모두 완료하십시오.

 public void OkExit(View v) throws IOException {
        ActivityManager.finishAll();
    }

참조 URL : https://stackoverflow.com/questions/14001963/finish-all-activities-at-a-time

반응형