博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 退出整个应用程序解决方案
阅读量:5871 次
发布时间:2019-06-19

本文共 2910 字,大约阅读时间需要 9 分钟。

1、通过广播

相信有过项目经验的同学都遇到过这样的问题,就是设计“退出”功能时可能会遇到有些界面不能关闭的问题。当然如果你的项目所有的界面都在打开另一个界面时被关闭就不存在这个问题了,但大多数情况下这样是很不合理的,因为每次要查看这个界面都需要重新加载数据。尤其对于需要走网络的数据显示,这不仅效率低而且成本高。

网上大概有以下几种方法解决这个问题:

(1)     System.exit(0);(2)     Process.killProcess(Process.myPid());(3)     ActivityManager activityManager = (ActivityManager) this                  .getSystemService(Context.ACTIVITY_SERVICE);activityManager.restartPackage("packagename");

但这些貌似不是万能的,有的说在2.2版本后就失效了,那我们怎么办呢?在起初的一个项目里我用了一个比较笨的方法,我用一个类来专门管理所有的Activity。这个类里有一个List,每打开一个Activity我就把这个Activity放到这个List中,当退出时再将List中所有的Activity一个一个的关闭。

在后来的项目中发现了一个更好地方法,就是通过广播来完成退出功能,具体实现过程是这样的:在每个Activity创建时(onCreate时)给Activity注册一个广播接收器,当退出时发送该广播即可。大概的代码如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       IntentFilter filter = new IntentFilter();       filter.addAction("finish");       registerReceiver(mFinishReceiver, filter);       ……}private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {           if("finish".equals(intent.getAction())) {              Log.e("#########", "I am " + getLocalClassName()                     + ",now finishing myself...");              finish();       }    }};

相信聪明的大家会把上面的代码写在一个基类里面,因为如果你的项目中Activity很多的话,写起来很麻烦,而且也不符合代码规范。

 

 

在退出时执行以下代码即可关闭所有界面完全退出程序:

getApplicationContext().sendBroadcast(new Intent("finish"));

转载:

2、使用退出类

public class CloseActivity{    private static LinkedList
acys = new LinkedList
(); public static Activity curActivity; public static void add(Activity acy) { acys.add(acy); } public static void remove(Activity acy) { acys.remove(acy); } public static void close() { Activity acy; while (acys.size() != 0) { acy = acys.poll(); if (!acy.isFinishing()) { acy.finish(); } }// android.os.Process.killProcess(android.os.Process.myPid()); }}

3、

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。 在D中使用下面的代码: Intent intent = new Intent(); intent.setClass(D.this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置 startActivity(intent); finish();关掉自己 在A中加入代码: Override

protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub

super.onNewIntent(intent);

//退出

        if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {

               finish();

        }

}

A的Manifest.xml配置成android:launchMode="singleTop"

原理总结: 一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode="singleTop" 不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A finish()掉。 栈中A,B,C,D全部被清理。所以整个程序退出了。

转载于:https://www.cnblogs.com/bill-joy/archive/2012/10/17/2727263.html

你可能感兴趣的文章
将android中如何调整Toast位置?
查看>>
ASP.NET Web API 开篇示例介绍
查看>>
类的方法和继承
查看>>
一直接受键盘字符 接收小写字符出输出大写 接受大写输出小写 数字不输出
查看>>
关于TP中的M()方法与D()方法
查看>>
Andrid Floating Action Button
查看>>
java内存管理(适合初学者)
查看>>
小蚂蚁学习PHP性能优化(2)--PHP语言级性能优化
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
PHP中的__clone()
查看>>
防御暴力破解SSH攻击
查看>>
虚拟机Centos7连接Internet
查看>>
学习Linux第一天
查看>>
.Net 高效开发之不可错过的实用工具
查看>>
sencha touch 彩色图标按钮(button+ico)
查看>>
Java设计模式--策略模式
查看>>
android通过ContentProvider 取得电话本的数据
查看>>
百度地图根据经纬度获取地址
查看>>