当按下选项菜单中的项目时,我需要从服务中调用函数:
if (id == R.id.action_connect) {
if (mIsBound) {
LocalService.connect();
// cannot be referenced from a static context
}
}
我正在使用这些docs。我读了几个答案,但我不确定这个答案。
答案 0 :(得分:1)
您可以调用startService(someIntent);
例如,您可以通过某项活动执行此类操作
Intent serviceIntent = new Intent(this, TheService.class);
serviceIntent.addCategory("some_unique_string");
startService(serviceIntent);
然后在服务中
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
if (intent.hasCategory("some_unique_string")) {
theMethodYouWantToCall();
} else if (intent.hasCategory("some_other_string")) {
someOtherMethod();
}
}
return START_STICKY;
}
您可以根据需要随时调用startService。
基本思想是创建一个表示你想要调用的“预期”方法的intent,然后在服务onStartCommand方法中,根据你通过intent传入的信息找出你应该调用的方法然后调用方法。
注意:您必须检查intent是否为null。如果系统杀死并重新启动你的服务,那么它会有效地调用startService并使用null作为intent,所以如果你把那部分留下来,将在某个时刻让NPE崩溃。
答案 1 :(得分:1)
我没有评论的声誉。但最好设置一个动作而不是类别。喜欢
<service
android:exported="false"
android:name="com.cibotechnology.KXNT.MusicService"
>
<intent-filter>
<action
android:name="com.cibotechnology.KXNT.action.PLAY" />
<action
android:name="com.cibotechnology.KXNT.action.PAUSE" />
<action
android:name="com.cibotechnology.KXNT.action.SKIP" />
<action
android:name="com.cibotechnology.KXNT.action.REWIND" />
<action
android:name="com.cibotechnology.KXNT.action.STOP" />
</intent-filter>
<intent-filter>
<action
android:name="com.cibotechnology.KXNT.action.URL" />
<data
android:scheme="http" />
</intent-filter>
</service>
并将它们添加到清单中,如
jsfiddle
查看this和此