android完全退出程序(android退出有多个activity的应用)

分类:android基础架构2012-08-03 10:36625人阅读评论(0)收藏举报

androidapplicationconstructorfilterexceptionj2se

这里介绍两种方法:一种把每个activity记住,然后逐一干掉;另一种思路是使用广播。本文来源于网络,如有雷同,那是必须的。写此贴只是为了总结一下常用东东,还望原作者莫怪,本人真不是想侵权。

方法一、用list保存activity实例,然后逐一干掉
上代码:
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;

public class SysApplication extends Application {
private List<Activity> mList = newLinkedList<Activity>();
private static SysApplication instance;

private SysApplication() {
}

public synchronized static SysApplication getInstance() {
if (null == instance) {
instance = newSysApplication();
}
return instance;
}

// add Activity
public void addActivity(Activity activity) {
mList.add(activity);
}

public void exit() {
try {
for (Activity activity :mList) {
if (activity!= null)
activity.finish();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}

@Override
public void onLowMemory() {
super.onLowMemory();
System.gc();
}

}

====================
20120504对上面代码做个改正:
由于application在项目中其是本身已经是单例了,上面的单例写法有些不妥,而且会报错:
ERROR/AndroidRuntime(5735): java.lang.RuntimeException: Unable to instantiateapplication com.android.MyApplication: java.lang.IllegalAccessException: accessto constructor not allowed
现在改为如下:
private static MyApplication instance;
@Override

public void onCreate() {
super.onCreate();

instance=this;
}
/**
* 获取全局变量
* @return
*/
public static MyApplication getInstance(){

return instance;
}

这样用MyApplication.geiInstance就不会出错了!修改完毕!

在每个ActivityonCreate方法中添加类似代码:

[java] public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SysApplication.getInstance().addActivity(this);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SysApplication.getInstance().addActivity(this);
}

在需要退出程序的时候,调用:

SysApplication.getInstance().exit();
SysApplication.getInstance().exit();

简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity finish方法


附:此方法也可参考链接:http://maosidiaoxian.iteye.com/blog/1404725

方法二、使用广播

2.2退出整个应用难免让人困扰,曾经一度的尝试一下方式:
ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(package);
不行

android.os.Process.killProcess(android.os.Process.myPid());
也不行

manager.restartPackage(package);
还是不行

Intent MyIntent = new Intent(Intent.ACTION_MAIN);
MyIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(MyIntent);
finish();
这个只是退回到桌面,如果打开多个Activity关闭重新打开也会有问题,还是还是不行

看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:
public abstract class EnterActivity extends BaseActivity {
...
//
写一个广播的内部类,当收到动作时,结束activity
private BroadcastReceiver broadcastReceiver = newBroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
unregisterReceiver(this);//
这句话必须要写要不会报错,不写虽然能关闭,会报一堆错
((Activity)context).finish();
}
};

@Override
public void onResume() {
super.onResume();

//
在当前的activity中注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(Attribute.PAGENAME);
registerReceiver(this.broadcastReceiver,filter); //
注册
}

/**
*
关闭
*/
public void close() {
Intent intent = new Intent();
intent.setAction(Attribute.PAGENAME); //
说明动作
sendBroadcast(intent);//
该函数用于发送广播
finish();
}
...
}

别人写的缺了个地方(unregisterReceiver)这个必须要加,不然会出一堆错,找了个最简单的方法。

=====================================================================
很多网友不知道,Android应用如何完全退出,此前Android123讲过了三种比较常见的方法,参考Android程序完全退出的三种方法一文,但是有的网友可能发现Android 2.2中即使使用了Google最新给出的Android 2.2新增APIkillBackgroundProcesses方法也无法实现。在J2SE中我们可能使用System.exit(0); 退出,那么我们提到的5种常规方法都无法完全退出怎么办呢?
今天Android开发网给出大家第六种非常规方法,制造异常退出。
1.
首先我们可以制造一个空指针的异常,比如TextView.setText方法中执行一个int型的内容,由于setText方法重载了R.string.xxx这样的资源int型内容,但是我们没有声明这个资源,仅仅把String写成了int的值,就会产生一个异常,这时系统Dalvik VM会直接关闭你的进程,这招十分有效,CWJ一般平时不公布给大家。
2.
但是有的网友说了,有Force Close的对话框怎么办,其实我们通过重写Android应用程序的Application基类自己实现Thread.UncaughtExceptionHandler接口的uncaughtException方法是可以避免出现FC窗口的,用户感觉直接退出了一样。如果你还有什么疑问可以来函至android123@163.com交流。

分享到:

· 上一篇:Ubuntu下用eclipse进行源码开发注意事项(未验证)

更多相关文章

  1. Android应用程序目录结构分析
  2. Android应用程序开发的五大概念
  3. Android关于线程更新UI的方法

随机推荐

  1. Android仿淘宝预订日历(18)
  2. android 定制PreferenceScreen
  3. Android ImageView实现类似Gif动图的效果
  4. 通过ddmlib杀死某个android进程的方法
  5. system.err android.os.NetworkOnmainThr
  6. Uri结构解析(Android)
  7. git android 源码 ssl错误, 重新设置即可
  8. Cocos2dx 横屏竖屏
  9. Android培训班(1)
  10. Android COLLATE LOCALIZED ASC