{"id":18124,"date":"2023-12-21T11:06:29","date_gmt":"2023-12-21T03:06:29","guid":{"rendered":"https:\/\/www.zhidianwl.com\/zhidian\/?p=18124"},"modified":"2023-12-21T11:06:29","modified_gmt":"2023-12-21T03:06:29","slug":"qt%e5%bc%80%e5%8f%91%e5%ae%89%e5%8d%93app%e5%90%8e%e5%8f%b0%e8%bf%90%e8%a1%8c%e6%80%8e%e4%b9%88%e5%a4%84%e7%90%86%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/www.zhidianwl.com\/zhidian\/2023\/18124\/","title":{"rendered":"qt\u5f00\u53d1\u5b89\u5353app\u540e\u53f0\u8fd0\u884c\u600e\u4e48\u5904\u7406\uff1f"},"content":{"rendered":"

\u5728Qt\u5f00\u53d1\u5b89\u5353\u5e94\u7528\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528Android\u7cfb\u7edf\u63d0\u4f9b\u7684Service\u7c7b\u5b9e\u73b0\u540e\u53f0\u8fd0\u884c\u3002Service\u662fAndroid\u63d0\u4f9b\u7684\u4e00\u79cd\u8fd0\u884c\u4e8e\u540e\u53f0\u7684\u7ec4\u4ef6\uff0c\u5728\u6ca1\u6709UI\u754c\u9762\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\uff0c\u5982\u64ad\u653e\u97f3\u4e50\u3001\u5237\u65b0\u65b0\u95fb\u3001\u957f\u65f6\u95f4\u4e0b\u8f7d\u7b49\u4efb\u52a1\u3002<\/p>\n

\u5728Qt\u9879\u76ee\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7Java Native Interface\uff08JNI\uff09\u6765\u8c03\u7528Android\u5e73\u53f0\u7684Service\u7c7b\u3002\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\uff1a<\/p>\n

1. \u521b\u5efaJava\u7c7b\u7ee7\u627f\u81eaandroid.app.Service\u7c7b<\/p>\n

\u5728Qt\u9879\u76ee\u7684Java\u6e90\u7801\u76ee\u5f55\u4e2d\u65b0\u5efa\u4e00\u4e2a\u670d\u52a1\u7c7b\uff0c\u7ee7\u627f\u81eaandroid.app.Service\u7c7b\uff0c\u5e76\u91cd\u5199onCreate(), onStartCommand(), onDestroy()\u7b49\u65b9\u6cd5\u3002<\/p>\n

“`java<\/p>\n

package com.example.myapp;<\/p>\n

import android.app.Service;<\/p>\n

import android.content.Intent;<\/p>\n

import android.os.IBinder;<\/p>\n

import android.util.Log;<\/p>\n

public class MyService extends Service {<\/p>\n

private final String TAG = “MyService”;<\/p>\n

@Override<\/p>\n

public void onCreate() {<\/p>\n

super.onCreate();<\/p>\n

Log.d(TAG, “onCreate”);<\/p>\n

}<\/p>\n

@Override<\/p>\n

public int onS<\/p>\n

<\/figure>\n<\/p>\n

tartCommand(Intent intent, int flags, int startId) {<\/p>\n

Log.d(TAG, “onStartCommand”);<\/p>\n

return super.onStartCommand(intent, flags, startId);<\/p>\n

}<\/p>\n

@Override<\/p>\n

public void onDestroy() {<\/p>\n

super.onDestroy();<\/p>\n

Log.d(TAG, “onDestroy”);<\/p>\n

}<\/p>\n

@Override<\/p>\n

public IBinder onBind(Intent i\u5b89\u5353app\u5236\u4f5c<\/a>ntent) {<\/p>\n

return null;<\/p>\n

}<\/p>\n

}<\/p>\n

“`<\/p>\n

2. \u5728Qt\u9879\u76ee\u4e2d\u8c03\u7528Java\u7c7b<\/p>\n

\u5728Qt\u9879\u76ee\u4e2d\uff0c\u8c03\u7528Java\u7c7b\u9700\u8981\u4f7f\u7528QAndroidJniObject\u7c7b\u548cQAndroidJniEnvironment\u7c7b\u3002QAndroidJniObject\u7c7b\u7528\u4e8e\u521b\u5efaJava\u5bf9\u8c61\uff0cQAndroidJniEnvironment\u7c7b\u7528\u4e8e\u83b7\u53d6JVM\u73af\u5883\u548c\u6267\u884cJava\u65b9\u6cd5\u3002<\/p>\n

“`cpp<\/p>\n

#include <\/p>\n

void MyTask::startInBackground() {<\/p>\n

QAndroidJniObject serviceClass = QAndroidJniObject::fromString(“com.example.myapp.MyService”);<\/p>\n

QAndroidJniObject startService = QtAndroid::androidActivity().callObjectMethod(<\/p>\n

“startService”, \/\/ Java\u65b9\u6cd5\u540d<\/p>\n

“(Landroid\/content\/Intent;)Landroid\/content\/ComponentName;”, \/\/ Java\u65b9\u6cd5\u7b7e\u540d<\/p>\n

QtAndroid::androidContext().callObjectMethod(<\/p>\n

“getApplicationContext”, \/\/ Java\u65b9\u6cd5\u540d<\/p>\n

“()Landroid\/content\/Context;” \/\/ Java\u65b9\u6cd5\u7b7e\u540d<\/p>\n

).object()<\/p>\n

);<\/p>\n

if (startService.isValid()) {<\/p>\n

qDebug() <\/p>\n

} else {<\/p>\n

qDebug() <\/p>\n

}<\/p>\n

}<\/p>\n

“`<\/p>\n

\u5728\u4e0a\u8ff0\u4ee3\u7801\u4e2d\uff0ccreateJavaServiceObject()\u51fd\u6570\u7528\u4e8e\u521b\u5efaJava\u7c7b\u5b9e\u4f8b\uff1bgetApplicatio\u5b89\u5353app\u5f00\u53d1\u5de5\u5177<\/a>nContext()\u51fd\u6570\u7528\u4e8e\u83b7\u53d6Activity\u5bf9\u8c61\u3002<\/p>\n

3. \u5728Manifest.xml\u4e2d\u58f0\u660eService\u7c7b<\/p>\n

\u6700\u540e\uff0c\u5728Qt\u9879\u76ee\u7684AndroidManifest.xml\u6587\u4ef6\u4e2d\u58f0\u660eService\u7ec4\u4ef6\u3002<\/p>\n

“`xml<\/p>\n<\/p>\n

android:name=”.MyService”<\/p>\n

android:enabled=”true”<\/p>\n

android:exported=”false”><\/p>\n

“`<\/p>\n

\u4ee5\u4e0a\u5c31\u662f\u5728Qt\u5f00\u53d1\u5b89\u5353\u5e94\u7528\u65f6\u5b9e\u73b0\u540e\u53f0\u8fd0\u884c\u7684\u4e00\u822c\u6d41\u7a0b\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5b89\u5353\u7cfb\u7edf\u5bf9\u4e8e\u540e\u53f0\u670d\u52a1\u7684\u7ba1\u7406\u6bd4\u8f83\u4e25\u683c\uff0c\u4e0d\u5f53\u7684\u4f7f\u7528\u53ef\u80fd\u4f1a\u53d7\u5230\u7cfb\u7edf\u7684\u9650\u5236\u3002\u540c\u65f6\uff0c\u9700\u8981\u5728\u5f00\u53d1\u5e94\u7528\u65f6\u8003\u8651\u7528\u6237\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u4e0d\u8981\u8fc7\u591a\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\uff0c\u5f71\u54cd\u7528\u6237\u7684\u4f7f\u7528\u611f\u53d7\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"

\u5728Qt\u5f00\u53d1\u5b89\u5353\u5e94\u7528\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528Android\u7cfb\u7edf\u63d0\u4f9b\u7684Service\u7c7b\u5b9e\u73b0\u540e\u53f0\u8fd0\u884c\u3002Service\u662fAndroid\u63d0\u4f9b\u7684\u4e00\u79cd\u8fd0\u884c\u4e8e\u540e\u53f0\u7684\u7ec4\u4ef6\uff0c\u5728\u6ca1\u6709UI\u754c\u9762\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\uff0c\u5982\u64ad\u653e\u97f3\u4e50\u3001\u5237\u65b0\u65b0\u95fb<\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[24103,5489,593,24104,322],"class_list":{"0":"post-18124","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-zuoapp","7":"tag-app","8":"tag-5489","9":"tag-593","11":"tag-322"},"_links":{"self":[{"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/posts\/18124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/comments?post=18124"}],"version-history":[{"count":1,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/posts\/18124\/revisions"}],"predecessor-version":[{"id":18193,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/posts\/18124\/revisions\/18193"}],"wp:attachment":[{"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/media?parent=18124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/categories?post=18124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhidianwl.com\/zhidian\/wp-json\/wp\/v2\/tags?post=18124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}