응용 프로그램을 종료하고 홈 화면을 표시하는 방법은 무엇입니까?


196

홈페이지에 응용 프로그램을 탐색하는 버튼이있는 응용 프로그램이 있습니다.

해당 페이지에는 클릭하면 응용 프로그램 아이콘이있는 전화기의 홈 화면으로 사용자를 안내하는 "종료"버튼이 있습니다.

어떻게해야합니까?

답변:


327

Android의 디자인은 선택적으로 응용 프로그램을 종료하는 것이 아니라 OS에서 관리하는 것입니다. 해당 의도로 홈 애플리케이션을 불러올 수 있습니다.

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

25
사용할 수도 있습니다 .. "moveTaskToBack (true);"
hemanth kumar

17
모든 자원을 할당 해제합니까? 이 방법으로 앱을 종료하고 얼마 후에 앱 아이콘을 다시 클릭하기 때문에. 내가 떠난 곳에서 시작합니다. 이는 앱이 여전히 백그라운드에서 실행 중임을 의미합니다.
Adil Malik

12
Activity.finish ();
hB0

11
이렇게하면 앱이 백그라운드에 유지되므로 애플리케이션이 종료되지 않습니다.
Herman Schoenfeld

3
이 답변은 홈 화면을 표시하고 OP가 원하는대로 응용 프로그램을 완전히 종료 / 닫지 않습니다.
Basher51

74

이 같은 것을 시도 할 수 있습니다

응용 프로그램에서 많은 활동 (예 : 10)이 있고이 활동에서 직접 종료해야한다고 가정합니다. 우리가 할 수있는 일은 인 텐트를 만들고 루트 활동으로 이동하여 인 텐트에 플래그를 설정하는 것입니다.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

또한 의도에 부울과 같은 것을 추가하십시오.

intent.putExtra("EXIT", true);

