以前只是简单的了解一下Android的四种启动模式,而且有三个都在说onNewIntent这个函数,那么这个函数干什么的,到底怎么用呢?
今天在公司需要做一个登出和直接跳过登录界面来来直接关闭程序。由于在程序的登录选择界面和主界面我的启动模式是singleTask的,所以要想直接关闭程序退出整个应用的根本退不了,相信大家看了http://blog.csdn.net/yanglei0917/article/details/52461382,四种启动模式的文章后会发现singTask会把目标activity复用直接放到栈顶,所以我的整个程序就是用大家最常用的在application中添加集合清除所有activity和system.exit(0),这两种方法都没办法实现,所以这时候想到了onNewIntent这个函数。
我的设想多activity中退出整个程序,例如按打开先后顺序从A->B(B在栈顶),这时我需要从B直接退出程序,并且AB的启动面模式都是singleTask的。
我的想法就是如何让B打开A,然后让A在关闭finish掉就可以直接退出当前的应用了。而正好我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在B窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。
B中实现的代码为:
Intent intent = new Intent();
intent.setClass(B.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent); //注意,startActivity是异步执行,换句话说,startActivity是立即返回的,是不会阻塞的,因此下面的finish得意执行
finish();//关掉自己
然后在A中使用onNewIntent,代码如下:
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
finish();
}
}
这样就轻松地完成了整个应用程序的退出。