Android中退出多個Activity的兩個經典方法


這里介紹兩種方法:一種把每個activity記住,然后逐一干掉;另一種思路是使用廣播。

方法一、用list保存activity實例,然后逐一干掉


上代碼:

import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;

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

private SysApplication() {
}

public synchronized static SysApplication getInstance() {
   if (null == instance) {
         instance = new SysApplication();
      }
         return instance;
      }

// add Activity
public void addActivity(Activity activity) {
      mList.add(activity);
}

    public void exit() {
        try {
           for (Activity activity : mList) {
              if (activity != null)
                 activity.finish();
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             } finally {
                System.exit(0);
             }
}

@Override
public void onLowMemory() {
    super.onLowMemory();
      System.gc();
}

}
在每個Activity的onCreate方法中添加類似代碼:

[java] public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
                SysApplication.getInstance().addActivity(this);
            }
       public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SysApplication.getInstance().addActivity(this);
        }

在需要退出程序的時候,調用:

SysApplication.getInstance().exit();
SysApplication.getInstance().exit();

簡而言之,通過單例模式把每個Activity 的引用添加到一個全局鏈表中,每次退出程序調用System.exit(0)時,先調用鏈表中Activity 的finish方法


附:此方法也可參考鏈接:http://maosidiaoxian.iteye.com/blog/1404725

 

方法二、使用廣播

//2.2退出整個應用難免讓人困擾,曾經一度的嘗試一下方式:
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
     manager.killBackgroundProcesses(package);
//不行

android.os.Process.killProcess(android.os.Process.myPid());
  // 也不行

manager.restartPackage(package);
 // 還是不行

Intent MyIntent = new Intent(Intent.ACTION_MAIN);
   MyIntent.addCategory(Intent.CATEGORY_HOME);
   startActivity(MyIntent);
   finish();
//這個只是退回到桌面,如果打開多個Activity關閉重新打開也會有問題,還是還是不行

//看到有人說廣播機制,發現是個好東東,能徹底解決這個問題,廢話不說看代碼:
public abstract class EnterActivity extends BaseActivity {
   ...
// 寫一個廣播的內部類,當收到動作時,結束activity
  private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
       public void onReceive(Context context, Intent intent) {
            unregisterReceiver(this); // 這句話必須要寫要不會報錯,不寫雖然能關閉,會報一堆錯
            ((Activity) context).finish();
          }
       };

   @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();
       }
      ...
 }

別人寫的缺了個地方(unregisterReceiver)這個必須要加,不然會出一堆錯,找了個最簡單的方法。

本文學習時候收集於網絡,只是不知道了源地址,感謝作者提供,還往作者見諒,大家一起學習!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM