让这个Android应用程序工作有点麻烦。基本上,在主菜单中我启动了我创建的服务,这很好用。我遇到的问题是我有一个可以从主活动调用的选项活动,我希望选项活动能够与我在主活动中启动的服务进行交互。
我已经阅读了这个页面http://developer.android.com/guide/components/bound-services.html,我似乎已经做好了一切,但是当我尝试访问该服务的某些成员函数时,我的程序崩溃了。当我尝试访问服务中的hashmap时,它就会发生。
在我的选项菜单活动的onCreate类中:
Intent passedintent = getIntent(); // gets the intent sent to the activity
//Intent intentShim = new Intent(this, ShimmerService.class);
// binds the shimmer service to this activity
boolean isconnected = getApplicationContext().bindService(intent, shimmerServiceConnection, Context.BIND_AUTO_CREATE);
// register the shimmer receiver
registerReceiver(shimmerReceiver, new IntentFilter("com.jpl_347E.bio_sigapp.ShimmerService"));
passintent Intent从开始此活动的主活动中获取意图。起初我尝试将其作为
的第一个参数传递getApplicationContext().bindService(....)
功能,但似乎没有用。所以我创建了一个新的intent,它反映了我在主菜单活动中用来创建服务的那个。我在选项菜单活动中也有这些功能
private ServiceConnection shimmerServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
LocalShimmerBinder binder = (LocalShimmerBinder)arg1;
serviceshim = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
private BroadcastReceiver shimmerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getIntExtra("ShimmerState", -1) != -1)
;//TODO
}
};
这与我在主菜单活动中的代码完全相同,并且完全能够在那里找到服务。我想我已经将错误追溯到了
binder.getService()
此函数返回null,然后我尝试访问我的引用变量未指向的类中的hashmap(它指向null)。 我只是无法弄清楚为什么binder.getService()会在这里返回null而不是在主菜单函数中。我可能需要再次启动服务吗? 我认为,一旦我在main中启动服务,我就不需要在此活动中再次启动它。
答案 0 :(得分:1)
我意识到你已经找到了一种工作方式,但有几个快速建议:
1)您无需明确调用startService
。该方法适用于不同的用例。绑定到它将根据需要创建Service
。
2)请勿使用getApplicationContext
中的Activity
。 Activity
是Context
,因此传递this
。
答案 1 :(得分:0)
OOPS!这是因为我在调用ServiceConnection函数之前尝试在onCreate()中使用该服务。