如何退出整個Android應(yīng)用-創(chuàng)新互聯(lián)

通過System.exit(0)、finish()以及返回鍵,只能結(jié)束當(dāng)前的Activity,當(dāng)我們打開多個Activity并需要直接退出整個Android應(yīng)用時,需要多次單擊back返回鍵,方能退出。給用戶體驗不是很好。下面我們來介紹幾種直接退出整個Android應(yīng)用的方法。

創(chuàng)新互聯(lián)公司長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為黑龍江企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè),黑龍江網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

解決方案一:

創(chuàng)建一個輔助類,用于保存所有的已打開的Activity,當(dāng)打開一個Activity時,就將其添加到已打開的Activity集合中(通常是onCreate()方法中調(diào)用add方法),當(dāng)關(guān)閉一個Activity時,需要在集合中刪除該Activity(通常是onDestroy()方法中調(diào)用delete方法)。關(guān)鍵代碼如下:

public class ActivityMgr extends Application {

private static ActivityMgr activityMgr = null;

public List<Activity> activities = new LinkedList<Activity>();

public synchronized static ActivityMgr getInstance() {

if (null == activityMgr) {

activityMgr = new ActivityMgr();

}

return activityMgr;

}

public void addActivity(Activity activity) {

if (activity != null) {

activities.add(activity);

}

}

public void exit() {

for (Activity activity : activities) {

System.out.println("Activity="+activity);

if (activity != null) {

activity.finish();

}

}

System.exit(0);

}

public void delete(Activity activity){

if(activities.contains(activity)){

activities.remove(activity);

System.out.println("Delete!");

}

}

public void onLowMemory() {

super.onLowMemory();

System.gc();

}

}

在Activity的onCreate()方法中將Activity本身添加到集合中的語句如下:

ActivityMgr.getInstance().addActivity(this);

在Activity的onDestroy()方法中,將Activity從集合中刪除的語句如下:

protected void onDestroy() {

ActivityMgr.getInstance().delete(this);

super.onDestroy();

}

解決方案二:

通過發(fā)送廣播的方式,通知所有的Activity進(jìn)行關(guān)閉,具體做法創(chuàng)建一個自定義的MyActivity讓其繼承于Activity,在該Activity中定義一個內(nèi)部廣播接收器類,然后在onResume()方法中進(jìn)行動態(tài)注冊廣播接收器。最后讓其他的Activity繼承于MyActivity而不是系統(tǒng)的Activity,這樣所有的Activity類都繼承了MyActivity中的onResume()方法,也就注冊了廣播接收器,當(dāng)需要退出應(yīng)用程序時,只需要發(fā)送一個廣播即可,這時所有的Activity的內(nèi)部廣播接收器都可以接收到該廣播,然后執(zhí)行finish()方法,結(jié)束Activity本身。

public class MyActivity extends Activity {

ExitBroadcastReceiver exitReceiver;

private class ExitBroadcastReceiver extends BroadcastReceiver{

public void onReceive(Context context, Intent intent) {

finish();//結(jié)束當(dāng)前的Activity

unregisterReceiver(exitReceiver);//取消注冊

}

}

protected void onResume() {

exitReceiver=new ExitBroadcastReceiver();//創(chuàng)建廣播接收器

IntentFilter filter=new IntentFilter("iet.jxufe.cn.android.exit");//過濾條件

registerReceiver(exitReceiver, filter);//注冊廣播接收器

super.onResume();

}

}

需要退出時,只需要發(fā)送廣播即可。代碼如下:

Intent intent=new Intent();

intent.setAction("iet.jxufe.cn.android.exit");//設(shè)置接收廣播的條件

sendBroadcast(intent);//發(fā)送廣播

解決方案三:

通過Activity的啟動模式來實現(xiàn)該功能,Activity的啟動模式主要有以下幾種:

