1

我一直在对此进行一些研究,但没有找到明确的答案。

功能挑战是:

a) 使用布局启动活动 (OK)

b) 按按钮(标记为 START)单击 is 启动后台服务(确定)

c) 虽然活动可以关闭,但后台服务必须继续运行(OK)

d) 后台进程还在,我可以在我的通知中看到(OK)

e) 活动从通知重新开始(OK)

f) 活动必须连接到流程并取回它的状态。只需检查服务是否正在运行并将开始-停止按钮的标签从 (b) 设置为 STOP。

e) 点击按钮将停止服务,这样就可以了。

以下是一些细节:

与我的服务 LogoTimerService 的连接是在这样的活动中完成的:

private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {
        // We've bound to LocalService, cast the IBinder and get
        // LocalService instance
        LogoTimerServiceBinder binder = (LogoTimerServiceBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

ON RESUME 我调用这个函数来实际连接:

private void connectLogoTimerService() {
    Log.i(tag, "-connecting service");

    Intent intent = new Intent(this, LogoTimerService.class);
    startService(intent);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

    if (mService!=null) 
        Log.i(tag, "-SERVICE BOUND");
    else
        Log.i(tag, "-Service NOT bound");
}

当我第一次启动应用程序时,我收到第二条(未绑定)消息。

为什么不绑定?是要慢吗?(好像在玩。)

如果我不破坏活动,则会找到 mService。

我怎样才能同步这个,所以我可以恢复状态?

我启动并绑定服务。它是否正确?

我可以看到该服务正在使用此代码运行(我在此站点上找到了它,谢谢):

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager
            .getRunningServices(Integer.MAX_VALUE)) {
        if (LogoTimerService.class.getName().equals(
                service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

非常感谢您的帮助!

4

1 回答 1

1

回答您的第一个问题是因为 bindService 是“异步”的。您将在调用 onServiceConnected 之前输入 if 语句。

于 2012-05-08T08:10:17.213 回答