android - 我正在制作一个简单的 Dashclock 日历扩展,但它停止了更新

标签 android service dashclock

我正在制作一个基本的 Dashclock 扩展,它轮询 CalendarContract.Events 以获取同步到用户设备的所有日历事件的列表,检索计划最快发生的事件,并发布时间、标题、位置和说明。这是我的代码:

public class FullCalService extends DashClockExtension {
    public static final String[] FIELDS = { Events._ID, Events.TITLE,
            Events.ALL_DAY, Events.EVENT_LOCATION, Events.DTSTART,
            Events.EVENT_TIMEZONE, Events.DESCRIPTION };

    public FullCalService() {
    }

    @Override
    protected void onUpdateData(int arg0) {
        TimeZone tz = TimeZone.getDefault();
        long currentTimeMillis = Calendar.getInstance().getTimeInMillis() - tz.getRawOffset();
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
        Cursor c;
        if (prefs.getBoolean("allDayAllowed", false)) {
            c = getContentResolver().query(
                    Events.CONTENT_URI,
                    FIELDS,
                    new StringBuilder().append("(").append(Events.DTSTART)
                            .append(" >= ?)").toString(),
                    new String[] { Long.toString(currentTimeMillis) },
                    Events.DTSTART, null);
        } else {
            c = getContentResolver().query(
                    Events.CONTENT_URI,
                    FIELDS,
                    new StringBuilder().append("((").append(Events.ALL_DAY)
                            .append("= ?) AND (").append(Events.DTSTART)
                            .append(" >= ?))").toString(),
                    new String[] { Integer.toString(0),
                            Long.toString(currentTimeMillis) }, Events.DTSTART,
                    null);
        }
        if (c.moveToFirst()) {
            long eventTimeMillis = c.getLong(c.getColumnIndex(Events.DTSTART));
//          if (tz.inDaylightTime(new Date(eventTimeMillis))) {
//              eventTimeMillis += tz.getDSTSavings();
//          }
            //Log.d("DesCal service", "Value of hoursToReveal: "+prefs.getString("hoursToReveal", "1"));
            if (eventTimeMillis < currentTimeMillis + 360000
                    * Integer.parseInt(prefs.getString("hoursToReveal", "1"))) {
                String title = c.getString(c.getColumnIndex(Events.TITLE));
                String loc = c.getString(c
                        .getColumnIndex(Events.EVENT_LOCATION));
                String time = DateUtils.formatDateTime(this, eventTimeMillis,
                        DateUtils.FORMAT_SHOW_TIME);
                String desc = c.getString(c.getColumnIndex(Events.DESCRIPTION));
                StringBuilder expandedBody = new StringBuilder(time);
                if (!loc.isEmpty()){
                    expandedBody.append(" - ").append(loc);
                }
                expandedBody.append("\n").append(desc);
                String uri = new StringBuilder(
                        "content://com.android.calendar/events/").append(
                        c.getLong(c.getColumnIndex(Events._ID))).toString();
                publishUpdate(new ExtensionData()
                        .visible(true)
                        .status(time)
                        .expandedTitle(title)
                        .expandedBody(expandedBody.toString())
                        .icon(R.drawable.ic_dash_cal)
                        .clickIntent(
                                new Intent(Intent.ACTION_VIEW, Uri.parse(uri))));
                c.close();
            } else {
                publishUpdate(new ExtensionData().visible(false));
                c.close();
            }
        } else {
            publishUpdate(new ExtensionData().visible(false));
            c.close();
        }
    }
}

首次安装时,它似乎运行良好。但是, Activity 开始后,就不会抢到任何 future 的 Activity 了。扩展程序不会自行刷新是否有原因?

最佳答案

您如何触发进一步的更新?您需要手动指定何时调用 onUpdateData,例如当内容提供商发生变化时,或者当屏幕打开时,等等。默认情况下,扩展程序仅每 30 分钟左右刷新一次。查看 built in calendar extension 的来源例如代码。

关于android - 我正在制作一个简单的 Dashclock 日历扩展,但它停止了更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19261805/

相关文章:

java - 查询表时出现问题: No such column

c - OpenSSL 不会释放文件句柄

c++ - 无法启动 C++ Windows 服务

android - android中如何从BroadcastReceiver发送数据到Fragment

java - 如何在 Dashclock 扩展中维护持久的 BroadcastReceiver?

android - Dashclock 小部件示例扩展无法实例化服务

android - 如何将 16 位 .wav 音频文件读入适合写入 Android AudioTrack 的缓冲区?

java - Libgdx:使用 BitmapFont 的不同位置

android - Dashclock 小部件扩展未更新

android - 不同的对象