Commit c852fc24 authored by Mygod's avatar Mygod

Use singleTask launchMode

parent edbe4704
/*******************************************************************************
* *
* Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package com.github.shadowsocks.utils
import androidx.activity.ComponentActivity
import androidx.annotation.MainThread
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
/**
* See also: https://stackoverflow.com/a/30821062/2245107
*/
object SingleInstanceActivity : DefaultLifecycleObserver {
private val active = mutableSetOf<Class<LifecycleOwner>>()
@MainThread
fun register(activity: ComponentActivity) = if (active.add(activity.javaClass)) apply {
activity.lifecycle.addObserver(this)
} else {
activity.finish()
null
}
override fun onDestroy(owner: LifecycleOwner) {
check(active.remove(owner.javaClass)) { "Double destroy?" }
}
}
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.Shadowsocks.Immersive.Navigation" android:theme="@style/Theme.Shadowsocks.Immersive.Navigation"
android:launchMode="singleTop"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
...@@ -37,19 +37,22 @@ ...@@ -37,19 +37,22 @@
android:name=".ProfileConfigActivity" android:name=".ProfileConfigActivity"
android:theme="@style/Theme.Shadowsocks.Immersive" android:theme="@style/Theme.Shadowsocks.Immersive"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:label="@string/profile_config"/> android:label="@string/profile_config"
android:launchMode="singleTask"/>
<activity <activity
android:name=".AppManager" android:name=".AppManager"
android:label="@string/proxied_apps" android:label="@string/proxied_apps"
android:parentActivityName=".ProfileConfigActivity" android:parentActivityName=".ProfileConfigActivity"
android:theme="@style/Theme.Shadowsocks.Immersive" android:theme="@style/Theme.Shadowsocks.Immersive"
android:launchMode="singleTask"
android:excludeFromRecents="true"/> android:excludeFromRecents="true"/>
<activity <activity
android:name=".UdpFallbackProfileActivity" android:name=".UdpFallbackProfileActivity"
android:label="@string/udp_fallback" android:label="@string/udp_fallback"
android:theme="@style/Theme.Shadowsocks.Immersive" android:theme="@style/Theme.Shadowsocks.Immersive"
android:launchMode="singleTask"
android:excludeFromRecents="true"/> android:excludeFromRecents="true"/>
<activity <activity
...@@ -57,6 +60,7 @@ ...@@ -57,6 +60,7 @@
android:label="@string/add_profile_methods_scan_qr_code" android:label="@string/add_profile_methods_scan_qr_code"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:theme="@style/Theme.Shadowsocks.Immersive" android:theme="@style/Theme.Shadowsocks.Immersive"
android:launchMode="singleTask"
android:screenOrientation="locked" android:screenOrientation="locked"
android:excludeFromRecents="true"/> android:excludeFromRecents="true"/>
...@@ -71,6 +75,7 @@ ...@@ -71,6 +75,7 @@
android:name=".QuickToggleShortcut" android:name=".QuickToggleShortcut"
android:label="@string/quick_toggle" android:label="@string/quick_toggle"
android:theme="@android:style/Theme.Translucent.NoTitleBar" android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleTask"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:taskAffinity="" android:taskAffinity=""
android:process=":bg"> android:process=":bg">
......
...@@ -47,7 +47,6 @@ import com.github.shadowsocks.Core.app ...@@ -47,7 +47,6 @@ import com.github.shadowsocks.Core.app
import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.DirectBoot import com.github.shadowsocks.utils.DirectBoot
import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.listenForPackageChanges import com.github.shadowsocks.utils.listenForPackageChanges
import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ListListener import com.github.shadowsocks.widget.ListListener
...@@ -217,7 +216,6 @@ class AppManager : AppCompatActivity() { ...@@ -217,7 +216,6 @@ class AppManager : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_apps) setContentView(R.layout.layout_apps)
ListHolderListener.setup(this) ListHolderListener.setup(this)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
......
...@@ -43,7 +43,6 @@ import com.github.shadowsocks.preference.DataStore ...@@ -43,7 +43,6 @@ import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener import com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener
import com.github.shadowsocks.subscription.SubscriptionFragment import com.github.shadowsocks.subscription.SubscriptionFragment
import com.github.shadowsocks.utils.Key import com.github.shadowsocks.utils.Key
import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.StartService import com.github.shadowsocks.utils.StartService
import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ServiceButton import com.github.shadowsocks.widget.ServiceButton
...@@ -133,7 +132,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -133,7 +132,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_main) setContentView(R.layout.layout_main)
snackbar = findViewById(R.id.snackbar) snackbar = findViewById(R.id.snackbar)
snackbar.setOnApplyWindowInsetsListener(ListHolderListener) snackbar.setOnApplyWindowInsetsListener(ListHolderListener)
......
...@@ -34,7 +34,6 @@ import com.github.shadowsocks.plugin.AlertDialogFragment ...@@ -34,7 +34,6 @@ import com.github.shadowsocks.plugin.AlertDialogFragment
import com.github.shadowsocks.plugin.Empty import com.github.shadowsocks.plugin.Empty
import com.github.shadowsocks.plugin.PluginContract import com.github.shadowsocks.plugin.PluginContract
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.ListHolderListener
class ProfileConfigActivity : AppCompatActivity() { class ProfileConfigActivity : AppCompatActivity() {
...@@ -51,7 +50,6 @@ class ProfileConfigActivity : AppCompatActivity() { ...@@ -51,7 +50,6 @@ class ProfileConfigActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_profile_config) setContentView(R.layout.layout_profile_config)
ListHolderListener.setup(this) ListHolderListener.setup(this)
setSupportActionBar(findViewById(R.id.toolbar)) setSupportActionBar(findViewById(R.id.toolbar))
......
...@@ -35,7 +35,6 @@ import com.github.shadowsocks.database.Profile ...@@ -35,7 +35,6 @@ import com.github.shadowsocks.database.Profile
import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.plugin.PluginConfiguration import com.github.shadowsocks.plugin.PluginConfiguration
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.resolveResourceId import com.github.shadowsocks.utils.resolveResourceId
import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ListListener import com.github.shadowsocks.widget.ListListener
...@@ -85,7 +84,6 @@ class UdpFallbackProfileActivity : AppCompatActivity() { ...@@ -85,7 +84,6 @@ class UdpFallbackProfileActivity : AppCompatActivity() {
finish() finish()
return return
} }
SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_udp_fallback) setContentView(R.layout.layout_udp_fallback)
ListHolderListener.setup(this) ListHolderListener.setup(this)
......
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
tools:replace="theme"> tools:replace="theme">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name"> android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
......
...@@ -22,12 +22,10 @@ package com.github.shadowsocks.tv ...@@ -22,12 +22,10 @@ package com.github.shadowsocks.tv
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.github.shadowsocks.utils.SingleInstanceActivity
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment