从活动中呼叫服务方法

时间:2014-08-17 23:27:25

标签: android

当按下选项菜单中的项目时,我需要从服务中调用函数:

if (id == R.id.action_connect) {
    if (mIsBound) {
        LocalService.connect();
        // cannot be referenced from a static context
    }
}

我正在使用这些docs。我读了几个答案,但我不确定这个答案。

2 个答案:

答案 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和此