android之退出應用程序



轉http://blog.sina.com.cn/s/blog_5da93c8f0101772p.html解釋了退出方法的一些限制

    android退出應用程序會調用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),這只是針對第一個Activity(也就是入口的Activity)時生效。

如果有A,B,C三個Activity,而想在B 或C 中Activity 退出,調用上面的方法,往往會銷燬當前的Activity 返回上一個Activity。


當然也可以逐個返回上一個Activity,直到跳轉到入口的Activity,最後退出應用程序。但這樣比較麻煩,而且逐個返回的體驗並不友好。

     網上比較流行的方法是定義棧,寫一個ExitApplication 類,利用單例模式管理Activity,在每個在Activity 的onCreate()方法中調用          MyApplication .getInstance().addActivity(this)方法,在退出時調用MyApplication .getInstance().exitApp()方法,就可以完全退出應用程序了。


public class MyApplication extends Application {
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance;


/**
* 單例模式中獲取唯一的AppContext實例
*/
public static MyApplication getInstance() {
if (null == instance) {
instance = new MyApplication();
}
return instance;
}                                                                                                                                   // 添加Activity到容器中
public void addActivity(Activity activity) {
activityList.add(activity);
}




/**
* 遍歷所有Activity並finish
*/
public void exitApp() {
for (Activity activity : activityList) {
if (activity != null) {
activity.finish();
}
}
System.exit(0);
}                                                                                                                            }

在父類Activity中調用。addActivity.
public abstract class BaseActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\
		MyApplication.getInstance().addActivity(this);
	}
}

在退出時調用exitApp方法。


1.killbackgroundprocesses-no-working

//經測試此方法不可行,經測試只關閉了當前Activity,先前打開未關閉的Activity不關閉。

轉自http://stackoverflow.com/questions/19604097/killbackgroundprocesses-no-working

private void killApp(String packageName) {
    ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(ACTIVITY_SERVICE);
    Log.d(TAG, "Trying to kill app " + packageName);
    am.killBackgroundProcesses(packageName);
}

/Android will not kill the app or process when it is displaying on screen i.e active view. so switch to home screen and then kill the app or process you want/

//經測試以下方法存在問題,退出後,再次進入界面,進入的首界面是先前沒有關閉的Activity.

public void KillApplication(String KillPackage)
{
    ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);    

    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    this.startActivity(startMain);



    am.killBackgroundProcesses(KillPackage);
    Toast.makeText(getBaseContext(),"Process Killed : " + KillPackage  ,Toast.LENGTH_LONG).show();       
}

2.註冊發送關閉命令的廣播

public abstract class EnterActivity extends BaseActivity {  
...  
    // 寫一個廣播的內部類,當收到動作時,結束activity  
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            close();  
            unregisterReceiver(this); // 這句話必須要寫要不會報錯,雖然能關閉,不過會報一堆錯  
        }  
    };  
  
    @Override  
    public void onResume() {  
        super.onResume();  
  
        // 在當前的activity中註冊廣播  
        IntentFilter filter = new IntentFilter();  
        filter.addAction(Attribute.PAGENAME);  
        registerReceiver(this.broadcastReceiver, filter); // 註冊  
    }  
  
    /** 
     * 關閉 
     */  
    public void close() {  
        Intent intent = new Intent();  
        intent.setAction(Attribute.PAGENAME); // 說明動作  
        sendBroadcast(intent);// 該函數用於發送廣播  
        finish();  
    }  
...  
}  

3.根據Activity的聲明週期

  我們知道Android的窗口類提供了歷史棧,我們可以通過stack的原理來巧妙的實現,這裏我們在A窗口打開B窗口時在Intent中直接加入標誌Intent.FLAG_ACTIVITY_CLEAR_TOP,這樣開啓B時將會清除該進程空間的所有Activity。


  在A窗口中使用下面的代碼調用B窗口
  Intent intent = new Intent();
  intent.setClass(A.this, B.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG設置
  startActivity(intent);
  接下來在B窗口中需要退出時直接使用finish方法即可全部退出。

        //未測試不知是否通用



4.此方法同1,我自己未測試過。

轉自http://zengyan2012.iteye.com/blog/1125429

http://www.eoeandroid.com/thread-52223-1-3.html


     由於android 是 基於liux 操作系統的, 所以 一般情況下 我們 使用 
     android.os.Process.killProcess(android.os.Process.myPid()); 這個方法就可以殺掉進程,
    不過當 activity 多的時候,而且當我們忘記finish 其中的某幾個,
或者說,你對 AndroidMainfest.xml 中的 每個 Activity 中 android:launchMode , android:alwaysRetainTaskState 這些都不是很清楚時,就會出現 應用的 關閉不完全,

    主要原因是由於 殘留的 Activity 本身是一個進程,所以系統又把這個Activity提到了最前面,就會使我們的程序沒有完全關閉, 

        那麼 再 1.5---2.1  用了一個 方法,都可以成功的解決這個問題,那就是
             final ActivityManager am = (ActivityManager) ACTIVITY
                                .getSystemService(Context.ACTIVITY_SERVICE);
                am.restartPackage(ACTIVITY.getPackageName());
       但是到了 2.2 的時候, 這個方法,就不奏效了, 那麼我想請問 各位同仁們,有沒有 什麼通用的辦法呢~~~~  

           這個問題,網上的童鞋,也是有非常多做法,android123 也給我們提供了,非常多的解決辦法, 但是小弟不才,他們提供的方法,有些時候,不管用,所以很費腦~~~~
          現在我將我 這個方法 分享給大家, 這個方法在 1.5--2.3 的機器上都測試過,是可以完全殺死進程的

       該方法需要兩個必要條件
      條件一:  一個自己管理Activity 的列表, 網上很多用 ArryList 來存儲acitivity
      條件二: 需要一段,重新開啓堆棧,跳轉到 Home界面,並且 用liux的殺掉進程的方法

      代碼如下
       protected void quit()
      {
             int size = activityManager.activityStackCount();
            for(int i =size-1 ; i > 0 ;i--)
              {
                Activity activity =  activityManager.allTaskActivity().get(i);
                 activityManager.popActivity(activity);
              }
              activityManager = null;
             getActivity().finish();

            //單獨使用以下方法存在問題,退出後,再次進入界面,進入的首界面是先前沒有關閉的Activity.
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
           android.os.Process.killProcess(android.os.Process.myPid());

  
     }


5.其他解決方案的文章

http://blog.csdn.net/caiwenfeng_for_23/article/details/12710617


發佈了83 篇原創文章 · 獲贊 17 · 訪問量 103萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章