Android应用正确的退出方式(单例模式)
2016-04-15 11:31
597 查看
相信面试过的程序员都会在面试题库中看到如果退出应用,而且平时能在项目中见到这样的写法:
这种方法并不推荐,查阅资料发现:android中所有的activity都在主进程中,在Androidmanifest.xml中可以设置成启动不同进程,Service不是一个单独的进程也不是一个线程。当你Kill掉当前程序的进程时也就是说整个程序的所有线程都会结束,Service也会停止,整个程序完全退出。这样的话,如果你需要service后台运行处理逻辑数据,那么它就失去了作用。
还有一种:
这种也不是标准的退出App的做法。有人测试过:activity若跟service没有bind一起,那么在activity中调用system.exit(0)之后,整个程序确实马上退出了,但是你仔细观看一下系统的log,会有个schedule restart 你的应用名 5000ms later,也就是说系统会重启你的service,你可以做个试验测试一下(本人没有测试)。
今天介绍的是单例模式,思路:所有activity继承BaseActivity,BaseActivity继承FragmentActivity(不继承Activity是为了项目中经常会用到fragment,所以这里直接继承FragmentActivity),然后所有的activity加入到MyApplication中的activity栈,结束应用时,直接循环一个一个finish()。
直接上log图:
BaseActivity代码:
MyApplication类:
MainActivity中退出应用的代码:
本人csdn博客积分太少,只能加积分下载了,支持一下哈,希望谅解啊,其实本文讲的已经很详细了。
项目下载:
http://download.csdn.net/detail/qq1377399077/9491919
android.os.Process.killProcess(android.os.Process.myPid());
这种方法并不推荐,查阅资料发现:android中所有的activity都在主进程中,在Androidmanifest.xml中可以设置成启动不同进程,Service不是一个单独的进程也不是一个线程。当你Kill掉当前程序的进程时也就是说整个程序的所有线程都会结束,Service也会停止,整个程序完全退出。这样的话,如果你需要service后台运行处理逻辑数据,那么它就失去了作用。
还有一种:
System.exit(0)
这种也不是标准的退出App的做法。有人测试过:activity若跟service没有bind一起,那么在activity中调用system.exit(0)之后,整个程序确实马上退出了,但是你仔细观看一下系统的log,会有个schedule restart 你的应用名 5000ms later,也就是说系统会重启你的service,你可以做个试验测试一下(本人没有测试)。
今天介绍的是单例模式,思路:所有activity继承BaseActivity,BaseActivity继承FragmentActivity(不继承Activity是为了项目中经常会用到fragment,所以这里直接继承FragmentActivity),然后所有的activity加入到MyApplication中的activity栈,结束应用时,直接循环一个一个finish()。
直接上log图:
BaseActivity代码:
package com.example.lenovo.myapplication; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class BaseActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyApplication.getInstance().addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); MyApplication.getInstance().finishActivity(this); } }
MyApplication类:
package com.example.lenovo.myapplication; import android.app.Activity; import android.app.Application; import android.util.Log; import java.util.Stack; public class MyApplication extends Application { private static Stack<Activity> activityStack; private static MyApplication singleton; @Override public void onCreate() { super.onCreate(); } public static MyApplication getInstance() { if(singleton==null){ singleton =new MyApplication(); } return singleton; } /** * 把Activity添加到栈中 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<>(); } activityStack.add(activity); Log.e(activity.getClass().getName(), "当前回退栈的Activity数量:" + activityStack.size()); } /** * 当前Activity */ public Activity currentActivity() { Activity activity = activityStack.lastElement(); return activity; } /** * 结束当前Activity */ public void finishCurrentActivity() { Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 结束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); activity.finish(); activity = null; } } public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); } } } public void finishAllActivity() { for (int i = 0, size = activityStack.size(); i < size; i++) { if (null != activityStack.get(i)) { Log.e("gnifeifeiing","已结束:"+activityStack.get(i).getClass().getName()); activityStack.get(i).finish(); } } activityStack.clear(); } /** * 退出应用 */ public void ExitApp() { try { finishAllActivity(); } catch (Exception e) { } } }
MainActivity中退出应用的代码:
long time = 0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - time > 2000) { time = System.currentTimeMillis(); Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show(); } else { // finish(); MyApplication.getInstance().ExitApp(); } } return true; }
本人csdn博客积分太少,只能加积分下载了,支持一下哈,希望谅解啊,其实本文讲的已经很详细了。
项目下载:
http://download.csdn.net/detail/qq1377399077/9491919
相关文章推荐
- 提升Android应用视觉吸引效果的10个UI设计技巧
- 基于Android"今日事今日毕"的使用介绍
- 开发人员和设计师应该安装的10个Android应用
- 你的Android应用完全不需要那么多的权限
- Android应用如何开机自启动、自启动失败原因
- android获取mac地址
- Android学习资料
- 对抗Android逆向
- Android逆向分析学习与研究(1)————工欲善其事必先利其器
- android经典Demo
- android之service简介
- android进程优先级
- Android平台应用开发笔记(一)
- Android学习03
- Android访问网页
- WebView的简单用法
- 使用标准库里的fragment
- Android如何得到电量、温度、电压
- Fragement
- Android应用源码安卓局域网飞鸽传输项目