In case anyone else has similar issues: the problem seems to be that the listener class gets called from a different context than the main application. The RecordStore used by the application wasn't visible to the listener even when it was opened with AUTHMODE_ANY.
My temporary solution is pass the open RecordStore to the listener's constructor - this seems to work fine, but it means keeping the store open and there's no way to close it (no finalize).
The only satisfactory long-term solution I can think of is to create a thread class that performs all access to this RecordStore (opening and closing it for each operation), and start it running in the app's startup code. The thread would read the IDs of the elements in the RecordStore to be operated on from a Vector or similar in the RuntimeStore.
Leo Shaw http://www.leoshaw.co.uk