安全退出已调用多个Activity的Application

通常关闭一个activity,直接调用finish()方法就行,但是如何安全退出已经调用了多个activity的应用程序呢?

有这么几种方法:

1.记录打开的activity

2.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

3.递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭


今天我们来主要了解一下第一种方式。那怎样来记录打开的activity呢?

创建一个类MyApplication继承Application,里面创建一个BaseActivity的集合,并提供对该集合的添加 删除 清空的三个方法。

public class MyApplication extends Application {

    //用于存放activity的集合
    List<BaseActivity> activityList = new ArrayList<>();

    //提供一个添加activity的方法
    public void addActivity(BaseActivity activity) {
        if (!activityList.contains(activity)) {
            activityList.add(activity);
        }
    }

    //提供一个移除activity的方法
    public void removeActivity(BaseActivity activity) {
        if (activityList.contains(activity)) {
            activityList.remove(activity);
        }
    }

    //提供一个清空集合的方法
    public void clearAllActivity() {
        for (int i = 0; i < activityList.size(); i++) {
            BaseActivity activity = activityList.get(i);
            activity.finish();
        }
        activityList.clear();
    }
}


BaseActivity是Activity的基类,里面写的是所有activity共性的方法和成员变量。

在oncreate()中获取到MyApplication的对象,并调用addActivity()方法

在onDestroy()中移除activity,调用removeActivity()方法

public class BaseActivity extends Activity {
    public MyApplication mApplication;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApplication = (MyApplication) getApplication();
        mApplication.addActivity(this);//一旦创建一个activity就加入到activityList集合当中。
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mApplication.removeActivity(this);//移除activity
    }
}

为了用户体验,有的时候用户只是不小心点到了返回键,但是并不想退出应用程序,我们应该给用户“再点击一次返回键就退出应用程序”的友好提示。

我们可以在主页面这样写:

public class MainActivity extends BaseActivity {

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

    }

    private long mStartTime;    //定义一个成员变量,默认初始时间为0

    @Override
    public void onBackPressed() {
        //当点击的时候计算2次点击的时间差,如果在2秒之内点击2次,就退出
        long currentTimeMillis = System.currentTimeMillis();
        if ((currentTimeMillis - mStartTime) < 2000) {
            finish();
        } else {
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            mStartTime = System.currentTimeMillis();    //记录点击后的时间
        }
    }
}


提供一个小demo:http://download.csdn.net/detail/zsr0526/9770994







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值