Skip to content

Commit

Permalink
汐洛绞架内核以游离态拉起 #71
Browse files Browse the repository at this point in the history
  • Loading branch information
Soltus committed Jun 5, 2024
1 parent dce4064 commit a5df208
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 18 deletions.
17 changes: 9 additions & 8 deletions app/src/main/java/org/b3log/siyuan/JSAndroid.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,23 +361,24 @@ public void exitSillotAndroid() {
}
activity.finishAffinity();
activity.finishAndRemoveTask();
System.exit(0);
// System.exit(0);
});
}



// @JavascriptInterface
// public void restartSillotAndroid() {
// Log.d("JSAndroid", "restartSillotAndroid() invoked");
// activity.RestartSiyuanInWebview();
// }
@JavascriptInterface
public void restartSillotAndroid() {
Log.d("JSAndroid", "restartSillotAndroid() invoked");
runOnUiThread(() -> {
activity.RestartSiyuanInWebview();
});
}
@JavascriptInterface
public void androidReboot() {
Log.d("JSAndroid", "restartSillotAndroid() invoked");
runOnUiThread(() -> {
// activity.bootKernel("");
// activity.showBootIndex();
activity.coldRestart();
});
}

Expand Down
6 changes: 3 additions & 3 deletions app/src/main/java/org/b3log/siyuan/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -907,7 +907,7 @@ protected void onRestart() { // 当活动重新启动时调用(一般是onStop
}

public void exit() {
// finish();
finish();
}

public void coldRestart() {
Expand All @@ -917,13 +917,13 @@ public void coldRestart() {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// finishAndRemoveTask(); // 这个方法用于结束当前活动,并从任务栈中移除整个任务。这意味着,当前活动所在的任务中所有的活动都会被结束,并且任务本身也会被移除。如果这个任务是最顶层的任务,那么用户将返回到主屏幕。
android.os.Process.killProcess(android.os.Process.myPid()); // 暂时无法解决杀死其他任务栈的冲突,不加这句重启活动会崩溃
// android.os.Process.killProcess(android.os.Process.myPid()); // 暂时无法解决杀死其他任务栈的冲突,不加这句重启活动会崩溃
}

public void RestartSiyuanInWebview() {
if (webView != null) {
webView.evaluateJavascript("javascript:window.Sillot.androidRestartSiYuan();", null);
// 接下来由 webview 发起 "siyuan://androidRestartSiYuan"
// 接下来由 网页端 发起 "siyuan://androidRestartSiYuan"
}
}

Expand Down
48 changes: 44 additions & 4 deletions app/src/main/java/org/b3log/siyuan/services/BootService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ import android.webkit.WebView
import androidx.core.app.ActivityCompat
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequest
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkInfo
import androidx.work.WorkManager
import com.blankj.utilcode.util.ServiceUtils
import com.blankj.utilcode.util.ThreadUtils.runOnUiThread
Expand All @@ -39,6 +42,7 @@ import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.DirectoryFileFilter
import org.apache.commons.io.filefilter.TrueFileFilter
import org.b3log.siyuan.Utils
import org.b3log.siyuan.workers.CheckHttpServerWorker
import org.b3log.siyuan.workers.SyncDataWorker
import org.json.JSONArray
import org.json.JSONObject
Expand Down Expand Up @@ -100,6 +104,9 @@ class BootService : Service() {

// 周期同步数据
scheduleSyncDataWork()

// 内核心跳检测
scheduleCheckHttpServerWork()
}

private fun init_webView() {
Expand All @@ -121,8 +128,11 @@ class BootService : Service() {
}
}

private fun startHttpServer(isServable: Boolean) {
if (null != server) {
fun isHttpServerRunning(): Boolean {
return server != null
}
fun startHttpServer(isServable: Boolean) {
if (isHttpServerRunning()) {
server?.stop()
Log.w(TAG, "startHttpServer() stop exist server")
}
Expand Down Expand Up @@ -230,11 +240,10 @@ class BootService : Service() {
}
}

private fun bootKernel(isServable: Boolean) {
fun bootKernel(isServable: Boolean) {
Mobile.setHttpServerPort(serverPort.toLong())
if (Mobile.isHttpServing()) {
Utils.LogInfo("boot", "kernel HTTP server is running")
Log.w(TAG, "showBootIndex();")
return
}
initAppAssets()
Expand Down Expand Up @@ -411,4 +420,35 @@ class BootService : Service() {
periodicWorkRequest
)
}

/**
* 这种方法并不是官方推荐的,因为它可能会导致任务之间的延迟,并且在高频率下可能会对系统资源造成压力。
*/
private fun scheduleCheckHttpServerWork() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()

// 创建一个OneTimeWorkRequest
val oneTimeWorkRequest = OneTimeWorkRequest.Builder(CheckHttpServerWorker::class.java)
.setConstraints(constraints)
.build()

// 将任务加入到WorkManager中,并设置一个UniqueWork名称
WorkManager.getInstance(this).enqueueUniqueWork(
"CheckHttpServerWork",
ExistingWorkPolicy.REPLACE, // 每次都替换之前的任务
oneTimeWorkRequest
)

// 任务完成后,延迟10秒再次启动同一个任务
WorkManager.getInstance(this).getWorkInfoByIdLiveData(oneTimeWorkRequest.id)
.observeForever { workInfo ->
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
Handler(Looper.getMainLooper()).postDelayed({
scheduleCheckHttpServerWork()
}, 10000)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,10 @@ class FloatingWindowService : Service() {
override fun onDestroy() {
Log.i(TAG, "onDestroy called")
super.onDestroy()
val connectivityManager =
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
unregisterNetworkCallback()
// val connectivityManager =
// getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// connectivityManager.unregisterNetworkCallback(networkCallback)
// unregisterWifiReceiverIfNeeded();
}

Expand Down Expand Up @@ -221,14 +222,41 @@ class FloatingWindowService : Service() {
}
}

// private fun registerNetworkCallback() {
// val connectivityManager =
// getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// val networkRequest = NetworkRequest.Builder()
// .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
// .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
// .build()
// connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
// }

private var isNetworkCallbackRegistered = false

private fun registerNetworkCallback() {
if (isNetworkCallbackRegistered) {
// NetworkCallback 已经注册,无需再次注册
return
}

val connectivityManager =
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()

connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
isNetworkCallbackRegistered = true
}

// 在适当的生命周期函数中注销NetworkCallback,例如在Activity的onDestroy中
private fun unregisterNetworkCallback() {
val connectivityManager =
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
isNetworkCallbackRegistered = false
}

@SuppressLint("SetTextI18n")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.b3log.siyuan.workers

import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
import mobile.Mobile
import org.b3log.siyuan.services.BootService

class CheckHttpServerWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
if (!Mobile.isHttpServing()) {
// 如果没有运行,重启kernel
(applicationContext as BootService).bootKernel(true)
}
// 返回Result.success()表示任务成功完成
return Result.success()
}
}

0 comments on commit a5df208

Please sign in to comment.