我正在尝试创建一个服务(在智能手表中),即使用户没有使用该应用程序也应该永远运行。主要目的是使用语音识别服务。因此,每当用户说出特定单词时,应用程序应该能够像谷歌语音一样响应。
但是,出于测试目的,我在Log中打印一个整数,但它只执行一次。这意味着服务没有永远运行。
我的服务代码:
public class VoiceService extends Service {
private IBinder mBinder = new VoiceBinder();
int i = 1;
public VoiceService() {
}
@Override
public void onCreate() {
super.onCreate();
updateLog();
}
public void updateLog() {
++i;
Log.v("DATA", Integer.toString(i));
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return mBinder;
}
//inner helper class
public class VoiceBinder extends Binder {
//constructor
VoiceService getService() {
return VoiceService.this;
}
}
}
我的主要活动代码:
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
VoiceService.VoiceBinder binder = (VoiceService.VoiceBinder) iBinder;
iBinder = (IBinder) binder.getService();
MainActivity.this.voiceService = ((VoiceService.VoiceBinder)iBinder).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
voiceService = null;
}
};
//bind service
bindService(new Intent(this, VoiceService.class), serviceConnection, getApplicationContext().BIND_AUTO_CREATE);
startService(new Intent(this, VoiceService.class));
AndroidManifest:
<service
android:name=".VoiceService"
android:enabled="true"
android:exported="false">
</service>
我的输出:
12-20 22:27:20.307 23624-23624/? V/DATA: 2
答案 0 :(得分:1)
您可能希望通过Running in a Background Service来提及
长时间运行的前台操作可能会导致问题并干扰用户界面的响应性,这会使用户烦恼,甚至可能导致系统错误。为了避免这种情况,Android框架提供了几个类,可以帮助您将操作卸载到在后台运行的单独线程上。其中最有用的是IntentService。
并且还要注意:
如果您的应用定位到Android 5.0(API级别21),则应使用JobScheduler执行后台服务。
为了获得最佳应用性能并尽量减少电池耗尽,您可能还需要查看以下链接:
答案 1 :(得分:0)
我真的不建议长时间在后台运行您的服务,尤其是在使用麦克风的情况下。 Android Wear手表的电池续航时间有限,对于使用您应用的任何人来说,您都会产生较差的电池续航体验。
相反,请考虑实现自定义语音操作,如下所述: https://developers.google.com/voice-actions/interaction/voice-interactions