문제

두 가지 다른 활동이 있습니다. 첫 번째는 두 번째를 시작합니다. 두 번째 활동에서는 전화합니다 System.exit(0) 응용 프로그램을 강제로 닫으려면 홈 화면으로 돌아 오는 응용 프로그램 대신 첫 번째 활동이 자동으로 표시됩니다. 이것을 피하고 응용 프로그램이 홈 화면으로 돌아 오도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

실제로 신청서를 종료하지 않는 것에 대해 생각해야합니다. 이것은 Android 앱이 일반적으로 작동하는 방식이 아닙니다.

다른 팁

짧은 대답: 전화 moveTaskToBack(true) 너의 Activity 대신에 System.exit(). 사용자가 다시 사용하려고 할 때까지 응용 프로그램을 숨 깁니다.

더 긴 답변은 또 다른 질문으로 시작합니다. 왜 응용 프로그램을 죽이고 싶습니까?

Android OS는 메모리 관리 및 프로세스 등을 처리하므로 제 조언은 Android가 귀하를 위해 걱정할 수 있습니다. 사용자가 응용 프로그램을 떠나려면 홈 버튼을 누를 수 있으며 응용 프로그램이 효과적으로 사라집니다. 휴대 전화에 더 많은 메모리가 필요하면 나중에 OS는 응용 프로그램을 종료합니다.

당신이하는 한 수명주기 이벤트에 적절하게 응답합니다, 귀하와 사용자는 응용 프로그램이 여전히 실행 중인지 여부를 관리 할 필요가 없습니다.

따라서 응용 프로그램 통화를 숨기려면 moveTaskToBack() 그리고 안드로이드가 언제 죽일시기를 결정하게하십시오.

이를 달성하는 가장 쉬운 방법은 아래에 나와 있습니다 (Android의 기본 메모리 관리에 영향을 미치지 않고 프로세스 킬이 관련이 없습니다).

  1. 이 의도를 사용하여 활동을 시작하십시오.

    Intent intent = new Intent(this, FinActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();
    
  2. 목표 활동에서 FinActivity.class, call finish ()를 호출합니다 onCreate.

설명 된 단계 :

  1. 당신은 다른 모든 활동을 지우는 의도를 만듭니다 (FLAG_ACTIVITY_CLEAR_TOP) 현재 활동을 삭제합니다.

  2. 활동은 스스로 파괴됩니다. 대안은 고향으로 스플래시 화면을 만들 수 있다는 것입니다. 이것은 선택 사항입니다.

Android에는 문서에 따라 응용 프로그램을 안전하게 닫는 메커니즘이 있습니다. 종료 된 마지막 활동 (일반적으로 응용 프로그램이 시작될 때 처음 등장한 주요 활동)에서는 ondestroy () 메소드에 몇 줄을 배치합니다. 전화 System.RunfinalizersOneXit (True) 응용 프로그램이 종료 될 때 모든 객체가 마무리되고 쓰레기가 수집되도록합니다. 예를 들어:

public void onDestroy() {
    super.onDestroy();

    /*
     * Notify the system to finalize and collect all objects of the
     * application on exit so that the process running the application can
     * be killed by the system without causing issues. NOTE: If this is set
     * to true then the process will not be killed until all of its threads
     * have closed.
     */
    System.runFinalizersOnExit(true);

    /*
     * Force the system to close the application down completely instead of
     * retaining it in the background. The process that runs the application
     * will be killed. The application will be completely created as a new
     * application in a new process if the user starts the application
     * again.
     */
    System.exit(0);
}

마지막으로 Android는 신청을 알리지 않습니다 키 이벤트, 따라서 응용 프로그램을 닫을 수 없습니다. 키가 눌렀습니다. 안드로이드는 개발자가 사용자가 응용 프로그램을 떠나지 못하게 할 수 있도록 주요 이벤트 자체.

당신은 또한 지정할 수 있습니다 역사적 = 첫 번째 활동에 대한 태그의 "True"는 두 번째 활동을 시작하자마자 첫 번째 활동을 마치십시오 (David가 말했듯이).

Afaik, "Force Close"는 응용 프로그램 실행 및 System.exit ()가 응용 프로그램 인스턴스를 실행하는 JVM을 종료하는 JVM을 호스팅하는 프로세스를 죽입니다. 둘 다 갑자기 종료의 형태이며 정상적인 응용 분야에서는 권장되지 않습니다.

프로그램이 수행 할 수있는 논리 흐름을 다루기위한 예외를 포착하는 것처럼, 권장하지는 않습니다.

이 방법을 사용하여 활동을 닫습니다!

public static void closeAllBelowActivities(Activity current) {
    boolean flag = true;
    Activity below = current.getParent();
    if (below == null)
        return;
    System.out.println("Below Parent: " + below.getClass());
    while (flag) {
        Activity temp = below;
        try {
            below = temp.getParent();
            temp.finish();
        } catch (Exception e) {
            flag = false;
        }
    }
}

두 번째 활동을 시작하면 finish() 즉시 첫 번째 :

startActivity(new Intent(...));
finish();

android.os.Process.killProcess(android.os.Process.myPid()); 잘 작동하지만 Android 플랫폼이 메모리 관리에 대해 걱정할 것을 권장합니다. :-)

