服务更改菜单项的图标

时间:2014-06-25 14:30:52

标签: android multithreading service

我在我的应用程序中有这个意图服务,我想根据服务的状态(已启动/已完成)动态更改菜单中项目的图标。 换句话说,我希望服务在项目完成时更改项目的图标。

这是我的代码:

*在活动中:

.....
public static Menu menu;
......
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub
    MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.main, menu);

     this.menu = menu;       
     return true;
}

*在服务中:

@Override
 protected void onHandleIntent(Intent intent) {

  ......              
    MainActivity.menu.getItem(0).setIcon(this.getResources().
     getDrawable(R.drawable.myicon));
 .......
  }

这似乎是一个微不足道的问题,但它确实让我头疼。 请帮助。

2 个答案:

答案 0 :(得分:0)

实际上,我发现了错误:我必须在UI线程中执行我的代码。 这是我现在的代码:

.....
Handler mHandler = new Handler();
......
@Override
protected void onHandleIntent(Intent intent) {
......              
mHandler.post(new Runnable() {            
    @Override
    public void run() {

   MainActivity.menu.getItem(0).setIcon(getResources().
   getDrawable(R.drawable.ic_menu_save));

    }
});
.......
}

答案 1 :(得分:0)

对Menu或甚至MenuItem进行静态引用真的是个坏主意。我建议使用ResultReceiver。在这种情况下,您的代码将如下所示:

意向服务:

public class IntentService extends android.app.IntentService {

    public static final int CODE_CHANGE_ICON = 122;
    public static final String EXTRA_ICON_ID = "icon_id";

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
        final ResultReceiver receiver = intent.getParcelableExtra(TestActivity.EXTRA_RESULT_RECEIVER);

        if(receiver != null) {
            Bundle args = new Bundle();
            args.putInt(EXTRA_ICON_ID, 20);
            receiver.send(CODE_CHANGE_ICON, args);
        }
    }
}

活动:

public class TestActivity extends Activity {

    public static final String EXTRA_RESULT_RECEIVER = "receiver";
    private MenuItem mItem;

    private ResultReceiver mResultReceiver = new ResultReceiver(new Handler()){
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if(resultCode == IntentService.CODE_CHANGE_ICON){
                int drawableId = resultData.getInt(IntentService.EXTRA_ICON_ID);
                if(mItem != null)
                    mItem.setIcon(drawableId);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent i = new Intent(this, IntentService.class);
        i.putExtra(EXTRA_RESULT_RECEIVER, mResultReceiver);
        startService(i);
    }
}

我知道这个解决方案看起来过于复杂,但它是执行此类操作的更好方法。此外,还可以使用EventBus执行此类操作。