我正在尝试绑定服务,但onBind()
始终返回false。
这是ServiceConnection
-
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with our service has been established,
// giving us the service object we can use to interact with our service.
mBoundService = ((ScheduleService.ServiceBinder) service).getService();
}
public void onServiceDisconnected(ComponentName className) {
mBoundService = null;
}
};
这是对bindService()
-
boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE);
这是Manifest中服务的声明 -
<service android:name=".Notifications.ScheduleService" android:enabled="true"/>
我已经阅读过有关该主题的先前问题,但无法找到答案(尝试使用应用程序上下文切换活动上下文,但它没有帮助。)
我正在使用Frgaments和ActionBarSherlock,我的Activity扩展SlidingFragmentActivity
(这就是我使用应用程序上下文的原因,但没有帮助。)
编辑 - 这是我正在尝试启动的服务的代码 -
public class ScheduleService extends Service {
/**
* Class for clients to access
*/
public class ServiceBinder extends Binder {
public ScheduleService getService() {
return ScheduleService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("ScheduleService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly stopped, so return sticky.
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
private final IBinder mBinder = new ServiceBinder();
/**
* Show an alarm for a certain date when the alarm is called it will pop up a notification
*/
public void setAlarm(Calendar c) {
// This starts a new thread to set the alarm
// You want to push off your tasks onto a new thread to free up the UI to carry on responding
new AlarmTask(this, c).run();
}
}
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
ScheduleService
的完全限定类名是什么(包括完整的包名)?
我问这个,因为在你的AndroidManifest.xml文件中,你的服务名称是.Notifications.ScheduleService
,这看起来有点奇怪:
这告诉我要么
.notifications.ScheduleService
代替,如果是这种情况。ScheduleService
在名为Notifications.java的文件中定义。
我希望.Notifications$ScheduleService
代替,如果是这种情况(美元符号而不是句号)。答案 1 :(得分:1)
你的意思是bindService()
返回false吗? onBind()
会返回IBinder
类型。
请记住,服务绑定需要一些时间。如果要在绑定完成后执行某些操作,可以使用onServiceConnected()
方法执行此操作。
public void onServiceConnected(ComponentName className, IBinder service) {
mBoundService = ((ScheduleService.ServiceBinder) service).getService();
Calendar c = new Calendar();
mBoundService.setAlarm(c);
}
如果您需要更多指导,请向我们展示您的活动代码。
答案 2 :(得分:1)
为什么使用应用程序上下文来绑定服务? 方法bindService通过ContextWrapper调用。这可能不是问题,但我会在您绑定服务的地方和您有连接的地方共享上下文。
在你的情况下,而不是
boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE);
我会做以下
boolean test = bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE);
或者,如果您想在应用程序中保留全局上下文,请将所有内容移动到您的应用程序文件中,并按照上面建议的相同方式调用它。
问题还可以在您的应用的包名称和清单中的服务声明中。如果您不确定,请确保在清单中为您的服务提供全局路由。