我的服务说它正在运行,但状态不清楚-似乎没有约束

时间:2018-10-25 04:42:33

标签: java android service binding

我有一个要同时在前台模式下绑定和启动的服务。它包括:

public int onStartCommand( Intent intent, int flags, int startId ) {
        super.onStartCommand( intent, flags, startId ); 
        if( DEBUG ) Log.d( TAG, "onStartCommand() entered");  // never prints
        runningNotification = new NotificationCompat.Builder( getApplicationContext(), "Channel 1" )
                .setContentTitle( "PID Service Running" )
                .setCategory( CATEGORY_SERVICE )
                .setOngoing( true )
                .build();
        startForeground( SERVICE_NOTIFICATION_ID, runningNotification ); 

我在“活动”中启动了它(尝试过onCreate()onStart()):

bindThermoServiceIntent = new Intent( getApplicationContext(), ThermocoupleService.class );
serviceComponentName = getApplicationContext().startService( bindThermoServiceIntent );  // bind to it AND start it
if( DEBUG ) {  // seems to never fail to start
    if( serviceComponentName != null ) Log.d( TAG, "Service running with ComponentName " + serviceComponentName.toShortString() );  // looks OK
    else throw new NullPointerException( "Attempt to start Service failed" );
}
if( !( serviceBound = bindService( bindThermoServiceIntent, /*ServiceConnection*/ this, Context.BIND_AUTO_CREATE ) ) )
    throw new RuntimeException( TAG + ": bindService() call in onCreate() failed" );  // no exception

它始终使用正确的ComponentName记录“服务正在运行”,但是onStartCommand()中的log语句从不打印。

然后,当我尝试将活动绑定到服务时,我总是会得到该服务的null参考。由于未显示log语句,因此似乎未调用onServiceConnected()

public void onServiceConnected( ComponentName className, IBinder service ) {
        Log.d( TAG, "Entering onServiceConnected()" );
        // We've bound to Service, cast the IBinder and get Service instance
        thermoBinder = (ThermocoupleService.LocalBinder) service;
        thermoServiceRef = thermoBinder.getService();
        if( thermoServiceRef == null ) throw new RuntimeException( TAG
                + ": onServiceConnected returned null from getService()" );
        Log.d( TAG, "Finished onServiceConnected()" );
    }

当我尝试在活动的thermoServiceRef中使用onResume()时,我得到了NullPointerException

基本上所有这些代码都是直接从Android示例中改编而成的,我无法弄清楚它出了什么问题。尽管这是我第一次尝试对服务使用前景模式,但我在其他适用的应用程序中使用了类似的代码。

现在我想到这可能与我注意到的另一个问题有关:当我尝试在活动的onDestroy()中取消绑定服务时,我一直在收到一条消息,指出该服务未连接。

更新:这是清单中的服务声明:

<service
        android:name=".ThermocoupleService"
        android:enabled="true"
        android:exported="false"
        android:description="@string/service_description" >
</service>

1 个答案:

答案 0 :(得分:0)

在GitHub上查看了整个项目之后,我想我可以指出出了什么问题。

您错误地假设startService() / bindService()同步创建Service。如果尚未填充onResume()引用,看来您的应用将在Service中崩溃。这还不足以让Android创建Service。如果没有崩溃,Service.onCreated()将在onResume()返回后不久被调用。

TL; DR:期望异步Service创建。 (“异步”在这里不是很正确的词,因为b / c都发生在UI线程上。也许“延迟”会更好)。