From 99ad5ea9d412f574639de66a92cc40fa7b7fed93 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Sat, 1 Nov 2025 13:37:51 +0800 Subject: [PATCH] =?UTF-8?q?6.7.0=20-=20Alpha10=20-=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?autojs.(restart/exit)=20=E6=96=B9=E6=B3=95,=20=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E9=87=8D=E5=90=AF=E6=88=96=E9=80=80=E5=87=BA=20AutoJs?= =?UTF-8?q?6=20=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/lang_zh-Hans.json | 3 +- .../runtime/api/augment/autojs/Autojs.kt | 46 ++++++++---- .../org/autojs/autojs/ui/main/MainActivity.kt | 34 +-------- .../autojs/ui/main/drawer/DrawerFragment.kt | 6 +- .../org/autojs/autojs/util/IntentUtils.kt | 72 +++++++++++++++++++ version.properties | 6 +- 6 files changed, 113 insertions(+), 54 deletions(-) diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index e3a978a5..4f0863c7 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -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)_", diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/autojs/Autojs.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/autojs/Autojs.kt index 5c10baa7..6d45eb13 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/autojs/Autojs.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/autojs/Autojs.kt @@ -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>>( @@ -198,6 +202,18 @@ class Autojs(private val scriptRuntime: ScriptRuntime) : Augmentable() { getLanguage(arrayOf()).toLanguageTag() } + @JvmStatic + @RhinoSingletonFunctionInterface + fun restart(args: Array): Undefined = ensureArgumentsIsEmpty(args) { + undefined { IntentUtils.App.restart(globalContext) } + } + + @JvmStatic + @RhinoSingletonFunctionInterface + fun exit(args: Array): Undefined = ensureArgumentsIsEmpty(args) { + undefined { IntentUtils.App.exit(globalContext) } + } + } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt index 10804d2c..f62b140c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt @@ -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") diff --git a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt index 639418e4..c916c0b4 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt @@ -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() { diff --git a/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt b/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt index 490d9e4e..111460a9 100644 --- a/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt @@ -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()) + } + + } + } \ No newline at end of file diff --git a/version.properties b/version.properties index 0b883885..6ab19c26 100644 --- a/version.properties +++ b/version.properties @@ -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