退出Android应用

怎么样退出我们的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值