日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Android如何安全退出多個(gè)Activity

在做Android App的時(shí)候,幾乎每個(gè)App都有一個(gè)“退出應(yīng)用”的功能,如何做到完全退出一個(gè)App呢?Google了一些文章,都是都是通過(guò)List緩存Activity,在需要退出app的時(shí)候,迭代activity列表并調(diào)用finish方法,這種方案可以達(dá)到完全退出App的功能,但是潛在的問(wèn)題很大,由于Activity被緩存導(dǎo)致不能被釋放,容易導(dǎo)致OOM,因此這種方式需要慎用。

為陵城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及陵城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、陵城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

下面介紹一種解決方案,利用Activity啟動(dòng)時(shí)的flag屬性來(lái)解決此問(wèn)題,其性能優(yōu)于通過(guò)緩存Activity來(lái)完全退出App的方案,只是這種解決方案需要滿足一些條件(見(jiàn)分析過(guò)程)。

實(shí)現(xiàn)步驟:

1:創(chuàng)建一個(gè)“空”的輔助Activity,在其onCreate方法中調(diào)用finish方法。如下:

 
 
  1. public class LastActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. finish();
  6. }
  7. }

2:點(diǎn)擊“退出App”的按鈕執(zhí)行以下方法:

 
 
  1. findViewById(R.id.quit).setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent(SecondActivity.this,LastActivity.class);
  5. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  6. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  7. SecondActivity.this.startActivity(intent);
  8. finish();
  9. }
  10. });

通過(guò)這兩個(gè)步驟可以實(shí)現(xiàn)退出整個(gè)應(yīng)用。下面做一個(gè)簡(jiǎn)單地分析:

測(cè)試中使用三個(gè)Activity,其執(zhí)行順序?yàn)镸ainActivity -> SecondActivity -> LastActivity,在SecondActivity中,我們期望點(diǎn)擊“退出app”按鈕來(lái)實(shí)現(xiàn)完全退出App的功能,此時(shí)我們將借助一個(gè)輔助Activity(LastActivity)。

首先在觸發(fā)點(diǎn)擊事件后,在onClick方法中執(zhí)行啟動(dòng)LastActivity操作。在執(zhí)行點(diǎn)擊事件前我們先查看任務(wù)棧中運(yùn)行著的Activity,可以通過(guò)如下的命令查看:

adb shell dumpsys activity

其結(jié)果如下:
此時(shí)我們可以知道MainActivity跟SecondActivity屬于同一個(gè)任務(wù)棧,且啟動(dòng)順序?yàn)镸ainActivity -> SecondActivity。在onClick方法中我們準(zhǔn)備啟動(dòng)LastActivity的時(shí)候,其Flag被設(shè)置為Intent.FLAG_ACTIVITY_CLEAR_TASK,該flag在android 文檔中的表述為“If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started.”,其表達(dá)的意思為在啟動(dòng)新的Activity的時(shí)候,將清理跟此Activity“相關(guān)”的任務(wù)棧,此時(shí)除了棧中本身的Activity(SecondActivity)都將被清理,然后再啟動(dòng)Activity(LastActivity)。下面來(lái)驗(yàn)證其是否正確,在LastActivity的onCreate調(diào)用finish前加上斷點(diǎn),然后點(diǎn)擊“退出App”按鈕,查看任務(wù)棧的信息如下:
此時(shí)我們可以看出,在LastActivity被啟動(dòng)后,MainActivity被清理了,此時(shí)任務(wù)棧中只剩下LastActivity跟SecondActivity。接著運(yùn)行LastActivity的finish方法,LastActivity退出,然后SecondActivty也退出,此時(shí)就退出App了。

上面的方式是所有的Activity都存在同一個(gè)任務(wù)棧中的情況,對(duì)于擁有不同任務(wù)棧的不同Activity是否也能真正意義上的完全退出App呢?下面我們將在AndroidManifest.xml文件中對(duì)SecondActivity跟LastActivity中做如下設(shè)置,使其位于不同的任務(wù)棧中:

 
 
  1. android:name=".SecondActivity"
  2. android:launchMode="singleTask"
  3. android:taskAffinity="com.umeng.social"
  4. />
  5. android:name=".LastActivity"
  6. android:launchMode="singleTask"
  7. android:taskAffinity="com.umeng.social.test"
  8. />

此時(shí)我們查看任務(wù)棧的情況,如下:
此時(shí)我們可以看見(jiàn)MainActivity跟SecondActivity在不同的任務(wù)棧中,此時(shí)點(diǎn)擊退出App按鈕后,其Activity棧的情況如下:
可以看到此時(shí)三個(gè)Activity都在不同的任務(wù)棧中。細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)問(wèn)題了,為什么LastActivity已經(jīng)啟動(dòng),而MainActivity還沒(méi)有被銷(xiāo)毀?是的,這里就是上面提到的'清理跟此Activity“相關(guān)”的任務(wù)棧'中“相關(guān)”兩字的特殊意義了,這說(shuō)明在清理Activity時(shí)是有條件的,其條件為“被clean的Activity必須跟需要啟動(dòng)的Activity在同一任務(wù)棧中”。由于現(xiàn)在MainActivity、SecondActivity、LastActivity在不同任務(wù)棧中,因此Activity不會(huì)被清理。執(zhí)行斷點(diǎn)后續(xù)代碼,此時(shí)Activity棧中依然存在MainActivity,導(dǎo)致整個(gè)App是不能完全退出的。

因此采用設(shè)置falg的方式完全退出App是有條件的,條件為:”整個(gè)App的Activity存在同一個(gè)任務(wù)棧中“或者任務(wù)棧模型滿足以下條件:
目前對(duì)于擁有多個(gè)任務(wù)棧的情況完全退出App的情況暫時(shí)沒(méi)有想到比較***的解決方案,如果有小伙伴知道,請(qǐng)記得留言,謝謝。


本文標(biāo)題:Android如何安全退出多個(gè)Activity
URL網(wǎng)址:http://www.5511xx.com/article/cdccjpo.html