在Android中,即使我们退出了所有的Activity。但是其应用程序并不能结束,系统还有继续保持其一段时间。
然而我们可以在
根Acitivity的onDestroy()
方法中,做一些操作来让该应用程序彻底退出,即进程结束。
我现在测试并有效的方法有
System.exit(0)
和
android.os.Process.killProcess(android.os.Process.myPid())
这两种方法。网上有人反应这两种方法无效,我想他们可能是没在
根Acitivity
的onDestroy()
使用他们。
上面这两种方法在非根Activity中使用时,的确无效
。
不过理论上来说
根Acitivity
的onDestroy()
被调用的话,该进程一般也就结束了。
如果你还不知道什么样的
Acitivity
称之为为
根Acitivity
的话,请参阅《
Activity和Task的基本模型
》和《
Task和Activity相关的一些属性
》
示例程序1:
protected void
super.onDestroy();
System.exit(0);
//或android.os.Process.killProcess(android.os.Process.myPid());
Log.d(tag,"onDestroy");
}
示例程序2(自己的Application中)
private
final
static
HandlerThread
business0HandlerThread
=
new
HandlerThread
(
"Business0Handler"
);
private
static
Handler
business0Handler
;
public
static
Handler
getBusiness0Handler
()
{
if
(
business0Handler
==
null
)
{
synchronized
(
business0HandlerThread
){
if
(
business0Handler
==
null
)
{
business0HandlerThread
.
start
();
business0Handler
=
new
Handler
(
business0HandlerThread
.
getLooper
());
}
}
}
return
business0Handler
;
}
/*
* 在这里判断是否还有工作在进行
*/
public
boolean
isAnyWorkGoing
()
{
return
false
;
}
ActivityManager
am
;
public
boolean
shouldKill
()
{
if
(
isAnyWorkGoing
())
{
return
true
;
}
else
{
if
(
am
==
null
)
{
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
am
=
(
ActivityManager
)
getSystemService
(
Context
.
ACTIVITY_SERVICE
);
if
(
am
!=
null
)
break
;
try
{
Thread
.
sleep
(
50
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
List
<
RunningTaskInfo
>
runningTasks
=
am
.
getRunningTasks
(
100
);
for
(
RunningTaskInfo
task
:
runningTasks
)
{
ComponentName
baseActivity
=
task
.
baseActivity
;
if
(
baseActivity
!=
null
&&
task
.
baseActivity
.
getClassName
().
startsWith
(
"cn.edu.edut.robin"
))
{
if
(
task
.
numRunning
>
0
)
{
Log
.
d
(
TAG
,
task
.
baseActivity
.
getClassName
()
+
task
.
numRunning
);
flgKillLoop
=
false
;
return
true
;
}
}
}
}
return
false
;
}
boolean
flgKillLoop
=
false
;
public
void
signKill
()
{
flgKillLoop
=
true
;
getBusiness0Handler
().
post
(
killRunable
);
}
Runnable
killRunable
=
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
shouldKill
())
{
android
.
os
.
Process
.
killProcess
(
android
.
os
.
Process
.
myPid
());
}
else
if
(
flgKillLoop
)
{
getBusiness0Handler
().
postDelayed
(
killRunable
,
60
*
1000
);
}
}
};