프로그래밍 방식으로 안드로이드 응용 프로그램을 종료하는 방법
프로그래밍 방식으로 Android 응용 프로그램을 종료하기위한 코드를 찾았습니다. onDestroy ()에서 다음 코드 중 하나를 호출하면 응용 프로그램이 완전히 종료됩니까?
System.runFinalizersOnExit(true)
(또는)android.os.Process.killProcess(android.os.Process.myPid());
종료 버튼을 클릭 한 후 백그라운드에서 응용 프로그램을 실행하고 싶지 않습니다. Pls는이 코드 중 하나를 사용하여 응용 프로그램을 종료 할 수 있다고 제안합니까? 그렇다면 어떤 코드를 사용할 수 있습니까? Android에서 앱을 종료하는 좋은 방법입니까?
API 16부터 finishAffinity 메소드를 사용할 수 있습니다. finishAffinity 메소드는 이름과 Javadoc 설명으로 모든 관련 활동을 닫는 것과 매우 비슷합니다.
this.finishAffinity ();
현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오. 이것은 일반적으로 응용 프로그램을 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작할 수 있고 사용자가 위로 탐색을 사용하여 현재 작업에서 자체 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 모든 작업을 작업 스위치의 일부로 원래 작업에서 제거해야합니다.
이 마무리를 통해 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.
API 21 부터 매우 유사한 명령을 사용할 수 있습니다
finishAndRemoveTask ();
이 작업의 모든 활동을 완료하고 최근 작업 목록에서 제거합니다.
getActivity().finish();
System.exit(0);
이것이 앱을 종료하는 가장 좋은 방법입니다. !!!
나를위한 최고의 솔루션.
finishAffinity();
System.exit(0);
응용 프로그램 finishAffinity();
없이 만 사용 System.exit(0);
하지만 휴대 전화에서 할당 된 메모리를 계속 사용하고 있다면 깨끗하고 실제로 응용 프로그램을 종료하려면 두 가지를 모두 사용하십시오.
이것은 가장 간단한 방법이며 어디에서나 작동하며 실제 앱을 종료하면 많은 활동을 열 수 있지만 여전히 문제없이 종료됩니다.
버튼 클릭 예
public void exitAppCLICK (View view) {
finishAffinity();
System.exit(0);
}
또는 예를 들어 3 개의 버튼이있는 경고 대화 상자를 사용하여 예를 들어 취소하고 취소하는 것이 좋습니다.
// alertdialog for exit the app
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
// set the title of the Alert Dialog
alertDialogBuilder.setTitle("your title");
// set dialog message
alertDialogBuilder
.setMessage("your message")
.setCancelable(false)
.setPositiveButton("YES"),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
// what to do if YES is tapped
finishAffinity();
System.exit(0);
}
})
.setNeutralButton("CANCEL"),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
// code to do on CANCEL tapped
dialog.cancel();
}
})
.setNegativeButton("NO"),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
// code to do on NO tapped
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
응용 프로그램을 종료해야 할 경우에 대해 정말로 열심히 생각하십시오.
그렇지 않으면 정말 확실하다면
finish();
@ dave appleton의 의견에 대한 반응으로 : 먼저 큰 질문 / 답변 콤보 @ gabriel를 게시하십시오. 응용 프로그램을 끝내는 것이 찡그림 입니까?
이제 우리가 그것을 가지고 있다고 가정 할 때, 여기 질문은 여전히 답을 가지고 있습니다 finish()
. 종료로 무언가를 할 때 필요한 코드는 입니다. 분명히 당신은 하나 이상의 활동 등을 가질 수 있지만, 요점이 아닙니다. 일부 유스 케이스로 실행할 수 있습니다.
- 메모리 사용 및 "백그라운드에서 실행되지 않음"으로 인해 사용자가 모든 것을 종료하도록하려고합니다. 의심 할 여지가 없습니다. 사용자가 백그라운드에서 특정 활동을 중지하게하면서 OS가 불필요한 명령을 종료하도록합니다.
- 사용자가 앱의 이전 활동으로 이동하지 않기를 원하십니까? 필요하지 않도록 구성하거나 추가 옵션이 필요합니다. 대부분의 경우 back = previous-activity가 작동하는 경우 사용자가 다른 작업을 수행하려는 경우 집으로 돌아 가지 않습니까?
- 어떤 종류의 재설정이 필요한 경우 응용 프로그램이 종료되었는지 여부 / 방법 / 등을 확인할 수 있으며 활동에 다시 초점이 맞으면 조치를 취할 수 있습니다.
결국 결국 finish()
모든 것을 죽이지 않지만 여전히 내가 생각하는 도구입니다. "모든 활동 종료"에 대한 사용 사례가 있다면 아직 찾지 못했습니다.
어떤 경우에는 응용 프로그램을 종료해야한다고 생각합니다. 예를 들어, 로그인 후에 만 앱을 사용할 수 있습니다. 로그인 활동에는 '로그인'과 '취소'의 두 가지 버튼이 있습니다. '취소'버튼을 클릭하면 '앱 종료'를 의미합니다. 아무도 백그라운드에서 앱을 살기를 원하지 않습니다. 따라서 일부 경우 앱을 종료해야한다는 데 동의합니다.
android에는 응용 프로그램이 종료되지 않습니다 . SampleActivity.this.finish (); 현재 활동을 완료합니다.
한 활동에서 다른 활동으로 전환 할 때 이전 활동을 완료하십시오.
Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class);
startActivity(homeintent);
SampleActivity.this.finish();
를 ExitActivity
만들고 매니페스트에 선언하십시오. 그리고 ExitActivity.exit(context)
앱 종료를 요청하십시오 .
public class ExitActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finish();
}
public static void exit(Context context) {
Intent intent = new Intent(context, ExitActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
}
}
앱을 얼마나 빨리 닫을 지에 따라 다릅니다.
앱을 닫는 안전한 방법은 finishAffinity ();
모든 프로세스가 처리를 마친 후에 앱을 닫습니다. 시간이 좀 걸릴 수 있습니다. 이 방법으로 앱을 닫고 잠시 후에 다시 시작하면 새 응용 프로그램이 동일한 프로세스에서 실행될 수 있습니다. 이전 응용 프로그램의 모든 완료되지 않은 프로세스와 단일 객체로.
확실하게하려면 앱이 완전히 닫혀 있는지 확인하십시오. System.exit (0);
앱이 즉시 닫힙니다. 그러나 앱에서 열었던 파일이 손상되었거나 공유 환경 설정 편집이 완료되지 않을 수 있습니다. 따라서 이것을 신중하게 사용하십시오.
워치 독을 장시간 실행되는 작업과 함께 사용하면 다른 방법의 영향을 볼 수 있습니다.
new ANRWatchDog(2000).setANRListener(new ANRWatchDog.ANRListener() {
public void onAppNotResponding(ANRError error) {
MainActivity.this.finishAffinity();
System.exit(0);
}
}).start();
for(int i = 0; i < 10; ++i){
--i;
}
ANR 대화 상자 등을 표시하지 않고 2 초 후에 앱을 종료합니다. System.exit (0) 을 제거 하고이 코드를 실행하고 앱을 닫은 후 앱을 다시 시작하면 끝없는 루프가 계속 실행되므로 이상한 동작이 발생합니다.
finishAndRemoveTask ()
API 21에서 사용할 수 있습니다
공공 무효 finishAndRemoveTask ()
이 작업의 모든 활동을 완료하고 최근 작업 목록에서 제거합니다.
당신은 더 나은 사용했다 finish()
당신이있는 경우 Activity
, 또는 getActivity().finish()
당신은에있는 경우 Fragment
.
앱을 완전히 종료하려면 다음을 사용하십시오.
getActivity().finish();
System.exit(0);
우선,이 접근법에는 최소 Api 16이 필요합니다.
이 문제를보다 광범위하게 해결하기 위해이 솔루션을 3 개 부분으로 나누겠습니다.
1. 활동 에서 응용 프로그램을 종료 하려면이 코드 스 니펫을 사용하십시오.
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
finishAndRemoveTask();
}
2. Activity 에 액세스 할 수 있는 비 Activity 클래스 에서 응용 프로그램을 종료 하려면이 코드 스 니펫을 사용하십시오.
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
getActivity().finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
getActivity().finishAndRemoveTask();
}
3. 비 활동 클래스에서 응용 프로그램을 종료하고 서비스와 같은 활동에 액세스 할 수없는 경우 BroadcastReceiver를 사용하는 것이 좋습니다. 이 접근 방식을 프로젝트의 모든 활동에 추가 할 수 있습니다.
LocalBroadcastManager 및 BroadcastReceiver 인스턴스 변수를 작성하십시오. 원하는 경우 getPackageName () + ". closeapp"를 바꿀 수 있습니다.
LocalBroadcastManager mLocalBroadcastManager;
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(getPackageName()+".closeapp")){
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
finishAndRemoveTask();
}
}
}
};
Activity의 onCreate () 메소드에 추가하십시오.
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(getPackageName()+".closeapp");
mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);
또한 활동의 onDestroy () 메소드에서 unregister 수신자를 호출하는 것을 잊지 마십시오
mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);
응용 프로그램을 종료하려면 서비스를 확장하는 PlayService 클래스에서 사용하는 LocalBroadcastManager를 사용하여 브로드 캐스트를 보내야합니다.
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager
.getInstance(PlayService.this);
localBroadcastManager.sendBroadcast(new Intent(
getPackageName() + ".closeapp"));
응용 프로그램을 종료하는 쉽고 간단한 방법
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
이것이 찡그림인지 확실하지 않지만, 이것이 내가하는 방법입니다 ...
1 단계- 일반적으로 전 세계에 액세스하려는 메소드와 변수가 포함 된 클래스가 있습니다. 이 예에서는 "App"클래스라고합니다. 앱에있는 각 활동에 대해 클래스 내에 정적 활동 변수를 작성하십시오. 그런 다음 "close"라는 정적 메소드를 작성하여 finish()
해당 활동 변수 각각이 널이 아닌 경우 각각의 활동 변수 에서 메소드를 실행하십시오 . 주 / 부모 활동이있는 경우 마지막으로 닫으십시오.
public class App
{
////////////////////////////////////////////////////////////////
// INSTANTIATED ACTIVITY VARIABLES
////////////////////////////////////////////////////////////////
public static Activity activity1;
public static Activity activity2;
public static Activity activity3;
////////////////////////////////////////////////////////////////
// CLOSE APP METHOD
////////////////////////////////////////////////////////////////
public static void close()
{
if (App.activity3 != null) {App.activity3.finish();}
if (App.activity2 != null) {App.activity2.finish();}
if (App.activity1 != null) {App.activity1.finish();}
}
}
2 단계- 각 활동에서 onStart()
및 onDestroy()
메소드를 대체하십시오 . 에서 onStart()
앱 클래스의 정적 변수 "로 동일하게 설정 this
". 에서 onDestroy()
로 설정하십시오 null
. 예를 들어 "Activity1"클래스에서
@Override
public void onStart()
{
// RUN SUPER | REGISTER ACTIVITY AS INSTANTIATED IN APP CLASS
super.onStart();
App.activity1 = this;
}
@Override
public void onDestroy()
{
// RUN SUPER | REGISTER ACTIVITY AS NULL IN APP CLASS
super.onDestroy();
App.activity1 = null;
}
3 단계- 앱을 닫으려면 App.close()
어디서나 전화 하면됩니다. 모든 인스턴스화 된 활동이 종료됩니다! 활동을 닫고 앱 자체를 종료하지 않기 때문에 (예와 같이) Android는 무료로 가져와 필요한 정리를 수행합니다.
다시 말하지만, 이것이 어떤 이유로 든 눈에 띄게 될지 모르겠습니다. 그렇다면 그 이유와 개선 방법에 대한 의견을 읽고 싶습니다.
나는 당신이 찾고있는 것이 이것이라고 생각합니다.
activity.moveTaskToBack(Boolean nonRoot);
public void quit() {
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
System.exit(0);
}
응용 프로그램을 종료하는 것은 눈살을 찌푸리고 있습니까? . 이 링크를 통해 이동하십시오. 귀하의 질문에 답변합니다. 시스템은 응용 프로그램을 종료하는 작업을 수행합니다.
두 개의 활동 A a B가 있다고 가정합니다. A에서 B로 이동합니다. 뒤로 단추를 클릭하면 활동 B가 백 스택에서 팝되어 파괴됩니다. 백 스택 활동 A의 이전 활동이 초점을 갖습니다.
애플리케이션 종료시기를 결정하려면 시스템에 그대로 두어야합니다.
공공 무효 finish()
활동이 끝났을 때 전화하십시오.
많은 활동이 있다고 가정하십시오. 작업 표시 줄을 사용할 수 있습니다. 홈 아이콘을 클릭하면 응용 프로그램의 MainActivity로 이동합니다. MainActivity에서 뒤로 단추를 클릭하여 응용 프로그램을 종료하십시오.
우리는 강력하고 간단한 코드를 원합니다. 이 솔루션은 기존 장치 및 최신 장치에서 작동합니다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
getActivity().finishAffinity();
} else{
getActivity().finish();
System.exit( 0 );
}
응용 프로그램을 종료하려면 다음을 사용할 수 있습니다.
getActivity().finish();
Process.killProcess(Process.myPid());
System.exit(1);
또한 서비스를 중지하려면 다음 메소드를 호출하십시오.
private void stopServices() {
final ActivityManager activityManager = SystemServices.getActivityManager(context);
final List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
final int pid = Process.myPid();
for (ActivityManager.RunningServiceInfo serviceInfo : runningServices) {
if (serviceInfo.pid == pid && !SenderService.class.getName().equals(serviceInfo.service.getClassName())) {
try {
final Intent intent = new Intent();
intent.setComponent(serviceInfo.service);
context.stopService(intent);
} catch (SecurityException e) {
// handle exception
}
}
}
}
이것은 매우 늦을 수 있으며 지침에 따라 수명주기 프로세스를 스스로 처리하지 않아야합니다 (OS가 당신을 위해하는 것처럼). 모든 액티비티에 브로드 캐스트 리시버를 " finish()
"로 등록하고 onReceive()
종료 할 때마다 모든 액티비티를 종료해야한다는 의도를 간단히 전달할 수 있습니다 ..... onDestroy()
메소드 에서 수신자를 등록 취소하십시오 .
@MobileMateo와 비슷하지만 Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
this.finishAffinity()
} else{
this.finish()
System.exit(0)
}
좋은 결정이 아니므로 Android의 응용 프로그램 처리 원칙에 위배됩니다. 안드로이드는 절대 불가피한 경우가 아니면 프로세스를 종료하지 않습니다. 이렇게하면 앱이 더 빨리 시작하여 항상 메모리에 유지됩니다. 따라서 애플리케이션 프로세스를 종료 할 특별한 이유가 필요합니다.
버튼 클릭시 앱 을 종료 하는 정확하고 정확한 해결책 은 아래 코드를 사용하는 것입니다.
// On 버튼 뒤로 눌린 이벤트
public void onBackPressed()
{
moveTaskToBack(true);
finish();
}
이것은 아무것도 죽일 것입니다;)
int p = android.os.Process.myPid();
android.os.Process.killProcess(p);
이 시도
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
안드로이드의 논리를 깨지 않고 기존 활동에 더 많은 코드를 추가하고 추가 사항을 전달하지 않고 활동에서 응용 프로그램을 종료하는 가장 쉬운 방법은 다음과 같습니다.
public static void quitApplication (Activity currentActivity) {
Intent intent = new Intent (currentActivity, QuitApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
currentActivity.startActivity (intent);
currentActivity.finish ();
}
QuitApplicationActivity
존재 :
public class QuitApplicationActivity extends AppCompatActivity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
finish ();
}
}
@Sivi의 답변으로 앱이 닫힙니다. 그러나 돌아 왔을 때 일부 어린이 활동이 있으면 완료되지 않은 다른 활동이 열릴 수 있습니다. noHistory:true
돌아 왔을 때 앱이 MainActivity에서 시작되도록 내 활동에 추가 했습니다.
<activity
android:name=".MainActivity"
android:noHistory="true">
</activity>
앱을 종료하는 잔인한 방법 목록에 하나를 추가하기 만하면됩니다.
Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);
Kotlin을 사용하는 경우 앱을 종료하는 적절한 방법 System.exit()
은 내장 방법입니다.
exitProcess(0)
설명서를 참조하십시오 .
0
매개 변수로서의 숫자 는 종료가 의도되었으며 오류가 발생하지 않았 음을 의미합니다.
전체 앱을 종료 할 수 있습니다. 그러므로
Intent intent = getBaseContext().getPackageManager()
.getLaunchIntentForPackage(getBaseContext().getPackageName());
intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
100 % 작동합니다. 행운을 빌어 요!
뒤로 키를 누르면 finish ()를 사용하십시오.
참고 URL : https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically
'IT' 카테고리의 다른 글
PHP에서 문자열 끝에서 3자를 어떻게 제거 할 수 있습니까? (0) | 2020.03.19 |
---|---|
C #에서 열거 형을 문자열과 연관 (0) | 2020.03.19 |
오류 : java : 유효하지 않은 소스 릴리스 : Intellij에서 8 (0) | 2020.03.19 |
ASP.NET MVC에서 웹앱의 기본 URL을 어떻게 얻을 수 있습니까? (0) | 2020.03.19 |
자식 무시 예외 (0) | 2020.03.19 |