怎么样退出我们的App呢?一般的做法是调用Activity.finish(),同时会触发onStop(), onDestroy()。其实我们的程序并没有真正退出,只是停止运行,进入后台保存到内存中。可以通过长按Home健检查。何时退出,一般由Android系统决定,当需要回收内存时,而且我们的App是最久没有使用的,就会被kill掉,回收内存。
当然也可以通过killProcess的方式退出,这样程序占用的内存就会被立即回收,后台的线程也会被kill掉。不过Android开发文档是不建议这样做的,不利于应用的二次启动,有损用户体验。手机的内存越来越大,也许采用这种退出方式的应用会越来越少。
如果采取finish的方式来退出应用,一般就要考虑onDesdroy时做一些清理工作,比如停止后台线程、做一些数据的保存等。
举个例子:
public class MainActivity extends AppCompatActivity {
static final String LOGTAG = "ZWY";
private MyThread mThread;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
mThread = new MyThread("thread 1");
mThread.start();
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
finish();
// System.exit(0);
}
});
return true;
}
@Override
public void onStop() {
Log.d(LOGTAG, "app onStop");
//mThread.teminate();
super.onStop();
}
@Override
public void onDestroy() {
Log.d(LOGTAG, "app destroy");
//mThread.teminate();
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
class MyThread extends Thread {
MyThread(final String name) {
mName = name;
}
private boolean isRunning = true;
void teminate() {
isRunning = false;
}
@Override
protected void finalize() throws Throwable {
Log.d(LOGTAG, "thread finalize");
super.finalize();
}
private String mName;
@Override
public void run() {
// 线程的主体代码,一般是一个耗时的任务
int t = 0;
while (isRunning) {
Log.d(LOGTAG, mName + " is running" + t++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(LOGTAG, mName + " teminate ");
}
}
}
在上面这个例子中,点击“退出”按钮后,调用Activity.finish()停止activity,后台线程仍然在运行。再次启动时,原来的线程仍然运行,并会创建新的线程。再次启动时,会走一个完整的初始化过程。
在开发过程中,要注意程序的这种行为。先弄清除Android系统的机制,根据实际情况做处理。
进程进入后台,保存到内存,只是相当于应用失去了焦点,不会从用户接收到事件,后台的线程仍然在运行。但当重新启动时,程序又会重新初始化。所以在onDestroy时,我们要考虑回收线程,保存数据。
具体的处理行为要看我们退出的行为:
1 调用Activity.finish()
会触发onStop, onDestroy
2 调用moveTaskToBack
会触发onStop
3 killProcess