Android企业级程序完全退出的解决方案

一、问题描述

        在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决。一般要么是一个简单的finish(只是退出当前的activity),要么是其他的方法,比如:

 

       1、第一种方法:首先获取当前进程的id,然后杀死该进程:  android.os.Process.killProcess(android.os.Process.myPid());

       2、第二种方法:终止当前正在运行的Java虚拟机,导致程序终止:System.exit(0);

       3、第三种方法:强制关闭与该包有关联的一切执行:  ActivityManager manager = ( ActivityManager ) getSystemService ( Context.ACTIVITY_SERVICE );   

                                                                                                       manager.restartPackage(getPackageName());

             使用这个方法需要加入权限<uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/>

        但是,这几种方法都是有缺陷的,都不能完全退出程序,比如方法一,它不会把当前应用程序的activity的task栈清空。对于第三种方法,它只能杀死其他的应用程序而不能杀死自己的。

 

二、解决方案

        1、实现思路:既然不能一次性全部关闭所有的Activity,一般企业的解决方法就是记录所有打开的Activity,利用单例模式管理Activity,然后在退出程序的时候把所有打开的Activity关闭掉。

        2、代码:

              ⑴新建一个类App继承Application,它的作用是创建整个应用程序的全局实例,而且需要在AndroidManifest.xml清单里面添加一下。

                  

            App类:

 

package com.example.testexit;import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Application;public class App extends Application {ArrayList<Activity> activities;private static App instance;/** 在整个应用程序创建时执行*/@Overridepublic void onCreate() {activities = new ArrayList<Activity>();getInstance();super.onCreate();}public static App getInstance() {if (null == instance) {instance = new App();}return instance;}public void exitApplication() {List<Activity> lists = instance.activities;for (Activity a : lists) {a.finish();}}
}

 

             在其它的Activity里面,要在onCreate方法里把当前Activity加进去,然后在onDestroy方法里移除这个Activity。

 

             MainActivity:

 

package com.example.testexit;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);App app = (App) getApplication();app.activities.add(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overrideprotected void onDestroy() {super.onDestroy();App app = (App) getApplication();app.activities.remove(this);}}

             Activity1:

 

 

package com.example.testexit;import android.app.Activity;
import android.os.Bundle;public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);App app = (App) getApplication();app.activities.add(this);}@Overrideprotected void onDestroy() {super.onDestroy();App app = (App) getApplication();app.activities.remove(this);}}

        关于这方面的内容,还可以参考其他的几篇文章 http://www.2cto.com/kf/201108/99444.html

 

                                                                                                http://blog.csdn.net/sgl870927/article/details/6281971

                                                                                                http://www.cnblogs.com/qingblog/archive/2012/06/08/2541790.html

              




 

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/06/3002698.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

块设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、正确理解块设备驱动的概念 1、块设备和字符设备的差异 块和字符是两种不同的访问设备的策略&#xff1b;同一个设备可以同时支持块和字符两种访问策略&#xff1b;设备本身的物…

Centos 统计文件夹下文件和文件夹的个数

运营管理中经常会碰到关于文件统计的需求&#xff0c;近期在做系统迁移&#xff0c;正好做个备忘。关键词&#xff1a;d : directory- : 一般文件以下命令在需要统计的目录下进行&#xff0c;如&#xff1a;# cd 目标文件夹统计某文件夹下文件的个数# ls -l |grep "^-&…

java中有scoreframe类型嘛_java构造函数的三种类型总结

我们说构造函数能处理参数的问题&#xff0c;但其实也要分三种情况进行讨论。目前有三种类型&#xff1a;无参、有参和默认。根据不同的参数情况&#xff0c;需要我们分别进行构造函数的讨论。这里重点是无参构造函数的初始化也要分两种方法进行分析。下面我们就这三种不同的构…

内核链表的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、内核链表的设计思路 1、普通链表的数据区域的局限性 如果链表节点要存储一个int类型的数据&#xff0c;可以在数据区域定义int data。但是实际编程中&#xff0c;链表的节点不会这么简单&#…

框架模式和设计模式的区别

框架模式和设计模式的区别有很多程序员往往把框架模式和设计模式混淆&#xff0c;认为MVC是一种设计模式。实际上它们完全是不同的概念。[7]框架、设计模式这两个概念总容易被混淆&#xff0c;其实它们之间还是有区别的。框架通常是代码重用&#xff0c;而设计模式是设计重用&a…

netbeans搭建安卓开发环境

2019独角兽企业重金招聘Python工程师标准>>> NetBeans 上开发 Android 应用程序需要安装一个 Android SDK 和针对 NetBeans 的 Android 开发插件 下载并安装 Android SDK 下载 Android SDK 解压后运行 tools\android.bat update sdk 进行升级&#xff0c;根据所选内…

