0

今天,使用 Android 服务,在我看来,工作方法遇到了一些“不合逻辑”或“不正确” bindService。我在您内部的应用程序服务中创建的混淆的本质是ExecutorService发出请求。当我进入应用程序时,服务仍然存在 - 查询在不同的线程中执行,具有一定的周期性(日志证实了这一点)。在 onStart() 方法中,我编写了代码,根据所有手册和教程,我应该可以使用此应用程序访问我之前运行过的服务。但我们所有的建议似乎都很明显。我期待着打电话bindService()-> 我连接到正在运行的服务。但是不,相反,在第一次尝试时连接没有发生 - 我不明白为什么。我添加了可以运行服务本身的代码,如果之前没有完成的话。所以这部分代码被激活,我再次尝试连接到正在运行的服务。是的,连接是成功的,但是 - 连接滋养了我期望从第一次连接尝试中获得的服务。从我尝试重新创建服务的日志来看,并不会导致它的创建。所有这些都来自日志。在这方面,我想知道 - 为什么第一次尝试连接它没有发生?还是我做错了?

Activity中的片段代码

...
private ServiceConnection serviceConnection = new ServiceConnection(){
        public void onServiceConnected(ComponentName name, IBinder service) {
            flagServiceConnection = true;
            Log.d("StartActivity/serviceConnection", "serviceConnection/onServiceConnected() -> connected");
            exService = ((ExService.ExBinder) service).getService();
            exService.setFlagBroadcast(true);
            exService.getAll();
        }

        public void onServiceDisconnected(ComponentName name) {
            flagServiceConnection = false;
            Log.d("StartActivity/serviceConnection", "serviceConnection/onServiceDisconnected() -> disconnected");
        }       
    };
...
public void onStart(){
        super.onStart();        
        bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, 0);       
        if(!flagServiceConnection){
            Log.d("StartActivity", "onStart() -> start service");
            this.startService(new Intent(this.getApplicationContext(), ExService.class));
            bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, 0);           
        }       
    }

日志

D/StartActivity(5922): onCreate()
D/StartActivity(5922): onStart() -> start service
D/StartActivity/serviceConnection(5922): erviceConnection/onServiceConnected() -> connected
D/-(5922): pront.android.exservice.ExService$Monitor@4056b4c8
D/-(5922): pront.android.exservice.ExService$Monitor@405480e0
D/-(5922): pront.android.exservice.ExService$Monitor@4054ee18
D/ExService(5922): onRebind()
D/ExService(5922): onStartCommand() -> service start
4

1 回答 1

0

您的第一次连接尝试有效,但您的flagServiceConnection检查无效,因此您总是尝试再连接一次,这就是原因。

当你调用bindService()方法时,你并没有立即连接到服务,所以flagServiceConnection当你尝试检查它时你还没有设置。

我假设您检查的目的是在绑定之前启动服务(如果尚未启动)。为此,您需要bindService()使用BIND_AUTO_CREATE标志调用:

@Override
public void onStart(){
    super.onStart();        
    bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, BIND_AUTO_CREATE);       
    //that's it, if service is not started, it will be started automatically 
    //no need for additional checks         
    }       
}
于 2013-01-17T19:19:10.090 回答