一、直接退出
直接退出是最為簡單的方法,只需要在Activity中調用finish()方法即可:
public class MainActivity extends AppCompatActivity {
private Button mExitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExitBtn = findViewById(R.id.exit_btn);
mExitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
這種方法的缺點是可能會導致Activity未完全銷毀,導致一些資源泄漏和內存溢出的問題。
二、使用System.exit()
使用System.exit()可以強制結束整個應用程序,不過這種方法也有其缺點:
- 如果有多個進程在運行該應用程序,那麼只會終止當前進程。
- Android系統本身也會維護一些服務進程,這種方法無法終止這些服務進程。
因此,除非必須同時結束所有進程,否則不應該使用System.exit()方法。
public class MainActivity extends AppCompatActivity {
private Button mExitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExitBtn = findViewById(R.id.exit_btn);
mExitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
}
}
三、使用廣播
使用廣播可以通知系統結束整個應用程序:
public class MainActivity extends AppCompatActivity {
private Button mExitBtn;
private static final String ACTION_EXIT = "com.example.myapplication.ACTION_EXIT";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExitBtn = findViewById(R.id.exit_btn);
mExitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ACTION_EXIT);
sendBroadcast(intent);
}
});
}
}
public class ExitBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_EXIT.equals(intent.getAction())) {
ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.killBackgroundProcesses(context.getPackageName());
System.exit(0);
}
}
}
// 註冊廣播接收器
ExitBroadcastReceiver receiver = new ExitBroadcastReceiver();
IntentFilter filter = new IntentFilter(ACTION_EXIT);
registerReceiver(receiver, filter);
// 註銷廣播接收器
unregisterReceiver(receiver);
這種方法需要注意的是,要在AndroidManifest.xml文件中聲明ExitBroadcastReceiver,並添加關閉進程的許可權:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<application
...
<receiver android:name=".ExitBroadcastReceiver" />
...>
...
</application>
四、使用ActivityManager關閉應用程序
可以使用ActivityManager關閉所有的Activity,從而間接的關閉整個應用程序:
public class MainActivity extends AppCompatActivity {
private Button mExitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExitBtn = findViewById(R.id.exit_btn);
mExitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityManager activityMgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.killBackgroundProcesses(getPackageName());
}
});
}
}
需要注意的是,使用這種方法關閉應用程序只是停止運行所有的Activity,並沒有強制終止整個應用程序,如果應用程序有後台服務在運行,按照這種方式關閉應用程序並不能停止這些服務運行。
五、使用restartPackage方法重啟應用程序
可以使用ActivityManager的restartPackage()方法重啟整個應用程序:
public class MainActivity extends AppCompatActivity {
private Button mExitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExitBtn = findViewById(R.id.exit_btn);
mExitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityManager activityMgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.restartPackage(getPackageName());
}
});
}
}
需要注意的是,restartPackage()方法只是重啟整個應用程序,並不是強制終止整個應用程序,而且重啟後的應用程序的進程可能與之前的進程不同。
六、結論
以上就是退出Android應用程序的常用方法,選擇哪種方法取決於具體的需求和場景。如果需要終止整個應用程序,可以使用System.exit()、廣播和ActivityMananger的restartPackage()方法;如果只需要結束當前Activity,可以使用finish()方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242408.html