【发布时间】: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_width="match_parent"
android:layout_height="match_parent"
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 好的,但是怎么做?您可以发布一些代码以供参考吗?
标签: android android-intent widget android-widget clock