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

标签: android 企业 程序 | 发表时间:2013-04-06 13:07 | 作者:wangjinyu501
出处:http://blog.csdn.net

一、问题描述

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

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

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

       3、第三种方法:强制关闭与该包有关联的一切执行: ActivityManagermanager = (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;

	/*
	 * 在整个应用程序创建时执行
	 */
	@Override
	public 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 {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		App app = (App) getApplication();
		app.activities.add(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	protected 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 {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		App app = (App) getApplication();
		app.activities.add(this);
	}

	@Override
	protected 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

              




作者:wangjinyu501 发表于2013-4-6 13:07:48 原文链接
阅读:9 评论:0 查看评论

相关 [android 企业 程序] 推荐:

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

- - CSDN博客推荐文章
        在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决. 一般要么是一个简单的finish(只是退出当前的activity),要么是其他的方法,比如:.        1、第一种方法:首先获取当前进程的id,然后杀死该进程:  android.os.Process.killProcess(android.os.Process.myPid());.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

Android调试程序技巧

- - ITeye博客
在开发的过程中我们经常需要调试程序的执行路径,如我们想知道一个Activity的生命周期方法的调用顺序,我们可能会写如下代码. 这样每次都要输入两个参数,有没有更简便的方法呢. 我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号.

Android 程序框架设计

- - 互联网的那点事
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心. 通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法. 我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验了的.

Eclipse开发Android应用程序入门

- Bingnan - 酷壳 - CoolShell.cn
原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/. 如今的移动设备应用程序开发充满着让人振奋的东西. 功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战.

BlueStacks将Android程序运行在Windows上

- nowhere - Solidot
今年初,一家叫BlueStacks的创业公司宣布,将为Windows操作系统开发Android运行时环境,让Android应用程序能运行在Windows上. 现在,该公司发布了其产品BlueStacks Android Player的alpha公测版. 如该公司所承诺的,Windows上运行的Android应用程序的性能没有下降.

android应用程序线程的监控

- - CSDN博客推荐文章
所以就开始研究起来,经过半天的模式总用有点启发,下面就简单介绍一个简单的线程监控:. DDMS是一款Google* 提供的应用,可作为独立的工具运行,也可通过ADT Eclipse* 插件集成到Eclipse* 中. 它提供了强大的特性集合,能帮助您快速了解应用的运行状况. 线程更新DDMS中的线程监控和评测浏览对于管理大量线程的应用很有用.

Android程序Crash时的异常上报

- - CSDN博客移动开发推荐文章
转载请注明来源:http://blog.csdn.net/singwhatiwanna/article/details/17289479. 大家都知道,android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.

Android程序反破解技术

- - CSDN博客推荐文章
    对抗反编译可以大概分为以下几点:.     1、对抗反编译工具,例如apktool、dex2jar等.     2、对抗静态编译,分为代码混淆技术、NDK保护、apk加壳保护.     3、对抗动态调试,分为检测调试器、检测模拟器.     4、防止重编译,分为检查签名,校验保护.     更多相关内容请参考《Android软件安全与逆向分析》.

Android 一个应用程序调用另一个应用程序

- - CSDN博客推荐文章
实现行业应用调用我们可以Get到哪些技能. * Activity的singleTask的启动模式 * 界面跳转的基本实现 * 前台Service的基本介绍和实现 * SharedPreference的简单用法. 在XHL应用程序中去调用MPos应用程序,借助MPos的一些界面完成特殊的功能. (1)创建名为XHL的应用程序.