(Android)将服务绑定到除启动服务的活动之外的活动

时间:2013-10-11 03:25:00

标签: android service

让这个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中启动服务,我就不需要在此活动中再次启动它。

2 个答案:

答案 0 :(得分:1)

我意识到你已经找到了一种工作方式,但有几个快速建议:

1)您无需明确调用startService。该方法适用于不同的用例。绑定到它将根据需要创建Service

2)请勿使用getApplicationContext中的ActivityActivityContext,因此传递this

答案 1 :(得分:0)

OOPS!这是因为我在调用ServiceConnection函数之前尝试在onCreate()中使用该服务。