2010-07-12 41 views
0

我有一个活动通过获取函数与后台服务的数据成员进行通信并直接访问它。问题是,我似乎无法访问实际的数据成员。例如,我尝试获得一个ArrayList,其中包含一些项目,但我只收到一个空的ArrayList。后台服务的访问数据成员

此代码几乎直接来自Android Service类doc中的本地服务教程。

这里是我的服务:CommunicationService

public static final String BROADCAST_ALARM = "Alarm"; 
private Intent mAlarmBroadcast = new Intent(BROADCAST_ALARM); 

private AlarmList mAlarms; 

class TempTask extends AsyncTask<String, Void, Void> { 

    private int id = 0; 

    @Override 
    protected Void doInBackground(String... params) { 
     while (true) { 
      mAlarms.addAlarm(++id, "Description", "Label"); 


      sendBroadcast(mAlarmBroadcast); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 

      } 
     } 
    } 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mAlarms = new AlarmList(); 
    new TempTask().execute("test"); 
} 

public AlarmList getAlarmList() { 
    return mAlarms; 
} 

这是我的束缚活动:

private CommunicationService mComService = null; 

private IconicAdapter mListAdapter; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    setContentView(R.layout.alarm_list); 

    mListAdapter = new IconicAdapter(this, R.layout.row, R.id.label); 
    setListAdapter(mListAdapter); 

    // Attempt to bind with the service. 
    bindService(new Intent(this, CommunicationService.class), mOnService, BIND_AUTO_CREATE); 
} 

/* 
* Receives broadcasts from the bound service. 
*/ 
private BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action != null) { 
      if (action.equals(CommunicationService.BROADCAST_ALARM)) { 
       AlarmList alarmList = mComService.getAlarmList(); 

       ArrayList<Alarm> alarms = alarmList.getAllAlarms(); 
       /* THIS IS WHERE THE PROBLEM EXISTS. 
       * alarms is an ArrayList of size 0, where as if you break 
       * over the actual data member in the service class, it is 
       * full of elements. 
       */ 
       mListAdapter.addAll(alarms); 
      } 
     } 
    } 
}; 

private ServiceConnection mOnService = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder binder) { 
     mComService = ((CommunicationService.LocalBinder) binder).getService(); 

     appendAlarms(); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     // This is called when the connection with the service has been 
     // unexpectedly disconnected -- that is, its process crashed. 
     mComService = null; 
    } 
}; 

回答

1

以为我会回答这个问题,以防万一出现了同样的情况其他人。

我通过结合到其之前使用

startService(Intent intent); 

方法解决了这个问题。如果仅使用bindService(...)来启动服务,那么一旦没有绑定活动或其他服务附加到该服务,该服务就会被销毁。使用startService(...)允许服务在没有任何绑定的情况下存在。

这正是我的程序中发生的情况;我在Activity的onDestroy()方法中调用unbindService(...),然后在下一个Activity的onStart()方法中使用bindService(...)再次绑定。因此,我开展的每项活动都开始停止一项全新的服务。

+0

作为一个方面说明,要停止已使用startService(Intent intent)开始的服务,您必须确保它未绑定到任何ServiceConnection,然后对其调用stopService(Intent intent)。 – mdupls 2010-08-05 14:22:59