Widget与service通信一直是个难点,在网上发现一位仁兄的方法不错,特来分享:
AppWidgetProvider中要注册intent主要是为了处理点击事件,或者是更新widgets中的数据,接受来自应用中数据的改变消息。
通常我们会创建一个Service,在Service中注册,处理intent.下面的注册,接收时间改变的消息
public class WidgetService extends Service{
private WidgetsProvider mAppWidgetProvider = WidgetsProvider .getInstance();//widgets事例
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {//广播消息的处理
@Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())||Intent.ACTION_TIME_TICK.equals(intent.getAction())||Intent.ACTION_TIME_CHANGED.equals(intent.getAction()))
{
notifyChange(Intent.ACTION_TIMEZONE_CHANGED);
}
}
};
@Override
public void onCreate() {
super.onCreate();
//消息的注册
IntentFilter commandFilter = new IntentFilter();
commandFilter.addAction(Intent.ACTION_TIME_TICK);
commandFilter.addAction(Intent.ACTION_TIME_CHANGED);
commandFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
getBaseContext().registerReceiver(mIntentReceiver, commandFilter);
}
@Override
public void onDestroy() {
//注销
unregisterReceiver(mIntentReceiver);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void notifyChange(String what) {
mAppWidgetProvider.notifyChange(this, what);//widgets中消息的处理
}
@Override
public void onStart(Intent intent, int startId) {
}
}
由于service是要通过事件来启动,我们通常是在点击事件中来启动它,如何你在widgets中想程序启动就启动service你需要这样做:
Intent mrunningService = new Intent(context, WorldClockWidgetService.class);
// To prevent any ANR timeouts, we perfo