Linux设备驱动模型4——基于平台总线的LED驱动实践

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 platform总线驱动代码分析 平台设备与平台驱动的注册_天糊土的博客-CSDN博客 一、有driver无device 本节把之前的LED驱动源码改写成平台总线制式&#xff0c;先实现platform_driver。 1、…

StringIO类的用途

import StringIO as SIOs1 "Hello" print id(s1) s2 "Hello" s1 print id(s2) sp SIO.StringIO() sp.write("Hello") print sp.getvalue() print id(sp) sp.write("Leon") print sp.getvalue() print id(sp) exit() 主要进行字符串…

VS2010皮肤控件介绍

在我们平时使用的各种工具中&#xff0c;如QQ&#xff0c;迅雷&#xff0c;以及各种空间等&#xff0c;都提供了一些换肤功能&#xff0c;可以让我们选择各种我们喜欢的界面。本文就对VS中常用的窗口程序做一个简单的换肤&#xff0c;利用一个dll文件来进行实现。 首先我们要加…

mimemultipart java_最佳实践 – 发送javamail mime multipart电子邮件和gmail

我有一个Tomcat应用程序需要发送确认电子邮件等。我已经用Javamail(mail.jar)编写了电子邮件发送多部分文本/ HTML电子邮件。我基于Java EE示例的代码。我在本地服务器上使用SMTP MTA。它的作品很棒在Outlook中&#xff0c;我看到了HTML版本。如果我将其拖动到Outlook垃圾邮件文…

framebuffer驱动详解0——framebuffer的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、framebuffer的简介 1、framebuffer的含义 framebuffer的中文意思是“帧缓冲”&#xff0c;简称fb。 2、fb是虚拟的字符设备 fb是内核虚拟的一个字符设备&#xff0c;即它是用代码构建出来的&…

Linux下Chromium使用flash的办法

环境说明:系统: CentOS 6.5 X64很简单&#xff0c;主要原因是在启动Chromium的时候指定了自有的Flash&#xff0c;我们可以在启动参数上去除指定的Flash&#xff01;sudo vim /usr/bin/chromium-browserCHROMIUM_RHEL_FLAGS"--enable-plugins --enable-extensions --ena…

ie7浏览器传输中文的问题

调用jquery的$.get()(此方法应该的对字符串进行了编码)向服务器发送中文字符串时 ie7浏览器会在后面加一个空格&#xff08;服务器接收时还应该进行解码encode("utf-8").strip()再去空格&#xff09;转载于:https://www.cnblogs.com/aveenzhou/archive/2013/04/09/30…

MySQL和Mariadb都启动不了了_linux centos7mariadb安装成功启动不了 解决思路

查看系统日志/var/log/mariadb/mariadb.log190313 14:31:03 InnoDB: Database was not shut down normally!InnoDB: Starting crash recovery.InnoDB: Reading tablespace information from the .ibd files...InnoDB: Restoring possible half-written data pages from the dou…

framebuffer驱动详解1——应用层编程实践

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、步骤总结 步骤1&#xff1a;打开设备文件 步骤2&#xff1a;获取设备信息 步骤3&#xff1a;mmap函数做映射 步骤4&#xff1a;填充framebuffer 二、步骤分析 1、打开设备文件 设备文件为/dev…

(转)API SOCKET基础(一) TCP建立连接并通信

写这篇日志&#xff0c;并不是要记录令人眼前一亮的算法&#xff0c;只是为了本人健忘的脑袋做一点准备。 要进行网络通信编程&#xff0c;就要用到socket&#xff08;套接字&#xff09;&#xff0c;下面以TCP为例展示如何利用socket通信。 要 进行socket编程&#xff0c;首先…

5shift shell

echo offcopy %systemroot%\system32\taskmgr.exe %systemroot%\system32\sethc.execopy %systemroot%\system32\taskmgr.exe %systemroot%\system32\dllcache\sethc.exepause转载于:https://www.cnblogs.com/upshania/p/3817258.html

java 线程转储_获取Java线程转储的常用方法(推荐)

1. 线程转储简介线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。线程调用栈, 也称…

framebuffer驱动详解2——fb驱动框架分析(核心层)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 framebuffer驱动框架包括以下两部分&#xff1a; 1、内核开发者实现的部分&#xff08;核心层&#xff09; rootubuntu:省略部分路径/x210_kernel/drivers/video# ls *.o built-in.o …

Oracle conn 协议适配器错误解决

Oracle conn 协议适配器错误 --解决方法C:\Documents and Settings\administrator>set oracle_sidmyoracleC:\Documents and Settings\administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12月 26 09:47:16 2012Copyright (c) 1982, 2005…