使Activity只存在一個例項(解決微信登入 原有登入介面無法關閉)

weixin_33832340發表於2018-02-11

前言

最近專案整合微信登入中遇到一個問題:微信登入成功後,退出應用時,原有的普通登入頁面還存在。

第一反應就是在跳轉的時候怎麼將其finish(),後來結合實際情況,好像並不方便。
於是想到:在跳轉後續頁面的時候,從LoginActivity中轉一下,然後到達指定頁面,這樣就可以將LoginActivity關閉。
於是面臨一個新問題,如何讓LoginActivity只建立一次,於是我們想到了launchMode。

  • 這裡我們使用singleInstance,在AndroidManifest.xml檔案中配置:
<activity
    android:name=".LoginActivity"
    android:launchMode="singleInstance" >
</activity>
  • 我們還需要在LoginActivity重寫onNewIntent(Intent intent)方法:
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // 跳轉首頁或者其他操作
    ...
}

至於我們為什麼不使用singleTask,因為在建立WXEntryActivity時建立了新的任務棧。singleTask在新的任務棧需要建立新的LoginActivity例項;而使用singleInstance,無論位於哪個Task中,系統都會把該LoginActivity所在的Task轉到前臺並顯示LoginActivity。

Android四種啟動模式

  • standard:每次呼叫startActivity()啟動時都會建立一個新的Activity放在棧頂(預設模式)
  • singleTop:啟動Activity時,指定Activity不在棧頂就建立,如在棧頂,則不再建立
    注:不會出現兩個相同的Activity相鄰
  • singleTask:如果啟動的Activity不存在就建立Activity,如果存在直接跳轉到指定的Activity所在位置
    注:在其上面的Activity會被移出棧,也就是一個棧中不能有重複的Activity
  • singleInstance:如果啟動的Activity不存在就建立一個Activity同時建立一個棧,如果存在就將指定的Activity存在的棧移動到棧頂
    注:表示這個Activity只能存在於一個獨立的任務棧中,同應用的其它Activity與其無關

相關文章