我有一个要同时在前台模式下绑定和启动的服务。它包括:
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>
答案 0 :(得分:0)
在GitHub上查看了整个项目之后,我想我可以指出出了什么问题。
您错误地假设startService()
/ bindService()
同步创建Service
。如果尚未填充onResume()
引用,看来您的应用将在Service
中崩溃。这还不足以让Android创建Service
。如果没有崩溃,Service.onCreated()
将在onResume()
返回后不久被调用。
TL; DR:期望异步Service
创建。 (“异步”在这里不是很正确的词,因为b / c都发生在UI线程上。也许“延迟”会更好)。