System.exit ()를 수행 할 수 없으며 안전하지 않습니다.

이 작업을 수행 할 수 있습니다 : Process.killProcess (Process.Mypid ());

나는 이것을 사용한다 :

1) 부모 활동은 "startActivityForResult"방법으로 보조 활동을 호출합니다.

2) 폐쇄 될 때 2 차 활동에서 :

int exitCode = 1; // Select the number you want
setResult(exitCode);
finish();

3) 부모 활동에서 "OnactivityResult"방법을 무시합니다.

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    int exitCode = 1;
    if(resultCode == exitCode) {
        super.setResult(exitCode); // use this if you have more than 2 activities
        finish();
    }
}

이것은 나에게 잘 작동합니다.

사용 finish 방법. 더 간단하고 쉬운 방법입니다.

this.finish();

영구 소켓 연결을 사용하는 응용 프로그램으로 작업 할 때 finish() 메소드는 연결을 해제하지 않습니다. 정상적인 상황에서 finish() 최선의 선택이지만 앱을 종료하고 사용중인 모든 리소스를 릴리스 해야하는 경우 사용합니다. killProcess. 나는 그것을 사용하는 데 아무런 문제가 없었습니다.

startActivityForResult를 사용하여 두 번째 활동을 시작하고 두 번째 활동에서 값을 반환합니다. 값은 값을 반환합니다. 나는 이것이 Android가하는 올바른 방법이라고 생각합니다.

다음을 시도하십시오. 그것은 나를 위해 작동합니다.

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
ComponentName componentInfo = taskInfo.get(0).topActivity;
am.restartPackage(componentInfo.getPackageName());

a> b> c> d> e와 같은 활동 스택이 있다고 가정 해보십시오. 당신은 활동 D에 있고 앱을 닫고 싶습니다. 이것이 당신이 할 일입니다.

문을 닫고 싶은 곳에서 활동 (활동 d)-

Intent intent = new Intent(D.this,A.class);
intent.putExtra("exit", "exit");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

당신의 루트 activity에서 (즉, 당신의 기본 활동, 여기에서 활동 a) -

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.hasExtra("exit")) {
            setIntent(intent);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (getIntent() != null) {
            if (("exit").equalsIgnoreCase(getIntent().getStringExtra(("exit")))) {
                onBackPressed();
            }
        }
    }

활동이 살아 있으면 처음으로 시작한 첫 번째 의도를 얻을 수 있기 때문에 신생자가 사용됩니다. 새로운 것이 아닙니다. 자세한 내용은 - 선적 서류 비치

실제로는 조용합니다.

내가하는 방법은 모든 사람이 사용할 수있는 정적 변수로 깃발을 저장하는 것입니다. 그런 다음 나가면이 깃발을 설정하고 모든 활동 이이 깃발을 확인합니다. onResume. 플래그가 설정되면 나는 System.exit 그 활동에.

