Android 怎么退出整个应用程式
在Android中,Activity有个栈,一个Activity结束掉,会回到上一个Activity,并不是退出应用程式。
Android中,退出应用程式的方式:
通过pid
int pid = androidosProcessmyPid(); 获取当前应用程式的PID
androidosProcesskillProcess(pid); 杀死当前程序
这种方法退出应用,是会保留某些后进程,例如:Service,Notifications等。
2通过ActivityManager
ActivityManager manager = (ActivityManager)contextgetSystemService(ACTIVITY_SERVICE); 获取应用程式管理器
managerkillBackgroundProcesses(getPackageName()); 强制结束当前应用程式
这种方式退出应用,会结束本应用程式的一切活动,因为本方法会根据应用程式的包名杀死所有程序包括Activity,Service,Notifications等。
呼叫Systemexit(0);
其实还有一种方法也不错,把MainActivity设定为singleTop,先跳转到MainActivity然后finish就行,不过要注意停掉相应的Service
大家都知道 Android 的 Activity 是存著历史栈的,比如从 A -> B -> C,C 完成 finish 后回到 B,把所有的Activity 都 finish了,程式就自然退出了。 当然在 finish 的同时也需要是否自己程式的其他资源。所以需要想个办法把 Activity 给存起来。然后在程式退出的地方呼叫它们的 finish()方法。
使用全域性变数。对了,第一个想到的就是继承 Application,程式码入下。
public class AgentApplication extends Application { private List<Activity> activities = new ArrayList<Activity>(); public void addActivity(Activity activity) {activitiesadd(activity);} @Overridepublic void onTerminate() {superonTerminate();for (Activity activity : activities) {activityfinish();}onDestroy();Systemexit(0);}}
然后在 Activity onCreate 的时候来呼叫 addActivity (),有人可能想到这个Application需要在所有的 Activity onCreate的时候都使用,需要做一个单例例项。其实根本不需要。在 Activity 中使用 thisgetApplication() 就可以了。
最后在你需要推出程式的地方呼叫 applicationonTerminate() 就可以了。记住:superonTerminate() 必须呼叫,程式码中的 onDestroy()是我自己的释放其他资源的方法,不是系统的。
执行以上程式码后,在LogCat 中会出现一行提示:
Process 包名 (pid xxxxx) has died 证明你的程式退出了。现在你可以测试了。
有几种方法,一种是:程式退出时,下方有写 在按一次退出程式
第二种,进 设定-应用程式-正在执行 这一栏自己关
有时跳转的activity较多时,还需要多次按返回键,这样感觉一点都不爽。 后面添加了一个选单返回功能键,这个方法也只能用systemexit(0)来关闭当前活动的Activity,附程式码: public boolean onCreateOptionsMenu(Menu menu){superonCreateOptionsMenu(menu); MenuItem item = menuadd(MenuNONE, MenuNONE, MenuNONE, "Exit"); itemsetOnMenuItemClickListener(new MenuItemOnMenuItemClickListener(){public boolean onMenuItemClick(MenuItem item){Systemexit(0); return true;}});return true;}想到这样太不方便了,每次退出介面之后应用程式还在执行,今天查了下资料终于把这个问题给解决了, 网上提供了几种方法,我吸收了下面这个自认为简单易懂的方法,将下面SysApplication这个类复制到工程里面,然后在每个Acitivity的oncreate方法里面通过SysApplicationgetInstance()addActivity(this);添加当前Acitivity到ancivitylist里面去,最后在想退出的时候呼叫SysApplicationgetInstance()exit();可直接关闭所有的Acitivity并退出应用程式。 附程式码:import javautilLinkedList; import javautilList; import androidappActivity; import androidappAlertDialog; import androidappApplication; import androidcontentDialogInterface; import androidcontentIntent; public class SysApplication extends Application { private List mList = new LinkedList(); private static SysApplication instance; private SysApplication() { } public synchronized static SysApplication getInstance() { if (null == instance) { instance = new SysApplication(); } return instance; } add Activity public void addActivity(Activity activity) { mListadd(activity); } public void exit() { try { for (Activity activity : mList) { if (activity != null) activityfinish(); } } catch (Exception e) { eprintStackTrace(); } finally { Systemexit(0); } } public void onLowMemory() { superonLowMemory(); Systemgc(); } } 在应用程式里面 的activity的oncreate里面新增SysApplicationgetInstance()addActivity(this)如:public void onCreate(Bundle savedInstanceState){superonCreate(savedInstanceState);
你可以长按主屏键后,在其中关闭应用程式。但并不能完全退出执行记忆体
正常的 方便你下次调用,安卓系统很智能的占用太多会自动关掉,耗电大的也会提示你关掉,手机和电脑不一样内存占用多不会卡
其实吧,Android是Linux的内核,每一个程序都是一个独立的JAVA虚拟机,就和油汤里的油花一样互不干扰,这样充分保证了万一某个程序的JAVA虚拟机崩溃,系统依旧稳定正常运行而Android和传统Linux不一样的地方又在于,传统Linux在进程活动停止后就结束了,这就类似于我们用S60和WM一样,关闭程序,内存释放而Android会把这些进程保留在内存里,干嘛呢为了保证你再次激活这些进程时候启动的更快,比如说我们挂在桌面的Widgets,具体一点我们拿新浪微博举例吧我刚看完,退出,突然我想我发一条微博吧,那么这个时候我可以直接在桌面Widgets上 *** 作----设想一下如果我退出的时候这个进程就终止了,那么我在桌面上点击Widgets的时候会不会卡顿一下甚至没有响应----这就跟我们把Widgets挂在桌面的行为完全背离了,放在桌面上就是为了能随时观察到程序运行的情况,以及随时可以快速调用程序所以Android并没有在进程活动停止就释放对应的内存那么也许你还是会有疑问,那么内存够不够用呢
因为大家这么多年Windows都用习惯了,Windows内存不足的时候机器卡的会让你想砸掉机箱,而且调用虚拟内存的时候硬盘喀喀喀想的让你肉疼你肯定也会怕你的手机明明512M内存结果就剩下30来M把你卡到崩溃事实上呢,Android会在系统需要更多内存的时候,去释放掉那些占用内存的进程----这个活动是智能的最早大家认为是有个排序,比如最近使用过哪些程序(LRU机制,Last Recently Used),然后结束最早的进程不过并非如此,否则就变成我们上小学时候那样,个子高的块头大的男生跟班长下去拔草扛新书,女生们留在班里绣花吧这样很明显不公平而且没准会结束掉那些我们并不想结束掉的进程----譬如说这会儿我想切回到刚才后台的网页继续浏览结果悲怆的发现它被系统给我强制关闭了
Android把进程分成了一些优先级,比如前台进程(Foreground),比如我们正在看书,那么看书的程序就是前台进程,这些进程是不会被系统优先结束的当我把它切到后台的时候,它就变成后台进程了
还有可见进程(Visible),这个怎么说呢,譬如输入法程序,你平时是看不见它的,但是在你打开输入界面的时候,它会很快的d出来,而不是让你等啊等啊等,看不到的原因是透明度的机制,咱就不要钻牛角尖讨论为啥我看不见了还有桌面的Widgets,比如我们的桌面时钟,这个东西就是可见的,如果它被系统终止了会有什么样的结果这个Widgets依然会显示在桌面上,但是时针不走了
主要服务,比如说,电话的拨号功能,你也不想正急着打电话呢结果人家给你卡半天吧,尤其像我这样联系人上2000的,载入一遍真的很慢啊所以这些主要服务平时也不会被系统自动结束,除非你非要关它,关了也会自己重新加载的这也是你完全释放内存以后过一会就看着内存可用值又慢慢降低的原因
次要服务(secondary server),诸如谷歌企业套件,Gmail,联系人,看着这些程序出现在任务管理器里可能你会非常的莫名其妙,丫的这都哪跟哪啊我没开啊其实它们和一些系统功能也是息息相关的,比如Gmail的邮件推送,我们时常需要用到它们,所以系统也太会去终止它们甚至于HTC机器上著名的HTC Sense,这个也是次要服务,但是其实它承接着整个系统界面的运行,所以,如果你强行关闭所有进程的时候,你的屏幕会变成一片白然后慢慢等HTC Sense加载
后台进程(hidden),就是我们通常意义上理解的启动后被切换到后台的进程,比如如浏览器和阅读器后台进程的管理策略有多种,但是一般来讲,系统都会视内存情况,尽可能多的保留后台程序,这样会影响到你启动别的程序的运行速度----我想这个很好理解,因为内存确实不够了,而且你还没让系统自动释放内存但好处是,你再次切换到这些已启动的程序时几乎是无缝的,速度绝对比你从0开始启动它要快得多所以,这种后台进程在内存极度不够的时候,肯定会被系统选择性的干掉的
内容供应节点(content provider),没有程序实体,仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等在系统自动终止进程时,这类程序享有优先的被干掉权
空进程(empty),没有任何东西在内运行的进程,有些程序在退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息这部分进程无疑是系统最先终止的
说了这么多,其实还是要结合实际的程序来看一下的,比如Android这个很有名的自动内存调配的软件,Auto Memory Manager,它的设置和帮助界面就如上面所说的,它自动提供了多种默认配置,例如极速模式,这个模式下,会帮助你在设定好的临界值区间上,结束空进程以及内容供应节点等等低优先级保留权的进程,来给你腾出更多的内存,加速新运行程序打开的速度,但是它也说明了这种模式的弊端,就是一些可能你不想被关闭的进程会被过早的关闭,比如说,闹钟----在G2 G3还很火爆的2009年,很多用户在买完手机后给我抱怨,哎呀这个机器闹钟怎么老不响啊上班老迟到其实这就是因为手动结束进程的时候结果把闹钟也给干掉了系统的时间是会一直走的,这属于主要服务,而闹钟呢,只是主要服务的一个附属品,所以被结束后,是不会自动被启动的,既然没有启动自然就不会响了与此类似的例子就是里程碑不充电的BUG,这是因为Moto的机器里有个USB的进程,如果你把它结束后,理论上会重新启动的但是也会不启动,后面这种情况出现的结果就是你插充电器没反应,插数据线连电脑没反应重启手机就好了
新的程序的activity对象和原来崩溃的程序的activity对象不一样。所以退出的时候exit()方法就没用了。
自己的addActivity方法在哪里调用的?
还有,自己的这个数据结构用的不对。最好用set或者map来管理activity。
否则当自己多次启动一个activity的时候,会往list里面加入同一个对象,造成内存泄露。
以上就是关于Android 怎么退出整个应用程式全部的内容,包括:Android 怎么退出整个应用程式、android系统的手机上跑的软件很多都无法关闭、退出、求助,android程序运行崩溃,然后不能全部退出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)