Qt on Android 启动一个Android的服务(Service)

在一个使用Qt编写的项目中启动一个Android服务,听起来是不太现实的,实际上的确是不现实的,因此需要绕过Qt直接使用Java实现。


方法如下:

  1. 生成AndroidManifast.xml文件;
  2. 使用Java编写一个服务;
  3. 使用Java继承Qt的主Activity,并在该Activity中绑定并启动该服务;
  4. 在AndroidManifast.xml文件中,添加服务并修改启动的Activity。


详细步骤:


1.生成AndroidManifast.xml文件

新建一个项目servicedemo,在[项目]界面中打开Build Android APK详情,点击[Create Templates]按钮,如下。
生成AndroidManifast.xml文件 图1


弹出一个对话框,点击完成即可。
可以在项目界面看到AndroidManifast.xml已存在,如下。
生成AndroidManifast.xml文件 图2



2.使用Java编写一个服务


创建servicedemo-android-src-qt-service目录,并在service文件夹下新建一个java文件MyService.java,如下。
使用Java编写一个服务 图1


在项目中添加该文件(右键-添加现有文件),如下。
使用Java编写一个服务 图2


在MyService.java文件中写一个Android服务,并在服务被绑定和创建的时候添加Log信息,如下。

package qt.service;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

    private static final String TAG = "MyService";
    //File imagepath;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        Log.i(TAG, "Service on bind");//服务被绑定
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service on create");//服务被创建
    }
}


3.使用Java继承Qt的主Activity


与第二步相似,添加相应目录和相应Java文件MyActivity.java,如下。
使用Java继承Qt的主Activity 图1
使用Java继承Qt的主Activity 图2


在MyActivity.java中继承Qt的主Activity,并绑定和启动服务MyService,如下。

package qt.activity;

import org.qtproject.qt5.android.bindings.QtActivity;
import android.os.Bundle;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import qt.service.MyService;

public class MyActivity extends QtActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent bindIntent = new Intent(MyActivity.this, MyService.class);
        bindService(bindIntent, mCon, Context.BIND_AUTO_CREATE);
        startService(new Intent(bindIntent));

    }

    private static ServiceConnection mCon = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            // TODO Auto-generated method stub

        }
    };
}

这里需要说明的是关于Qt编写的Android项目打开的Activity,可以在AndroidManifast.xml文件中看到,打开的Activity为QtActivity,位于包org.qtproject.qt5.android.bindings中,因此我们的MyActivity需要继承的即是QtActivity,并添加super关键字,在JAVA类中使用super来引用父类的成分,最后绑定MyService服务并启动。

 <activity ……android:name="org.qtproject.qt5.android.bindings.QtActivity" ……>
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            ……………………
        </activity>
    </application>


4. 在AndroidManifast.xml文件中,添加服务并修改启动的Activity

    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --">
        <activity …… android:name="qt.activity.MyActivity" ……>
        ……
        </activity>
        <service android:name="qt.service.MyService">
            <intent-filter>
                <action android:name="qt.service.MyService"/>
            </intent-filter>
        </service>
    </application>


检验效果

编译并运行该项目,可以看到如下输出,表示MyService成功被创建并绑定。
检验效果



那么启动一个服务究竟有什么用呢,通过绑定一个监听sd卡插拔事件的服务,直接在服务中发射信号,并在Qt中使用信号与槽捕获该信号,即可实现Qt监听Android中sd卡插拔事件了。

详情请看下篇博文。

猜你喜欢

转载自blog.csdn.net/jun4331247/article/details/51182390
今日推荐