Как получить активность в Intent Service
Я хочу получить активность в службе намерения. В intent service заполните данные для управления списком.
Когда я вызываю DictionaryListAdapter в FloatSomeService (IntentService), не получается activity.
(FloatSomeService.java) Service
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
// Find Controls
LayoutInflater inflater = LayoutInflater.from(this);
viewFloat = inflater.inflate(R.layout.float_view, null);
listview = (ListView)viewFloat.findViewById(R.id.listDic);
this.generateData();
// *** Error : When create adapter, get activity from base context *** //
myAdapter = new DictionaryListAdapter((Activity)getBaseContext(), myListItem);
listview.setAdapter(myAdapter);
......................
windowManager.addView(viewFloat, parameters);
}
(DictionaryListAdapter.java)
public class DictionaryListAdapter extends BaseAdapter{
private Activity myContext;
private ArrayList<HistoryListItem> myItems;
public DictionaryListAdapter(Activity activity, ArrayList<DictionaryListItem> items){
this.myContext = activity;
this.myList = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
LayoutInflater layoutInflater = this.myContext.getLayoutInflater();
convertView = layoutInflater.inflate(R.layout.history_list_item, null);
}
ImageView imgPerson = (ImageView)convertView.findViewById(R.id.imgPerson);
...........................
}}
4 ответа:
Я использовал некоторые приемы для привязки данных управления списком. Я решил с LayoutInflater. Если я получу макет надувателя, я могу заполнить данные для элементов управления. Намерение службы может получить макет надувателя. Я посылаю LayoutInflater от службы намерении моем классе DictionaryListAdapter.
Для меня это нормально.
(FloatSomeService.java) Intent Service
public void onCreate() { // TODO Auto-generated method stub super.onCreate(); windowManager = (WindowManager)getSystemService(WINDOW_SERVICE); // Find Controls LayoutInflater inflater = LayoutInflater.from(this); viewFloat = inflater.inflate(R.layout.float_view, null); listview = (ListView)viewFloat.findViewById(R.id.listDic); this.generateData(); // *** Send Inflater to List Adapter myAdapter = new DictionaryListAdapter((LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE), myListItem); listview.setAdapter(myAdapter); ...................... windowManager.addView(viewFloat, parameters);}
(DictionaryListAdapter.java) List Adapter
public class DictionaryListAdapter extends BaseAdapter{ private LayoutInflater layoutInflater; private ArrayList<HistoryListItem> myItems; public DictionaryListAdapter(LayoutInflater inflater, ArrayList<DictionaryListItem> items){ this.layoutInflater = inflater; this.myList = items; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { // don't need activity for layout inflater convertView = this.layoutInflater.inflate(R.layout.history_list_item, null); } ImageView imgPerson = (ImageView)convertView.findViewById(R.id.imgPerson); ........................... }}
Вы не можете обновить пользовательский интерфейс в сервисе.для этого вы должны использовать активность
Используйте широковещательное уведомление для передачи данных из службы в действие и обновления представлений в действии при получении широковещательного уведомления.
Например, в классе service определите функцию уведомления braoadcast,
public void sendBroadcastNotification(Bundle extras) { if (CoreApplication.DEBUG) Log.d(TAG, "Sending broadcast notification" + mIntentMsgId); Intent intentBroadcast = new Intent(BROADCAST_MESSAGE_NAME); intentBroadcast.putExtra(CoreConstants.EXTRA_INTENT_MSG_ID, mIntentMsgId); sendBroadcast(intentBroadcast); }
И установите уведомление таким образом внутри класса обслуживания
sendBroadcastNotification(extras)
Определите класс приемника в своей деятельности
private BroadcastReceiver gpsBRec = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //Implement UI change code here once notification is received } }
В классе activity зарегистрируйте приемник в onResume () и отмените регистрацию приемника в onStop () следующим образом
@Override public void onStop() { super.onStop(); try { unregisterReceiver(gpsBRec); } catch (IllegalArgumentException e) { } } @Override public void onResume() { super.onResume(); registerReceiver(gpsBRec, new IntentFilter( RetrieveLastTrackDBService.BROADCAST_MESSAGE_NAME)); }
Как asiya сказал, Вы не можете обновить UI в serivce. Попробуйте уведомить активность из вашего сервиса, используя ResultReceiver