Android应用模拟时钟小部件不起作用
Posted
技术标签:
【中文标题】Android应用模拟时钟小部件不起作用【英文标题】:Android app Analog Clock widget not working 【发布时间】:2016-02-01 04:19:16 【问题描述】:我正在尝试为应用创建模拟时钟小部件。我已经完成了,时钟可以工作,但我希望在点击时打开默认或已安装的时钟应用程序。
这是我实现的代码。几个月前它还在工作。 (因为大学,我不得不停止开发)。
有人可以告诉我如何修复它并让它再次工作吗?
编辑:我确定代码进入了 views.setOnClickPendingIntent() 的部分......但是时钟应用程序没有启动/打开。
提前致谢。
代码:
public class ClockWidget extends AppWidgetProvider
public HashMap<String, String> activityMap;
PackageManager packageManager;
@Override
public void onReceive(Context context, Intent intent)
packageManager = context.getPackageManager();
boolean foundApp = false;
setupHashMap();
String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action))
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.clock_widget);
Intent clockAppIntent = new Intent();
clockAppIntent.setAction(Intent.ACTION_MAIN);
clockAppIntent.addCategory(Intent.CATEGORY_LAUNCHER);
for (String packageName : activityMap.keySet())
if (Util.isAppInstalled(context, packageName))
ComponentName cn = new ComponentName(packageName, activityMap.get(packageName));
clockAppIntent.setComponent(cn);
clockAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
foundApp = true;
break;
if (foundApp)
views.setOnClickPendingIntent(R.id.clockWidget,
PendingIntent.getActivity(context, 0, clockAppIntent, 0));
AppWidgetManager.getInstance(context)
.updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
private void setupHashMap()
activityMap = new HashMap<>();
activityMap.put("com.android.alarmclock", "com.android.alarmclock.AlarmClock");
activityMap.put("com.android.deskclock", "com.android.deskclock.DeskClock");
activityMap.put("com.google.android.deskclock", "com.google.android.deskclock.DeskClock");
activityMap.put("com.google.android.deskclock", "com.android.deskclock.AlarmClock");
activityMap.put("com.sec.android.app.clockpackage", "com.sec.android.app.clockpackage.ClockPackage");
activityMap.put("com.sonyericsson.alarm", "com.sonyericsson.alarm.Alarm");
activityMap.put("com.sonyericsson.organizer", "com.sonyericsson.organizer.Organizer_WorldClock");
activityMap.put("com.asus.alarmclock", "com.asus.alarmclock.AlarmClock");
activityMap.put("com.asus.deskclock", "com.asus.deskclock.DeskClock");
activityMap.put("com.htc.android.worldclock", "com.htc.android.worldclock.WorldClockTabControl");
activityMap.put("com.motorola.blur.alarmclock", "com.motorola.blur.alarmclock.AlarmClock");
activityMap.put("com.lge.clock", "com.lge.clock.AlarmClockActivity");
清单:
<receiver
android:name=".widgets.ClockWidget"
android:label="@string/clock_widget_title">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/clock_widget_provider"/>
</receiver>
布局:
<?xml version="1.0" encoding="utf-8"?>
<AnalogClock
android:id="@+id/clockWidget"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:clickable="true"
android:dial="@drawable/clock_bg"
android:hand_hour="@drawable/clock_hour_hand"
android:hand_minute="@drawable/clock_minute_hand"/>
提供者:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/clock_widget"
android:minHeight="144dip"
android:minWidth="144dip"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen"/>
【问题讨论】:
我的第一个想法是您应该摆脱巨大的 if() 块,并用迭代器替换它。将包/类名常量移动到查找表中,然后迭代那些代替。 @Jameson 好的,但是怎么做?您可以发布一些代码以供参考吗? 【参考方案1】:这里有一些代码片段可以帮助你开始重构那个巨大的 if() 块。
HashMap activityMap;
private void setupHashMap()
// setup a map from the package name to the activity that
// is responsible for the clock
activityMap = new HashMap(String, String);
activityMap.put("com.package.foo", "com.package.foo.AlarmClock");
// ... add your items ...
private void launchAlarmClock()
// setup intent
for (String packageName : activityMap.keySet())
if (Util.appIsInstalled(context, packageName))
Log.d(TAG, "Using the " + packageName + "alarm clock.");
intent.setPackage(packageName);
intent.setComponent(new ComponentName(packageName,
activityMap.get(packageName)));
// do something with the intent
【讨论】:
以上是关于Android应用模拟时钟小部件不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中将时钟应用小部件与系统时钟完美同步?