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应用程序小部件不起作用

Android小部件ListView项目点击不起作用

如何在 Android 中将时钟应用小部件与系统时钟完美同步?

我的 Android 小部件被杀死,“不再需要 bellander.andro ....”

Android 小部件更新不起作用

Android 小部件:skip_to_next 和 skip_to_previous 按钮不起作用