이렇게하면 모든 활동이 깃발을 확인하고 깃발이 설정되면 우아하게 닫힙니다.

당신은 잘못. 응용 프로그램을 죽이는 한 가지 방법이 있습니다. 슈퍼 클래스 응용 프로그램이있는 클래스에서는 일부 필드를 사용합니다. killApp. 스플래시 화면 (첫 번째 활동)을 시작할 때 onResume(), 우리는 필드의 false에 대한 매개 변수를 설정합니다 killApp. 우리가 할 때의 모든 활동에서 onResume() 결국 우리는 다음과 같은 것을 부릅니다.

if(AppClass.killApp())
    finish();

화면에 도달하는 모든 활동은 onResume(). 호출되면 우리는 우리의 분야가 killApp 사실이다. 사실이라면 현재 활동이 호출됩니다 finish(). 전체 조치를 불러 내기 위해 다음 건설을 사용합니다. 예를 들어, 버튼 작업에서 :

AppClass.setkillApplication(true);
   finish();
   return;

이것이 응용 프로그램을 닫기 위해 한 일입니다. 응용 프로그램에는 기본 활동 클래스가 있고 "ApplicationShutdown"이라는 정적 플래그를 추가했습니다. 응용 프로그램을 닫아야 할 때 True로 설정했습니다.

슈퍼 콜을 호출 한 후에는 기본 활동과 OnResume 에서이 깃발을 테스트합니다. "ApplicationShutdown"이 참이면 현재 활동을 마무리합니다.

이것은 나를 위해 효과가있었습니다.

protected void onResume() {
    super.onResume();
    if(BaseActivity.shutDownApp)
    {
        finish();
        return;

    }}

결과에 대한 시작 활동을 사용하여 두 번째 활동을 실행하십시오.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

//This line is important
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

startActivityForResult(intent, REQUEST_CODE);

이 기능을 첫 번째 활동에 추가하십시오.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(rquestCode == REQUEST_CODE)
        if(resultCode == RESULT_CANCELED)
            finish();
}

그리고 이것을 두 번째 활동에 추가하십시오.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        Log.i(TAG, "Back key pressed");
        setResult(RESULT_CANCELED);
        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

권장되지는 않지만 여전히 사용할 수 있습니다. 앱을 종료 해야하는 경우이 솔루션을 사용하십시오.

나에 따르면, 가장 좋은 솔루션은 아래와 같이 앱의 모든 활동을 완료하는 것입니다.

단계 1. 메인 활동에서 정적 변수를 유지합니다. 말하다,

public static boolean isQuit = false;

단계 2. 버튼의 클릭 이벤트 에서이 변수를 true로 설정하십시오.

mainactivity.isQuit = true;
finish();

3 단계. 신청서의 모든 활동에서 onrestart 아래와 같은 방법.

@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    if(mainactivity.isQuit)
        finish();
}

비슷한 문제를 해결했습니다. MainActivity는 BrowserActivity를 시작하고 사용자가 BrowserActivity에서 다시 누르면 MainActivity로 돌아 오지 않도록 앱을 닫아야합니다. 따라서 Mainactivity에서 :

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "sm500_Rmt.MainActivity";
    private boolean m_IsBrowserStarted = false;

그런 다음 OnResume에서 :

    @Override
protected void onResume() {
    super.onResume();
    if(m_IsBrowserStarted) {
        Log.w(TAG, "onResume, but it's return from browser, just exit!");
        finish();
        return;
    }
    Log.w(TAG, "onResume");

... 그런 다음 Onresume을 계속하십시오. 그리고 BrowserActivity를 시작할 때 :

    Intent intent = new Intent(this, BrowserActivity.class);
    intent.putExtra(getString(R.string.IPAddr), ip);
    startActivity(intent);
    m_IsBrowserStarted = true;

그리고 그것은 잘 작동하는 것처럼 보입니다! :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top