在一个使用Qt编写的项目中启动一个Android服务,听起来是不太现实的,实际上的确是不现实的,因此需要绕过Qt直接使用Java实现。
方法如下:
- 生成AndroidManifast.xml文件;
- 使用Java编写一个服务;
- 使用Java继承Qt的主Activity,并在该Activity中绑定并启动该服务;
- 在AndroidManifast.xml文件中,添加服务并修改启动的Activity。
详细步骤:
1.生成AndroidManifast.xml文件
新建一个项目servicedemo,在[项目]界面中打开Build Android APK详情,点击[Create Templates]按钮,如下。
弹出一个对话框,点击完成即可。
可以在项目界面看到AndroidManifast.xml已存在,如下。
2.使用Java编写一个服务
创建servicedemo-android-src-qt-service目录,并在service文件夹下新建一个java文件MyService.java,如下。
在项目中添加该文件(右键-添加现有文件),如下。
在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,如下。
在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卡插拔事件了。
详情请看下篇博文。