Как получить активность в 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 5

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