6.7.0 - Alpha10 - 新增 autojs.(restart/exit) 方法, 用于重启或退出 AutoJs6 应用

This commit is contained in:
SuperMonster003
2025-11-01 13:37:51 +08:00
parent f0bbfce3f6
commit 99ad5ea9d4
6 changed files with 113 additions and 54 deletions

View File

@@ -1,39 +1,41 @@
package org.autojs.autojs.runtime.api.augment.autojs
import org.autojs.autojs.rhino.ProxyObject
import org.autojs.autojs.rhino.ProxyObject.Companion.PROXY_GETTER_KEY
import org.autojs.autojs.runtime.ScriptRuntime
import org.autojs.autojs.runtime.api.augment.Augmentable
import org.autojs.autojs.util.RhinoUtils.NOT_CONSTRUCTABLE
import org.autojs.autojs.util.RhinoUtils.coerceString
import org.autojs.autojs.util.RhinoUtils.newBaseFunction
import org.mozilla.javascript.BaseFunction
import org.mozilla.javascript.NativeObject
import org.mozilla.javascript.Scriptable
import java.util.function.Supplier
import android.Manifest
import org.autojs.autojs6.BuildConfig
import android.content.pm.PackageManager
import org.autojs.autojs.util.RootUtils
import org.autojs.autojs.util.RootUtils.RootMode
import android.provider.Settings
import android.provider.Settings.System
import org.autojs.autojs.annotation.RhinoSingletonFunctionInterface
import org.autojs.autojs.extension.AnyExtensions.isJsNullish
import org.autojs.autojs.extension.FlexibleArray
import org.autojs.autojs.extension.ScriptableExtensions.prop
import org.autojs.autojs.extension.ScriptableExtensions.defineProp
import org.autojs.autojs.extension.ScriptableExtensions.prop
import org.autojs.autojs.rhino.ProxyObject
import org.autojs.autojs.rhino.ProxyObject.Companion.PROXY_GETTER_KEY
import org.autojs.autojs.runtime.ScriptRuntime
import org.autojs.autojs.runtime.api.ScreenMetrics
import org.autojs.autojs.runtime.api.augment.Augmentable
import org.autojs.autojs.runtime.api.augment.util.Util.checkStringArgument
import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.IntentUtils
import org.autojs.autojs.util.RhinoUtils.NOT_CONSTRUCTABLE
import org.autojs.autojs.util.RhinoUtils.UNDEFINED
import org.autojs.autojs.util.RhinoUtils.coerceIntNumber
import org.autojs.autojs.util.RhinoUtils.coerceString
import org.autojs.autojs.util.RhinoUtils.newBaseFunction
import org.autojs.autojs.util.RhinoUtils.newNativeObject
import org.autojs.autojs.util.RhinoUtils.undefined
import org.autojs.autojs.util.RootUtils
import org.autojs.autojs.util.RootUtils.RootMode
import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
import org.mozilla.javascript.BaseFunction
import org.mozilla.javascript.Context
import org.mozilla.javascript.NativeObject
import org.mozilla.javascript.Scriptable
import org.mozilla.javascript.Undefined
import java.util.*
import java.util.function.Supplier
import android.content.Context as AndroidContext
class Autojs(private val scriptRuntime: ScriptRuntime) : Augmentable() {
@@ -77,6 +79,8 @@ class Autojs(private val scriptRuntime: ScriptRuntime) : Augmentable() {
::canDisplayOverOtherApps.name,
::getLanguage.name,
::getLanguageTag.name,
::restart.name,
::exit.name,
)
override val selfAssignmentGetters = listOf<Pair<String, Supplier<Any?>>>(
@@ -198,6 +202,18 @@ class Autojs(private val scriptRuntime: ScriptRuntime) : Augmentable() {
getLanguage(arrayOf()).toLanguageTag()
}
@JvmStatic
@RhinoSingletonFunctionInterface
fun restart(args: Array<out Any?>): Undefined = ensureArgumentsIsEmpty(args) {
undefined { IntentUtils.App.restart(globalContext) }
}
@JvmStatic
@RhinoSingletonFunctionInterface
fun exit(args: Array<out Any?>): Undefined = ensureArgumentsIsEmpty(args) {
undefined { IntentUtils.App.exit(globalContext) }
}
}
}

View File

