当前位置: 代码迷 >> 综合 >> Android应用程序的完全退出
  详细解决方案

Android应用程序的完全退出

热度:8   发布时间:2024-01-19 19:45:11.0

 在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 onDestroy() {
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 );
}
}
};

  相关解决方案