그런 다음 루트 활동에서 가치 확인 boolean에서) 그 콜 완료 (에 따른 onCreate()루트 활동

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

1
완료를 호출하기 위해 onCreate에서 아무것도하지 마십시오.
imcaptor

2
내 경우에는 나는 또한 재정의해야했다 onNewIntent. intnet.getExtras ()가 계속 null이기 때문에.
zznq

그리고이 방법은 RootActivity스택에서 다시 시작하는 대신 다시 시작합니다 . 이 stackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

아마 당신이 찾고있는 것입니다. 전체 응용 프로그램을 닫고 홈 화면으로 이동합니다.


1
이것이 소문자 출구 여야합니까?
Carol

1
System.exit (0)이어야합니다. 그러나 어쨌든별로 유용하지 않습니다.
superarts.org

7
핵심 Android 팀의 조언에 따라 System.exit (0)을 사용해서는 안됩니다.
Dinesh Venkata

2
나는 이것이 예외적 인 상황에 가장 적합한 방법이라고 생각합니다. 인터넷이 필요한 앱을 말하면 연결이 앱에 몇 가지 활동을 중단시킵니다. 버튼없이 경고 대화 상자를 표시 할 수 있습니다. 다시 입력하려면 로그인 / 초기화가 다시 필요하므로 뒤로 버튼은 전체 앱을 종료해야합니다. System.exit은 내가 찾은 합리적으로 작동하는 유일한 것입니다. @ user1699548 댓글에 대해서는 확실하지 않습니다.
Herman Schoenfeld

1
이로 인해 해당 앱과 관련된 모든 서비스가 중단됩니까?
bsara

25

이것은 나를 위해 잘 작동합니다.
다음과 같이 이전의 모든 활동을 닫으십시오.

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

그런 다음 MainActivity onCreate () 메소드에서 이것을 추가하여 MainActivity를 완료하십시오.

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

이것은 나를 위해 작동하지 않습니다. 내 앱에는 아무것도 보이지 않지만 여전히 일부 방법을 실행합니다. 실제로 아무것도하지 않는 디버거에서 스레드가 걸려서 기다리고 있음을 알 수 있습니다.
Stephen M-on strike-

23

먼저 방법을 사용하여 신청서를 작성하십시오. finish();

그런 다음 강제 제거를 위해 onDestroy에 아래 줄을 추가하십시오.

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

3
자원을 확보 할 기회가 없기 때문에 이것을 사용하지 마십시오
Jacky

1
-1은 백 키를 누를 때뿐만 아니라 활동을 떠날 때마다 onDestroy가 실행되기 때문에 -1입니다.
Hamzeh Soboh

5
@Jacky : 프로세스를 종료하면 시스템 리소스가 해제되지 않는 방법은 무엇입니까?
Herman Schoenfeld

1
super.onDestroy()이후 killProcess()인가? 이 라인에 도달했을까요?
shoosh

이것도 모든 서비스를 죽이지 않습니까?
Irshu

20

활동을 끝내려면 간단히 전화하면 finish()됩니다. 그러나 화면에 종료 버튼이있는 것은 좋지 않습니다.


2
"이 앱을 최신 버전으로 업데이트해야합니다"로 사용하고 있으며 계속 사용하고 싶지 않습니다. 아직도 나쁜 연습 ...?
beetree

@beetree 예. 다른 나쁜 습관과 마찬가지로, 이것이 유일한 선택 인 경우가 있으며, 다른 것을 시도하는 것은 무의미 할 수 있으므로 사용합니다. 불법 구문 과 달리 나쁜 습관 이라는 요점은 몇 가지 경우에 사용할 수 있지만 더 나은 방법을 찾으려면 열심히 노력해야한다는 것입니다. 귀하의 경우에는 없습니다.
Fund Monica의 소송

17

일부 활동은 실제로 스플래시 화면 활동, 시작 화면 활동, 확인 창과 같이 뒤로 버튼을 눌렀을 때 다시 열지 않으려 고합니다. 실제로 활동 스택에서는 이것을 필요로하지 않습니다. => manifest.xml 파일을 열고 속성을 추가 하여이 작업을 수행 할 수 있습니다

android : noHistory = "true"

이러한 활동에.

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

또는

때로는 특정 뒤로 버튼 누름으로 전체 응용 프로그램을 닫고 싶을 때가 있습니다. 여기서 모범 사례는 응용 프로그램을 종료하는 대신 홈 창을 여는 것입니다. 이를 위해서는 onBackPressed () 메소드를 대체해야합니다. 일반적으로이 방법은 스택에서 최상위 활동을 엽니 다.

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

또는

뒤로 버튼을 누르면 해당 활동을 종료하고 활동 스택에 추가하지 않으려 고합니다. onBackPressed () 메소드 내에서 finish () 메소드를 호출하십시오. 전체 응용 프로그램을 닫지 않습니다. 스택의 이전 활동으로 이동합니다.

@Override
public void onBackPressed() {
  finish();
}

16

Android 애플리케이션을 종료하지 않는 것이 좋습니다. 자세한 내용은이 질문 을 참조하십시오.

사용자는 항상 홈 버튼을 통해 또는 첫 번째 활동에서 뒤로 버튼을 통해 앱을 종료 할 수 있습니다.


3
@janusz : 홈 버튼을 눌러도 안드로이드 응용 프로그램이 종료되지 않습니다. 대신 백그라운드에서 진행됩니다.
Jayesh

5

(이전 답변을 시도했지만 일부 포인트가 부족합니다. 예를 들어 return;활동을 마친 후 활동 코드를 실행 하지 않으면 나머지 활동 코드가 실행됩니다. 또한 return으로 onCreate를 편집해야합니다. super.onCreate ()를 실행하지 않으면 런타임 오류가 발생합니다)

당신은 말 MainActivityChildActivity.

ChildActivity 내부에 다음을 추가하십시오.

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

MainActivity의 onCreate 내부에 다음을 추가하십시오.

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}


3

u 호출이 완료되면 해당 활동의 onDestroy ()가 호출되고 활동 스택의 이전 활동으로 돌아갑니다 ... 종료를 위해 finish ();


3

내가 한 일은 다음과 같습니다.

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

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

기본적으로 수행 한 작업은 스택에서 모든 활동을 지우고 시작 QuitAppActivity하여 작업을 완료합니다.


좋은 접근 방식. 의도를 통해 값을 전달할 필요가 없습니다.
user3144836

0

이후 선 다음 추가 finish();onDestroy():

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

0

다음 코드 스 니펫을 사용하여 응용 프로그램을 종료하려고했는데 이것이 효과적이었습니다. 이것이 도움이되기를 바랍니다. 나는 2 가지 활동으로 작은 데모를했습니다.

첫 활동

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

다른 활동

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

나는 관찰자 모드로 그것을했다.

관찰자 인터페이스

public interface Observer {
public void update(Subject subject);
}

기본 주제

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

Child Subject는 exit 메소드를 구현합니다.

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

응용 프로그램이 확장해야하는 MyApplication

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

기본 활동

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

테스트 해보자

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

응용 프로그램을 종료하려면이 코드를 함수 아래에 넣으십시오.

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100 % 잘 작동합니다. 이것은 onClick 앱을 종료하기위한 코드입니다 (방법)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

moveTaskToBack(true)종료 버튼을 추가 onClickedListener하여 애플리케이션을 최소화 할 수 있습니다.

도움이 되길 바랍니다.


0

어쩌면 내 코드는 hepls (Main_Activity.java) 일 수 있습니다.

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

응용 프로그램을 종료하려는 경우 그런 다음 버튼 누름 이벤트 내에서이 코드를 사용하십시오. 처럼:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.