Android 连续按下返回键完全退出应用

已经很长时间没有写博客了,主要是工作太忙,但是现在觉得很有必要将一些细小的知识点梳理一下,也算是自己对以往的学习的总结,也希望对其他人有所帮助,好了废话少说,来说说今天的主题:两次按下返回键退出应用程序,这个主题里面涉及了两个小知识点:

(1) 连续两次按下返回键 退出应用


(2) 如何正确的退出应用程序


首先实现第一个功能:

思路:第一次按返回键时,将退出标志设置为true,并通过handler发送一个延迟2S的消息,如果两秒内用户没有按下第二次返回,那么在handleMessage中将退出标示设置为false


第二个功能:以前在网上发现了好多退出应用的方法,如下:

android.os.Process.killProcess(android.os.Process.myPid()) 但是经过证实,这个方法并不能完全退出应用,只能销毁当前Acivity

System.exit(0); 终止java虚拟机  也是没有效果的


那我就说说我的思路吧,自定义一个Application,并在其中创建一个List,保存应用中的所有的Activity,当创建一个Activity的时候,将该Activity加入列表,当销毁一个Activity的

时候移除该Activity。

直接看代码吧

public class MyApplication extends Application {
  private static final String TAG = "MyApplication";
  public List<Activity> allActivity=new ArrayList<Activity>();
  
  public void addActivity(Activity activity)
  {
    allActivity.add(activity);
  }
  
  public void removeActivity(Activity activity)
  {
    allActivity.remove(activity);
  }
  
  public void exitApp()
  {
    for(Activity a:allActivity)
    {
      a.finish();
    }
  }
}



public class MainActivity extends Activity {
  private Handler handler;
  private boolean isExitApp=false;
  private MyApplication myApp;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myApp=(MyApplication)this.getApplication();
    myApp.addActivity(this);
    handler=new MyHandler(this);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK)
    {
      if(isExitApp==true)
      {
        myApp.exitApp();
      }else
      {
        isExitApp=true;
        handler.sendEmptyMessageDelayed(1, 2000);
        Toast.makeText(this, "再次按下返回键就退出应用程序", 3000).show();
      }
     return true;
    }
    return super.onKeyDown(keyCode, event);
  }
  
  
  
  public static class MyHandler extends Handler
  {
    private WeakReference<MainActivity> parent;
    
    public MyHandler(MainActivity activity)
    {
      parent=new WeakReference<MainActivity>(activity);
    }
    @Override
    public void handleMessage(Message msg) {
      parent.get().isExitApp=false;
    }
  }
  
  @Override
  protected void onDestroy() {
    super.onDestroy();
    myApp.removeActivity(this);
  }

}

这里还涉及到一个知识点,在Activity中定义一个Handler的时候,最好是定义为static的,不然有可能灰导致内存泄露,好了 先写到这里吧,有什么不懂的欢迎留言....

你可能感兴趣的:(Android 连续按下返回键完全退出应用)