1. 程式人生 > >銷燬全部的Activity,退出當前應用

銷燬全部的Activity,退出當前應用

我用的是廣播方式,缺點是退出的是全部的activity,不能銷燬指定的activity(但是好像用的不多)。此外,我在A介面設定了啟動模式為singleTask,當有人登陸賬號時就會從你設定的賬號異常登陸的操作介面A 跳到 登陸頁面。

裡邊第三種的方法我試了總是崩潰,不知道為什麼。

Android:銷燬所有的Activity退出應用程式幾種方式

 

author:DRC工作室 

我們都知道,Activity是存放在棧中。在預設的情況下(standard)Activity在棧中是以先進後出、後進先出的方式進行存放。最開始出現的Activity會存在棧底,最新啟動的Activity總是會存在棧頂。當我們開啟的Activity越來越多,當前想在某個介面退出當前應用程式的時候,或者雙擊返回鍵退出當前應用程式。這個時候只能一個一個的把當前所有啟動的Activity銷燬,直到清空棧中的所有Activity,應用程式才能退出。下面給大家介紹四種常用的退出應用程式的方法,希望能夠更好的幫助大家開發!

 

銷燬所有Activity,退出應用程式常見的方式有下面四種:

 

 

  (1) System.exit(0) 使用系統的方法,強制退出

 

  (2) 丟擲異常,強制退出

 

  (3) 使用Application退出

 

  (4) 使用廣播退出

 

第一種方式 System.exit(0):表示的是終止程式,終止當前正在執行的 Java 虛擬機器,在java中我們也使用這種方式來關閉整個應用,在前期很多開發人員都是使用這種方式,我自己在開發專案過程中也用過這種方式來退出,但是有時候會在部分機型中,當退出應用後彈出應用程式崩潰的對話方塊,有時退出後還會再次啟動,少部分的使用者體驗不太好。但現在也依舊還會有少部分的開發人員會使用這種方式,因為使用方式很簡單,只需要在需要退出的地方加上這句程式碼就行。

 

第二種方式 丟擲異常,強制退出 :這種方式現在基本上已經看不到了,使用者體驗比第一種方式更差,就是讓丟擲異常、是系統崩潰、從而達到退出應用的效果。

 

<接下來我們主要講解後面兩種,這兩種在開發過程中經常使用>

第三種方式 使用Application退出 :目前比較常用方法之一,我們都知道application是Android的系統元件,當應用程式啟動時,會自動幫我們建立一個Application,而且一個應用程式只能存在一個Application,它的生命週期也是最長的,如果需要使用自己建立的Application時,這個時候我們只需要在Androidmanifest.xml中的<Application> 標籤中新增name屬性:把建立的Application完整的包名+類名放進了就行了。

那麼我們如何使用Application來退出當前的應用程式呢?

 

我們來看下我寫的一個使用Application來退出應用程式的Demo:

 

<建立一個繼承Application的類>

public class myApplication extends Application {
private List<Activity> oList;//用於存放所有啟動的Activity的集合

public void onCreate() {
super.onCreate();
oList = new ArrayList<Activity>();
}

/**
* 新增Activity
*/
public void addActivity_(Activity activity) {
// 判斷當前集合中不存在該Activity
if (!oList.contains(activity)) {
oList.add(activity);//把當前Activity新增到集合中
}
}

/**
* 銷燬單個Activity
*/
public void removeActivity_(Activity activity) {

//判斷當前集合中存在該Activity
if (oList.contains(activity)) {
    oList.remove(activity);//從集合中移除
    activity.finish();//銷燬當前Activity
}
}

/**
* 銷燬所有的Activity
*/
public void removeALLActivity_() {

     //通過迴圈,把集合中的所有Activity銷燬
for (Activity activity : oList) {
     activity.finish();
}
}
}

 

<建立BaseActivity 繼承 Activity> 用於管理所有的Activity,所有的Activity都繼承這個類

public class BaseActivity extends Activity {
private myApplication application;
private BaseActivity oContext;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (application == null) {
    // 得到Application物件
    application = (myApplication) getApplication();
}
oContext = this;// 把當前的上下文物件賦值給BaseActivity
addActivity();// 呼叫新增方法
}

// 新增Activity方法
public void addActivity() {
application.addActivity_(oContext);// 呼叫myApplication的新增Activity方法
}
//銷燬當個Activity方法
public void removeActivity() {
application.removeActivity_(oContext);// 呼叫myApplication的銷燬單個Activity方法
}
//銷燬所有Activity方法
public void removeALLActivity() {
application.removeALLActivity_();// 呼叫myApplication的銷燬所有Activity方法
}

/* 把Toast定義成一個方法  可以重複使用,使用時只需要傳入需要提示的內容即可*/
public void show_Toast(String text) {
Toast.makeText(oContext, text, Toast.LENGTH_SHORT).show();
}
}

 

<MainActivity 繼承 BaseActivity 主介面---雙擊返回鍵,退出當前應用程式> 

 

public class MainActivity extends BaseActivity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

        //繫結按鈕
public void button(View v) {

  startActivity(new Intent(MainActivity.this, oneActivity.class));//跳轉到oneActivity
}
//重寫onKeyDown方法
public boolean onKeyDown(int keyCode, KeyEvent event) {

    //判斷當點選的是返回鍵
    if (keyCode == event.KEYCODE_BACK) {
exit();//退出方法
    }
    return true;
}

private long time = 0;

//退出方法
private void exit() {
//如果在兩秒大於2秒
if (System.currentTimeMillis() - time > 2000) {
//獲得當前的時間
time = System.currentTimeMillis();
showToast("再點選一次退出應用程式");
} else {
//點選在兩秒以內
removeALLActivity();//執行移除所以Activity方法
}
}  

}

 

 

<oneActivity 繼承 BaseActivity> 

 

public class oneActivity extends BaseActivity {


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.onelayout);
}
// 繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, MainActivity.class);//跳轉到主介面
startActivity(intent);
}
}

< androidmanifest.xml 清單檔案>

<application
        android:name="com.jxsw.chong.application_closeactivity.myApplication" //註冊myapplication
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.jxsw.chong.application_closeactivity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.jxsw.chong.application_closeactivity.BaseActivity" />
        <activity android:name="com.jxsw.chong.application_closeactivity.oneActivity" />

</application>

    我們讓每個Activity都繼承於我們自己定義的BaseActivity,每次新開啟個Activity,就會在BaseActivity的oncreate()方法中就會執行addActivity()方法,方法裡面執行的是myApplication類中新增Activity的方法,把當前的Activity放進集合中,當連續點選兩次back返回鍵,執行銷燬所有Activity的方法。從而達到完全退出應用程式的效果。

ps:一定不要忘記在androidmanifest.xml中註冊myApplication

<-----以上程式碼都可以直接複製貼上可用   

 

 

第四種方式 使用廣播退出 :使用廣播來實現退出應用程式,其實實現的思路相對於第三種更簡單,我們編寫一個BaseActivity,讓其他的Activity都繼承於它,當我需要退出時,我們就銷燬BaseActivity,那麼其他繼承與它的Activity都會銷燬。

我們來看下我寫的一個使用廣播來退出應用程式的Demo:

 

<BaseActivity>

public class BaseActivity extends Activity {
private MyBaseActiviy_Broad oBaseActiviy_Broad;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   //動態註冊廣播
    oBaseActiviy_Broad = new MyBaseActiviy_Broad();
    IntentFilter intentFilter = new IntentFilter("drc.xxx.yyy.baseActivity");
    registerReceiver(oBaseActiviy_Broad, intentFilter);
}
//在銷燬的方法裡面登出廣播
protected void onDestroy() {
   super.onDestroy();
   unregisterReceiver(oBaseActiviy_Broad);//登出廣播
}
//定義一個廣播
public class MyBaseActiviy_Broad extends BroadcastReceiver {

public void onReceive(Context arg0, Intent intent) {
//接收發送過來的廣播內容
int closeAll = intent.getIntExtra("closeAll", 0);
if (closeAll == 1) {
finish();//銷燬BaseActivity
}
}

}
/**
* 顯示Toast資訊
*/
public void showToast(String text) {
    Toast.makeText(this, text, 2000).show();
}
}

<MainActivity>

public class MainActivity extends BaseActivity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, oneActivity.class);
startActivity(intent);
}
//重寫onkeydown方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
//點選的為返回鍵
if (keyCode == event.KEYCODE_BACK) {
exit();// 退出方法
}
return true;
}


private long time = 0;

//退出方法
private void exit() {
if (System.currentTimeMillis() - time > 2000) {
time = System.currentTimeMillis();
showToast("再點選一次退出應用程式");
} else {
Intent intent = new Intent("drc.xxx.yyy.baseActivity");
intent.putExtra("closeAll", 1);
sendBroadcast(intent);//傳送廣播
}
}

}

<oneActivity>

public class oneActivity extends BaseActivity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.onelayout);
}

// 繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, MainActivity.class);//跳轉到MainActivity
startActivity(intent);
}
}

 

 

 

看到的另一篇博文,還沒試過,方法2應該和上邊的3一樣

 

殺死全部的Activity,退出當前程式

首先說明finish()殺死的只是當前的Activity,並不是全部的Activity

 

方法一:Dalvik VM的本地方法

 1、android.os.Process.killProcess(android.os.Process.myPid())       獲取PID,目前獲取自己的也只有該API,否則從/proc中自己的列舉其他程序吧,不過要說明的是,結束其他程序不一定有許可權,不然就亂套了。
 2、System.exit(0)       常規java、c#的標準退出法,返回值為0代表正常退出

方法二:

(1)建立一個ActivityCollector.java,此類用作收集和銷燬activity的公共類

複製程式碼

public class ActivityCollector {

    public static List<Activity> activities = new ArrayList<Activity>();

    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

複製程式碼

 

(2).建立一個BaseActivity.java基類,專案中的所有activity都繼承此類,呼叫上面類的方法就可以。

複製程式碼

public class BaseActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        ActivityCollector.addActivity(this);  
    }  
  
    @Override  
    protected void onDestroy() {  
        // TODO Auto-generated method stub  
        super.onDestroy();  
        ActivityCollector.removeActivity(this);  
    }

複製程式碼

 

(3)讓A, B, C這三個activity分別去繼承BaseActivity.java

(4)只需要呼叫ActivityCollector.java中的finishAll()方法,就可以結束全部Activity了。

方法三、根據Activity的宣告週期

Android的視窗類提供了歷史棧,我們可以通過stack的原理來巧妙的實現

這裡我們在A視窗開啟B視窗時在Intent中直接加入標誌Intent.FLAG_ACTIVITY_CLEAR_TOP

這樣開啟B時將會清除該程序空間的所有Activity。

    //在A視窗中使用下面的程式碼呼叫B視窗
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, otherActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG設定
    startActivity(intent);
    //在B視窗中呼叫finish()就全部結束掉了