Android QtService 不会在单独的进程上调用像 onCreate 这样的重写方法
Android QtService doesn't call override methods like onCreate on a separated process
我正在处理这个:
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu
minSdkVersion 21
targetSdkVersion 29
Tested on two Android 10
当我 运行 android QtService
如果服务 运行 在 在 XML 定义中使用选项 android:process=":rs
分隔进程 。 Qt 库执行正确,因为我可以在 logcat 上看到调试信息,但如果我在 onCreate
或 onStartCommand
上添加任何代码,它永远不会执行。
我的服务代码:
package net.altermundi.elrepoio
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import org.qtproject.qt5.android.bindings.QtService
class RetroShareServiceAndroid : QtService() {
override fun onCreate() {
System.out.println("salkmdsa onCreate")
super.onCreate()
}
override fun onDestroy() {
System.out.println("salkmdsa onDestroy")
super.onDestroy()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
System.out.println("salkmdsa onStartCommand")
// Do some work
return super.onStartCommand(intent, flags, startId)
}
companion object {
fun start(ctx: Context) {
ctx.startService(Intent(ctx, RetroShareServiceAndroid::class.java))
}
fun stop(ctx: Context) {
ctx.stopService(Intent(ctx, RetroShareServiceAndroid::class.java))
}
fun isRunning(ctx: Context): Boolean {
val manager = ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (service in manager.getRunningServices(Integer.MAX_VALUE))
if (RetroShareServiceAndroid::class.java!!.getName().equals(service.service.getClassName()))
return true
return false
}
}
}
正如我们在上面看到的,我添加了一些 println
(打印行)执行。 如果 运行 在单独的进程中,则永远不会执行此代码或任何其他代码。
我在 android 清单上的服务定义:
<service android:name=".RetroShareServiceAndroid" android:label="RetroShare Service" android:process=":rs>
<!-- Qt Application to launch -->
<meta-data android:name="android.app.lib_name" android:value="retroshare-service"/>
<!-- Ministro -->
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
<meta-data android:name="android.app.repository" android:value="default"/>
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/>
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
<!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="1"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="plugins/platforms/android/libqtforandroid.so:plugins/bearer/libqandroidbearer.so"/>
<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidExtras.jar:jar/QtAndroidBearer.jar"/>
<meta-data android:name="android.app.static_init_classes" android:value=""/>
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<!-- Messages maps -->
<!-- Background running -->
<meta-data android:name="android.app.background_running" android:value="true"/>
<!-- Background running -->
</service>
这里就不贴Main了activity因为估计代码不相关,反正能找到here.
我能说自己傻吗?
我在 IDE 控制台上看不到 println
字符串,因为进程是分开的。
如果我使用 logcat 查看,我看到了它们。
结案
我正在处理这个:
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu
minSdkVersion 21
targetSdkVersion 29
Tested on two Android 10
当我 运行 android QtService
如果服务 运行 在 在 XML 定义中使用选项 android:process=":rs
分隔进程 。 Qt 库执行正确,因为我可以在 logcat 上看到调试信息,但如果我在 onCreate
或 onStartCommand
上添加任何代码,它永远不会执行。
我的服务代码:
package net.altermundi.elrepoio
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import org.qtproject.qt5.android.bindings.QtService
class RetroShareServiceAndroid : QtService() {
override fun onCreate() {
System.out.println("salkmdsa onCreate")
super.onCreate()
}
override fun onDestroy() {
System.out.println("salkmdsa onDestroy")
super.onDestroy()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
System.out.println("salkmdsa onStartCommand")
// Do some work
return super.onStartCommand(intent, flags, startId)
}
companion object {
fun start(ctx: Context) {
ctx.startService(Intent(ctx, RetroShareServiceAndroid::class.java))
}
fun stop(ctx: Context) {
ctx.stopService(Intent(ctx, RetroShareServiceAndroid::class.java))
}
fun isRunning(ctx: Context): Boolean {
val manager = ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (service in manager.getRunningServices(Integer.MAX_VALUE))
if (RetroShareServiceAndroid::class.java!!.getName().equals(service.service.getClassName()))
return true
return false
}
}
}
正如我们在上面看到的,我添加了一些 println
(打印行)执行。 如果 运行 在单独的进程中,则永远不会执行此代码或任何其他代码。
我在 android 清单上的服务定义:
<service android:name=".RetroShareServiceAndroid" android:label="RetroShare Service" android:process=":rs>
<!-- Qt Application to launch -->
<meta-data android:name="android.app.lib_name" android:value="retroshare-service"/>
<!-- Ministro -->
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
<meta-data android:name="android.app.repository" android:value="default"/>
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/>
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
<!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="1"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="plugins/platforms/android/libqtforandroid.so:plugins/bearer/libqandroidbearer.so"/>
<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidExtras.jar:jar/QtAndroidBearer.jar"/>
<meta-data android:name="android.app.static_init_classes" android:value=""/>
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<!-- Messages maps -->
<!-- Background running -->
<meta-data android:name="android.app.background_running" android:value="true"/>
<!-- Background running -->
</service>
这里就不贴Main了activity因为估计代码不相关,反正能找到here.
我能说自己傻吗?
我在 IDE 控制台上看不到 println
字符串,因为进程是分开的。
如果我使用 logcat 查看,我看到了它们。
结案