-1

以下服务是通过其他应用程序的按钮单击触发的(通过触发待处理的 Intent)。onStartCommand() 使用 send() 方法创建消息和调度。理想情况下,我希望每次单击按钮时都会调用 onStartCommand,因为挂起的意图用于在 buttonClick 上触发服务。

但是 onstartCommand() 只调用一次,第一次单击按钮。随后的按钮单击不会触发 onStartCommand()。

有趣的是,如果我评论这一行 replyTo.send(msg); 每次单击其他应用程序的按钮时都会调用 onStartCommand 。

因此,使用 android IPC Messenger 从服务内发送消息可能会导致问题。我确认消息成功到达目标应用程序。我是否缺少有关 Messages 的一些详细信息,例如阻止发送呼叫?

我从 onStartCommand() 返回“START_STICKY”,这也可能是原因。

欢迎任何有关正在发生的事情的见解。

//MyService.java

@Override
public void onCreate() {
    // create RemoteViews -> rView
    Intent intent = new Intent(getBaseContext(), MyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(getBaseContext(), 0, intent, 0); 
    rView.setOnClickPendingIntent(buttonId, pendingIntent);
    //On click of the above button, this MyService will be started usingthe given pendingintent
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e("debug","Service onStartCommand");

    Message msg = Message.obtain(null, UPDATE_REMOTE_VIEW, rView);

    try {
        replyTo.send(msg);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return START_STICKY;
}

额外细节: Button 上的 pendingIntent(来自其他应用程序)是使用 setOnclickPendingIntent()(RemoteViews 类)设置的。

4

2 回答 2

1

我在类似情况下所做的是实现onStartCommand如下:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //
    // ... HERE support for intent sent by setOnClickPendingIntent ...
    //

    return super.onStartCommand(intent, flags, startId);
}

它似乎有效。onStartCommand被多次调用(与我的点击次数一样多RemoteViews)。

于 2017-09-27T15:06:55.887 回答
0

从文档:

客户端还可以使用 Context.bindService() 来获得到服务的持久连接。如果服务尚未运行(在执行此操作时调用 onCreate()),这同样会创建服务,但不会调用 onStartCommand()。客户端将接收服务从其 onBind(Intent) 方法返回的 IBinder 对象,然后允许客户端调用回服务。只要建立连接,服务就会保持运行(无论客户端是否保留对服务的 IBinder 的引用)。通常返回的 IBinder 是针对一个用aidl 编写的复杂接口。

所以,可能是因为使用bindService

于 2017-02-23T17:25:54.310 回答