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

@@ -10,7 +10,6 @@
"cvt.bytes 方法, 用于字节数据单位转换 (参阅 项目文档 > [单位转换](https://docs.autojs6.com/#/cvt))",
"fmt.bytes 方法, 用于字节数据格式化 (参阅 项目文档 > [数据格式化](https://docs.autojs6.com/#/fmt))",
"s13n.bytes 方法, 用于标准化字节数据 (参阅 项目文档 > [标准化](https://docs.autojs6.com/#/s13n))",
"UiObject#isShifted 方法, 用于检测控件位置变化",
"device.getSharedDeviceId 方法, 用于跨应用获取统一共享设备 ID _[`issue #455`](http://issues.autojs6.com/455)_",
"ui.navigationBarHeight 属性 (getter), 用于获取导航栏高度 _[`issue #456`](http://issues.autojs6.com/456)_",
"http 模块请求相关方法获取的 body 对象增加 stream/saveToFile/close 方法 _[`issue #452`](http://issues.autojs6.com/452)_",
@@ -18,6 +17,8 @@
"http 模块请求相关方法支持不安全选项参数 (isInsecure/insecure), 用于忽略证书相关异常 _[`issue #417`](http://issues.autojs6.com/417)_",
"http 模块请求相关方法支持 options.client 选项, 用于配置 OkHttpClient.Builder (如 followRedirects 等) _[`issue #454`](http://issues.autojs6.com/454)_",
"runtime.(set/is)JavaPrimitiveWrap 方法, 用于设置或获取 Java 原始类型包装策略 _[`issue #435`](http://issues.autojs6.com/435)_",
"autojs.(restart/exit) 方法, 用于重启或退出 AutoJs6 应用",
"UiObject#isShifted 方法, 用于检测控件位置变化",
"structuredClone 全局方法, 用于深拷贝 JavaScript 对象 (参阅 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/structuredClone))",
"设置页面增加 \"Java 原始类型包装\" 设置选项 _[`issue #435`](http://issues.autojs6.com/435)_",
"设置页面增加 \"定时任务调度引擎\" 设置选项, 支持 AlarmManager/WorkManager/JobScheduler _[`issue #457`](http://issues.autojs6.com/457)_ _[`issue #388`](http://issues.autojs6.com/388)_ _[`issue #163`](http://issues.autojs6.com/163)_ _[`issue #53`](http://issues.autojs6.com/53)_ _[`issue #21`](http://issues.autojs6.com/21)_",

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())
}
}
}

View File

@@ -1,5 +1,5 @@
#Fri Oct 31 09:54:36 CST 2025
BUILD_TIME=1761875676837
#Sat Nov 01 13:14:47 CST 2025
BUILD_TIME=1761974087315
COMPILE_SDK_VERSION=36
IMAGE_QUANT_CMAKE_VERSION=3.22.1
IMAGE_QUANT_NDK_VERSION=26.1.10909125
@@ -27,6 +27,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
TARGET_SDK_VERSION=36
TARGET_SDK_VERSION_INRT=29
VERSION_BUILD=3455
VERSION_BUILD=3458
VERSION_NAME=6.7.0 Alpha10
VSCODE_EXT_REQUIRED_VERSION=1.0.8