Android 原生Launcher2中动态刷新日历图标 显示日期与星期

最近项目告一段落,开始review Android4.4中的Launcher2模块。

偶然间看到同事的iPhone6(高大上)上的图标能显示今天的日期与时间,于是就自己琢磨着怎么能在Android设备上也这么实现。

于是,就试着修改Launcher2的源码,将此功能实现了。

下面就共享出来我的修改,不保证无BUG,但是自己测试下来,还是比较稳定的。

首先先看一下修改前后的效果图,仿照iPhone6的图标进行的修改

修改前的效果

修改后的效果

此代码的逻辑是直接修改IconCache中的数据,然后在每次日期改变的时候都重新绘制Icon,这时往往会从IconCache中去获取缓存的图标,在获取之前修改icon并保存到iconCache中,从而保证了每个地方获取到的Icon都会改变。

下面就是需要修改的代码部分:

第一部分

第一、监听系统日期变化

1.在LauncherApplicaiton.java中注册监听

public static final String sApplicationIconChanged = "com.android.iconchanged"; // 自定义action用于接收Icon变化的广播(为了以后能实现刷新其他应用Icon)@Overridepublic void onCreate() {super.onCreate(); // set sIsScreenXLarge and sScreenDensity *before* creating icon cachesIsScreenLarge = getResources().getBoolean(R.bool.is_large_screen);sScreenDensity = getResources().getDisplayMetrics().density; mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(this); mIconCache = new IconCache(this); mModel = new LauncherModel(this, mIconCache);// … …filter = new IntentFilter();filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);registerReceiver(mModel, filter); filter = new IntentFilter();filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);registerReceiver(mModel, filter);// Added Added by hao for refresh CalendarIcon startfilter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_DATE_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(sApplicationIconChanged); registerReceiver(mModel, filter);// Added end // Register for changes to the favorites ContentResolver resolver = getContentResolver(); resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, mFavoritesObserver);}

2、在LauncherModel.java中的Callbacks接口中添加回调方法,,在onReceive中添加对日期变化的判断

public interface Callbacks {// …public void bindSearchablesChanged();public void onPageBoundSynchronously(int page);public void updateApplicationsIcon(String pkgName); // Added by hao for refresh CalendarIcon}/*** Call from the handler for ACTION_PACKAGE_ADDED, ACTION_PACKAGE_REMOVED and* ACTION_PACKAGE_CHANGED.*/@Overridepublic void onReceive(Context context, Intent intent) {if (DEBUG_LOADERS) Log.d(TAG, "onReceive intent=" + intent);final String action = intent.getAction();if (Intent.ACTION_PACKAGE_CHANGED.equals(action)|| Intent.ACTION_PACKAGE_REMOVED.equals(action)|| Intent.ACTION_PACKAGE_ADDED.equals(action)) {// … …} else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {// … …}// … …} else if (SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED.equals(action) ||SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED.equals(action)) {if (mCallbacks != null) {Callbacks callbacks = mCallbacks.get();if (callbacks != null) {callbacks.bindSearchablesChanged();}}// Added by hao for refrash CalendarIcon start} else if (Intent.ACTION_TIME_CHANGED.equals(action) ||Intent.ACTION_DATE_CHANGED.equals(action) ||Intent.ACTION_TIMEZONE_CHANGED.equals(action) ||mApp.sApplicationIconChanged.equals(action)) {String pkgName = null;if(mApp.sApplicationIconChanged.equals(action)) {pkgName = intent.getStringExtra("packageName");} else {pkgName = "com.android.calendar";}final ArrayList<ApplicationInfo> list= (ArrayList<ApplicationInfo>) mBgAllAppsList.data.clone();ApplicationInfo info = null;if(null == list || list.isEmpty()) {return;}for(ApplicationInfo ai : list) {if(ai.componentName.getPackageName().equals(pkgName)) {info = ai;break;}}if(null != info) {if(mCallbacks != null) {Callbacks callbacks = mCallbacks.get();if (callbacks != null) {callbacks.updateApplicationsIcon(info.componentName.getPackageName());}}}// Added end}}

通过以上两步,当日期发生变化或者接收到自定义的广播"com.android.iconchanged" 的时候,能通过回调自定义的

public void updateApplicationsIcon(String pkgName); 接口来实现刷新操作

第二.在Launcher.java 派发刷新操作

去看日出,去散步,去欣赏大自然,

Android 原生Launcher2中动态刷新日历图标 显示日期与星期

相关文章:

你感兴趣的文章:

标签云: