61阅读

致命的应用程序退出-Android退出应用最优雅的方式

发布时间:2018-04-20 所属栏目:Android

一 : Android退出应用最优雅的方式

Android退出应用最优雅的方式

我们先来看看几种常见的退出方法(不优雅的方式)

一、容器式

建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity

  1. import java.util.ArrayList; 
  2. import java.util.List; 
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. public class BaseActivity extends Activity { 
  6. @Override 
  7. protected void onCreate(Bundle savedInstanceState) { 
  8. super.onCreate(savedInstanceState); 
  9. // 添加Activity到堆栈 
  10. AtyContainer.getInstance().addActivity(this); 
  11. @Override 
  12. protected void onDestroy() { 
  13. super.onDestroy(); 
  14. // 结束Activity&从栈中移除该Activity 
  15. AtyContainer.getInstance().removeActivity(this); 
  16. class AtyContainer { 
  17. private AtyContainer() { 
  18. private static AtyContainer instance = new AtyContainer(); 
  19. private static List activityStack = new ArrayList(); 
  20. public static AtyContainer getInstance() { 
  21. return instance; 
  22. public void addActivity(Activity aty) { 
  23. activityStack.add(aty); 
  24. public void removeActivity(Activity aty) { 
  25. activityStack.remove(aty); 
  26. /** 
  27. * 结束所有Activity 
  28. */ 
  29. public void finishAllActivity() { 
  30. for (int i = 0, size = activityStack.size(); i if (null != activityStack.get(i)) { 
  31. activityStack.get(i).finish(); 
  32. activityStack.clear(); 
  33.  

这种方法比较简单, 但是可以看到activityStack持有这Activity的强引用,也就是说当某个Activity异常退出时,activityStack没有即使释放掉引用,就会导致内存问题,接下来我们看一种类似的方式,但是会稍微优雅一点点

二、广播式

通过在BaseActivity中注册一个广播,当退出时发送一个广播,finish退出

  1. public class BaseActivity extends Activity { 
  2. private static final String EXITACTION = "action.exit"
  3. private ExitReceiver exitReceiver = new ExitReceiver(); 
  4. @Override 
  5. protected void onCreate(Bundle savedInstanceState) { 
  6. super.onCreate(savedInstanceState); 
  7. IntentFilter filter = new IntentFilter(); 
  8. filter.addAction(EXITACTION); 
  9. registerReceiver(exitReceiver, filter); 
  10. @Override 
  11. protected void onDestroy() { 
  12. super.onDestroy(); 
  13. unregisterReceiver(exitReceiver); 
  14. class ExitReceiver extends BroadcastReceiver { 
  15. @Override 
  16. public void onReceive(Context context, Intent intent) { 
  17. BaseActivity.this.finish(); 
  18.  

三、进程式

通过直接杀死当前应用的进程来结束应用,简单粗暴,而且有(wu)效!

  1. android.os.Process.killProcess(android.os.Process.myPid()); 
  2. System.exit(0); 
  3. ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
  4. manager.killBackgroundProcesses(getPackageName());  

这三种都能达到同样的效果,但是在模拟器上都会弹出 Unfortunately , XXX has stopped 消息提示框,但确实能退出应用。部分真机直接失效,只能finish当前Activity(比如我手上这台小米note,国产的几款ROM fw层改动太多,使用这种方式需慎重)

四、 RS优雅式

什么是RS式呢?即Receiver+singleTask 。我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前栈中查询是否存在Activity的实例,如果存在,则将其至于栈顶,并将其之上的所有Activity移除栈。我们打开一个app,首先是一个splash页面,然后会finish掉splash页面。跳转到主页。然后会在主页进行N次的跳转,期间会产生数量不定的Activity,有的被销毁,有的驻留在栈中,但是栈底永远是我们的HomeActivity。这样就让问题变得简单很多了。我们只需两步操作即可优雅的实现app的退出。

1、在HomeActivity注册一个退出广播,和第二个广播式一样,但是这里只需要在HomeActivity一个页面注册即可。

2、设置HomeActivity的启动模式为singleTask。

当我们需要退出的时候只需要startActivity(this,HomeActivity,class), 再发送一个退出广播。上面代码首先会把栈中HomeActivity之上的所有Activity移除出栈,然后接到广播finish自己。一切OK ! 没有弹框,不用考虑机型Rom适配。不会有内存问题,就是那么的优雅,简单!

五、SingleTask改版式

和一些小伙交流之后,很多小伙伴说注册广播略显麻烦,在楼下的小伙伴提出了一种更简单的方式,思路也很简单,

1、设置MainActivity的加载模式为singleTask

2、重写MainActivity中的onNewIntent方法

3、需要退出时在Intent中添加退出的tag

由于很多小伙伴对源码需求比较热切,我们这里就直接以代码的形式为大家讲解这种方式

第一步设置MainActivity的加载模式为singleTask

  1. android:launchMode="singleTask" 

第二步重写onNewIntent()方法

  1. private static final String TAG_EXIT = "exit"
  2. @Override 
  3. protected void onNewIntent(Intent intent) { 
  4. super.onNewIntent(intent); 
  5. if (intent != null) { 
  6. boolean isExit = intent.getBooleanExtra(TAG_EXIT, false); 
  7. if (isExit) { 
  8. this.finish(); 
  9.  

第三步 退出

  1. Intent intent = new Intent(this,MainActivity.class); 
  2. intent.putExtra(MainActivity.TAG_EXIT, true); 
  3. startActivity(intent);  

六、懒人式

这种方式更加简单,只需要如下两步操作

1、将MainActivity设置为singleTask

2、将退出出口放置在MainActivity

我们可以看到很多应用都是双击两次home键退出应用,就是基于这样的方式来实现的,这里在贴一下如何处理连续两次点击退出的源码private boolean mIsExit; 

  1. @Override 
  2. /** 
  3. * 双击返回键退出 
  4. */ 
  5. public boolean onKeyDown(int keyCode, KeyEvent event) { 
  6. if (keyCode == KeyEvent.KEYCODE_BACK) { 
  7. if (mIsExit) { 
  8. this.finish(); 
  9. else { 
  10. Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show(); 
  11. mIsExit = true
  12. new Handler().postDelayed(new Runnable() { 
  13. @Override 
  14. public void run() { 
  15. mIsExit = false
  16. }, 2000); 
  17. return true
  18. return super.onKeyDown(keyCode, event); 

 

二 : android 完美退出应用程序。

Android程序在点击回退键时,如果只有一个activity,调用finish()方法就能退出界面,如果有多个界面,在调用该方法时,只会销毁当前的activity,显示栈顶的其它activity,换言之,就是无法退出整个应用程序。下面是一种快速的退出整个应用的方法代码:

private void showTips() {AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle("提醒").setMessage("是否退出程序").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid());}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {return;}}).create(); // 创建对话框alertDialog.show(); // 显示对话框}

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {showTips();return false;}return super.onKeyDown(keyCode, event);}

三 : 我的电脑开机时总是提示:Kxeserv.exe-致命的应用程序退?

致命的应用程序退出

我的开机时总是提示: Kxeserv.exe-致命的应用程序退出 It failed to KxEInitializeBase with
error:Ox 这是怎么回事啊??急!急!急!!!!


金山毒霸自己的问题,将其卸载,重新下载安装最新版本的,或者换是换个杀毒软件!

四 : 退堂鼓:退堂鼓-出处,退堂鼓-戏曲中的应用

原指封建官吏退堂时打鼓。现在比喻跟人共同做事中途退缩。

退堂鼓_退堂鼓 -出处

元·关汉卿《窦娥冤》第二折:“左右,打散堂鼓,将马来,回私宅去也。”

退堂鼓_退堂鼓 -戏曲中的应用

戏曲中,退堂鼓与升堂鼓相对。

升堂鼓、退堂鼓是2种点。由堂鼓和小锣分奏合成,堂鼓为令。升堂鼓用于府县官员坐衙之前,退堂鼓用于公毕之后。升堂鼓,以三击为令,旧有大字:“奉王命”。退堂鼓以四击为令,大字是:“谢主隆恩”。这些大字只是为鼓令找个依据,亦好区别升、退堂。

此点子可分两截使用:头一小节多用于监斩官来到刑场之前,意味着行刑时刻未到,它是以鼓打两击为令,大锣打帮,连打二遍,名曰催命鼓。第二小节鼓重击为令,锣打光并掐音,意味着斩刑已施,给观众以人头落地之感,第二小节不单独使用,它与第一小节合并为监斩鼓。

鼓为令,锣打帮拟更鼓声,名曰更锣。一更、三更多由鼓、锣分着打,三、四、五更既可分着打,又可与堂鼓齐奏,四、五更以齐奏为多用。舞台上表现时间为深夜时,以堂鼓独奏,称为更鼓。更鼓用于表现人物在夜间活动的舞蹈动做中,称为哑边,这是根据舞蹈术语走边而得名.打罢五更之后再起更鼓时,则以击打鼓帮作终止,称其为亮更,表示天明。

以上所谈升堂鼓、退堂鼓、监斩鼓、更锣,是传统戏中留传下来的特殊形式的“单击”。

退堂鼓_退堂鼓 -参考资料

[1] 百度百科
[2] 京剧课堂 http://www.shidaiguocui.com/class_show.php?id=926

五 : 苹果Mac系统中的应用程序怎么强制退出?

当应用程序响应速度过慢时,可以使用强制退出关闭窗口

Windows 用户可以使用 CTRL+ALT+DELETE  强制关闭窗口,但 OS X Yosemite 的操作系统是非常稳定的,虽然有时候在应用程序停止工作的时候,用户也需要进行强制退出。在此我们会介绍几种强制关闭应用程序的方法,可以使用 强制退出 命令,也可直接重启电脑。

方法一:使用Dock 菜单栏里面的强制退出键

在屏幕下方进入 Dock 菜单栏,找到需要关闭的应用程序的图标,按住鼠标右键(或者 按住 ctrl时点击鼠标)弹出菜单栏,点击最后一个  退出 选项,然后一般应用程序就会关闭了,如果没有,再进行第二次操作,但是记住在菜单栏弹出来的时候按住 alt键,退出 选项会变成 强制退出,点击强制退出,便能立即强制关闭应用程序了。

方法二:使用强制退出键

现在我们来介绍另外两种使用 强制退出 命令的方法,第一种方法:点击屏幕左上方的苹果图标,下拉列表选择最后一个 强制退出 选项。第二种方法:按住 command+alt+esc 三个按键,在弹出的窗口中会显示正在运行的所有应用程序,无响应的 app 后会显示 无响应,选中要关闭的应用程序,点击窗口下方的 强制退出,然后重新运行该程序检测其是否能正常工作

方法三:应用程序无响应又不能进行其他操作时怎么办?

在某些情况下,当应用程序无反应,且不能离开该程序进行上述的强制退出时,按住 cmd+alt+shift+esc 四个键,关闭 OS X 程序。

方法四:使用 Activity Monitor

想要找出系统运行出错的地方,可以使用内置的活动监视器,点击进入 Finder,在导航栏内找到  应用程序>实用工具>活动监测器,打开活动监测器,所有正在运行的应用程序都会显示出来,包括每个软件所占的 CPU,内存,网络等数据信息,随便双击一个应用程序,都会弹出一个独立窗口,显示出当前应用程序的更多相关信息以及目前状态,用户可选择 取样,便会获得此程序在一段时间内的活动报告,但这个程序太过专业化,可能很多用户会看不明白,所以,接下来再介绍一种更实用的强制退出的方法。

方法五:当计算机系统失控的时候怎么处理?

在有些情况下,因为一个应用程序的故障可能会导致整个计算机系统失控,但是这种情况出现的几率也是比较小的,对于大多数用户来说,解决这种问题的唯一办法 可能是选择电源按钮了。按下电源按钮后屏幕上通常都会弹出消息询问是否确认强制关机,然后系统会自动进入休眠状态,如果长按电源按钮,将会弹出一个窗口显 示出“ 重启,休眠,关机”几个选项。但是如果在系统严重崩溃的情况下,这些选项可能不会显示出来,所以最后的一个解决方案就是长按电源按钮直到电脑完全断电,这 个方法虽然能让用户重启恢复 Mac,但是由于电脑的突然终止运行可能会造成某些数据的丢失,在这种情况下,这也是唯一使电脑恢复工作的方法了。

本文标题:致命的应用程序退出-Android退出应用最优雅的方式
本文地址: http://www.61k.com/1116723.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1