@@ -8,7 +8,6 @@ import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.Process
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
@@ -21,17 +20,11 @@ import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPager.SimpleOnPageChangeListener
import com.google.android.material.tabs.TabLayout
import com.huaban.analysis.jieba.CharsDictionaryDatabase
import com.huaban.analysis.jieba.PhrasesDictionaryDatabase
import com.huaban.analysis.jieba.WordDictionaryDatabase
import org.autojs.autojs.App
import org.autojs.autojs.AutoJs
import org.autojs.autojs.app.FragmentPagerAdapterBuilder
import org.autojs.autojs.app.FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter
import org.autojs.autojs.app.OnActivityResultDelegate
import org.autojs.autojs.app.OnActivityResultDelegate.DelegateHost
import org.autojs.autojs.core.accessibility.AccessibilityTool
import org.autojs.autojs.core.image.capture.ScreenCapturerForegroundService
import org.autojs.autojs.core.permission.RequestPermissionCallbacks
import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.event.BackPressedHandler
@@ -50,7 +43,6 @@ import org.autojs.autojs.theme.widget.ThemeColorFloatingActionButton
import org.autojs.autojs.theme.widget.ThemeColorToolbar
import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.ui.doc.DocumentationFragment
import org.autojs.autojs.ui.enhancedfloaty.FloatyService
import org.autojs.autojs.ui.explorer.ExplorerView
import org.autojs.autojs.ui.floating.FloatyWindowManger
import org.autojs.autojs.ui.log.LogActivity
@@ -305,33 +297,9 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
}
}
fun rebirth() {
packageManager.getLaunchIntentForPackage(packageName)?.let {
startActivity(Intent.makeRestartActivityTask(it.component))
}
exitCompletely()
}
fun exitCompletely() {
FloatyWindowManger.hideCircularMenuAndSaveState()
FloatyService.stopService()
ScreenCapturerForegroundService.stopService()
AutoJs.instance.scriptEngineService.stopAll()
AutoJs.instance.clear()
App.app.clear()
WordDictionaryDatabase.getInstance(applicationContext).close()
CharsDictionaryDatabase.getInstance(applicationContext).close()
PhrasesDictionaryDatabase.getInstance(applicationContext).close()
fun beforeExit() {
mA11yTool.stopService(false)
mForeGroundService.stopIfNeeded()
WrappedShizuku.onDestroy()
Process.killProcess(Process.myPid())
}
@Suppress("OVERRIDE_DEPRECATION")

View File

@@ -39,6 +39,8 @@ import org.autojs.autojs.ui.main.MainActivity
import org.autojs.autojs.ui.settings.AboutActivity
import org.autojs.autojs.ui.settings.PreferencesActivity
import org.autojs.autojs.util.DisplayUtils
import org.autojs.autojs.util.IntentUtils.App.exit
import org.autojs.autojs.util.IntentUtils.App.restart
import org.autojs.autojs.util.NetworkUtils
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.MODE
@@ -414,8 +416,8 @@ open class DrawerFragment : Fragment() {
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
}
binding.restart.setOnClickListener { mActivity.rebirth() }
binding.exit.setOnClickListener { mActivity.exitCompletely() }
binding.restart.setOnClickListener { restart(mActivity, mActivity::beforeExit) }
binding.exit.setOnClickListener { exit(mActivity, mActivity::beforeExit) }
}
override fun onResume() {

View File

@@ -1,17 +1,31 @@
package org.autojs.autojs.util
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Context.ALARM_SERVICE
import android.content.Intent
import android.net.Uri
import android.os.Process
import android.os.SystemClock
import android.provider.OpenableColumns
import android.provider.Settings
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.core.net.toUri
import com.google.android.material.snackbar.Snackbar
import com.huaban.analysis.jieba.CharsDictionaryDatabase
import com.huaban.analysis.jieba.PhrasesDictionaryDatabase
import com.huaban.analysis.jieba.WordDictionaryDatabase
import org.autojs.autojs.AutoJs
import org.autojs.autojs.core.image.capture.ScreenCapturerForegroundService
import org.autojs.autojs.external.fileprovider.AppFileProvider
import org.autojs.autojs.runtime.api.Mime
import org.autojs.autojs.runtime.api.WrappedShizuku
import org.autojs.autojs.ui.enhancedfloaty.FloatyService
import org.autojs.autojs.ui.floating.FloatyWindowManger
import org.autojs.autojs6.R
import java.io.File
@@ -314,4 +328,62 @@ object IntentUtils {
fun show(messageRes: Int)
}
object App {
@JvmStatic
@JvmOverloads
fun restart(context: Context, extraActions: (() -> Unit)? = null) {
val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)?.apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
when (context) {
is AppCompatActivity -> {
context.startActivity(launchIntent)
}
else -> {
val pendingIntent = PendingIntent.getActivity(
/* context = */ context,
/* requestCode = */ 1001,
/* intent = */ launchIntent,
/* flags = */ PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE,
)
val am = context.getSystemService(ALARM_SERVICE) as AlarmManager
am.setExactAndAllowWhileIdle(
/* type = */ AlarmManager.ELAPSED_REALTIME,
/* triggerAtMillis = */ SystemClock.elapsedRealtime() + 300L,
/* operation = */ pendingIntent,
)
}
}
exit(context, extraActions)
}
@JvmStatic
@JvmOverloads
fun exit(context: Context, extraActions: (() -> Unit)? = null) {
FloatyWindowManger.hideCircularMenuAndSaveState()
FloatyService.stopService()
ScreenCapturerForegroundService.stopService()
AutoJs.instance.scriptEngineService.stopAll()
AutoJs.instance.clear()
org.autojs.autojs.App.app.clear()
WordDictionaryDatabase.getInstance(context.applicationContext).close()
CharsDictionaryDatabase.getInstance(context.applicationContext).close()
PhrasesDictionaryDatabase.getInstance(context.applicationContext).close()
WrappedShizuku.onDestroy()
extraActions?.invoke()
Process.killProcess(Process.myPid())
}
}
}