1、standard模式;也就是默認(rèn)模式,每次激活A(yù)ctivity時都會創(chuàng)建一個新的Activity實例,并放入任務(wù)棧中。

2、singleTop模式;如果在任務(wù)棧中的棧頂存在該Activity實例,下次激活該Activity實例時就不會創(chuàng)建新的 Activity的實例,直接重用它(在重用的這個過程中會調(diào)用實例的OnNewIntent()這個方法),否則就創(chuàng)建新的Activity實例。

3、singleTask模式;如果在棧中已經(jīng)有該Activity的實例,以后就不會創(chuàng)建新的實例了,而會重用該實例(在重用的這個過程中會調(diào)用實例的OnNewIntent()這個方法)。重用時,如果該Activity實例不是在棧頂,它會讓該實例回到棧頂,而它上面的實例將會被移出棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中。

4、singleInstance模式;在一個新棧中創(chuàng)建該Activity的實例,并讓多個應(yīng)用共享該棧中的該Activity實例。一旦該模式的Activity實例已經(jīng)存在于某個棧中,任何應(yīng)用再激活該Activity時都會重用該棧中的實例( 會調(diào)用實例的 onNewIntent() )。其效果相當(dāng)于多個應(yīng)用共享一個應(yīng)用,不管誰激活該 Activity 都會進(jìn)入同一個應(yīng)用中。

在這里我們可以把主activity設(shè)置為singleTask模式,當(dāng)我們想退出整個應(yīng)用時,就可以通過intent打開該activity,然后系統(tǒng)會把它之上的activity移出activity棧,然后我們再在該activity的onNewIntent方法進(jìn)行finish,就可以達(dá)到退出該應(yīng)用程序的目的。

該方案有一定的局限性,僅適應(yīng)于有一個固定的Activity作為棧底的情況,如果棧底元素不是固定的,則有可能達(dá)不到該效果。例如若此時棧中并不存在該實例對象,則會創(chuàng)建一個新的對象,也就達(dá)不到關(guān)閉其他Activity的目的。

Activity的啟動模式可以在清單文件中進(jìn)行配置,例如:

<activity

  android:name="MainActivity"

  android:label="@string/title_activity_main"

  android:launchMode="singleTask" >

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

</activity>

在MainActivity中重寫onNewIntent()方法,執(zhí)行finish()方法,代碼如下:

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

this.finish();

}

在需要退出整個應(yīng)用時,創(chuàng)建一個Intent,跳轉(zhuǎn)到MainActivity即可,此時由于MainActivity處于棧底,它上面的所有的Activity都會銷毀,并會調(diào)用MainActivity的onNewIntent()方法。

最后介紹一種,Android徹底關(guān)閉當(dāng)前應(yīng)用(2.2版本不再有效)

以下方法用于關(guān)閉當(dāng)前應(yīng)用(此方法一般不建議使用,因為采用殺死進(jìn)程的方法會導(dǎo)致activity所在進(jìn)程被殺死,使得activity處于界面可見,但是無法響應(yīng)事件,不可操作狀態(tài),也無法將activity正常結(jié)束的情況)

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());

需要權(quán)限:
"android.permission.RESTART_PACKAGES"

函數(shù)說明:
void android.app.ActivityManager.restartPackage(String packageName)

public void restartPackage (String packageName)
Since: API Level 3

Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.

You must hold the permission RESTART_PACKAGES to be able to call this method.
Parameters
packageName   The name of the package to be stopped.

與當(dāng)前應(yīng)用相關(guān)的應(yīng)用、進(jìn)程、服務(wù)等也會被關(guān)閉。
會發(fā)送 ACTION_PACKAGE_RESTARTED廣播。
不要被函數(shù)名誤導(dǎo)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前題目:如何退出整個Android應(yīng)用-創(chuàng)新互聯(lián)
瀏覽地址:http://muchs.cn/article22/cesocc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、面包屑導(dǎo)航、網(wǎng)站維護(hù)、外貿(mào)建站、移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管