如何在Intent Service中获取Activity

6

我希望从Intent Service中获取活动状态。在Intent Service中,填充数据到列表控件中。 当我在FloatSomeService(IntentService)中调用DictionaryListAdapter时,无法获得活动状态。
(FloatSomeService.java)服务

 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个回答

2
使用广播通知从服务传递数据到活动,并在接收广播通知时更新活动中的视图。
例如,在服务类中定义一个广播通知函数,
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));


    }

1
我使用了一些列表控制数据绑定的技巧。我用LayoutInflater解决了这个问题。如果我得到布局填充器,我就可以将数据填充到控件中。Intent Service可以获取Layout Inflater。我将LayoutInflater从Intent Service发送到我的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) 列表适配器

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);
    ...........................
}}

0

你不能在服务中更新用户界面。你必须使用活动(Activity)来实现。


我在Service中使用了WindowManager。 - B M

-1

正如Asiya所说,您不能在服务中更新UI。 尝试使用ResultReceiver从您的服务通知活动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接