一、直接退出
直接退出是最为简单的方法,只需要在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()方法。