我在我的应用程序中有这个意图服务,我想根据服务的状态(已启动/已完成)动态更改菜单中项目的图标。 换句话说,我希望服务在项目完成时更改项目的图标。
这是我的代码:
*在活动中:
.....
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));
.......
}
这似乎是一个微不足道的问题,但它确实让我头疼。 请帮助。
答案 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执行此类操作。