【问题标题】:Oreo Calendar changes奥利奥日历变化
【发布时间】:2018-04-03 06:28:58
【问题描述】:

我曾经在清单中使用此代码获取日历更改:

    <receiver android:name=".MyReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PROVIDER_CHANGED" />
            <data android:scheme="content" />
            <data android:host="com.android.calendar" />
        </intent-filter>
    </receiver>

但这在 Android 8 Oreo 上是不可能的。我读过它需要工作或类似的东西(我还没有使用过工作,我不需要它们)。每次日历发生变化时,任何一种类型的工作都可以被解雇吗?就像我上面的代码用于使用那个简单的广播接收器一样。

【问题讨论】:

  • This sample app 监控ContactsContract 的变化。您需要对其进行调整以监控 CalendarContract 的变化。
  • 感谢您的帮助,我得以解决。我写解决方案来帮助别人。

标签: android android-calendar android-8.0-oreo


【解决方案1】:

感谢 CommosWare 的提示,我能够做到。我在这里输入完整的代码:

清单文件:

<service android:name=".MyReceiverAsJob"
         android:permission="android.permission.BIND_JOB_SERVICE" />

文件 MyReceiverAsJob.java:

package my.package;        
import android.annotation.TargetApi;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.provider.CalendarContract;
import android.widget.Toast;


@TargetApi(Build.VERSION_CODES.N)
public class MyReceiverAsJob extends JobService {
    private static final int iJobId = 1005; //Job Id
    final Handler mHandler = new Handler(); //Just to display Toasts

    static void schedule(Context oContext) {    
        ComponentName oComponentName = new ComponentName(oContext, clsJobServiceRecibidorDeGoogleCalendar.class);
        JobInfo.Builder oJobInfoBuilder = new JobInfo.Builder(ME_MYSELF_AND_I, oComponentName);
        final Uri CALENDAR_URI = Uri.parse("content://" + CalendarContract.AUTHORITY + "/");
        oJobInfoBuilder.addTriggerContentUri(new JobInfo.TriggerContentUri(CalendarContract.CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
        oJobInfoBuilder.addTriggerContentUri(new JobInfo.TriggerContentUri(CALENDAR_URI, 0));
        JobScheduler jobScheduler = (JobScheduler) oContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobScheduler.schedule(oJobInfoBuilder.build());
    }


    @Override
    public boolean onStartJob(JobParameters params) {

        DisplayToast("Calendar has been modified. Do some work!");

        schedule(this); //Reschedule to receive future changes
        return (false);
    }


    @Override
    synchronized public boolean onStopJob(JobParameters params) {
        return (false);
    }


    void DisplayToast(final CharSequence text) {
        mHandler.post(new Runnable() {
            @Override public void run() {
                Toast.makeText(clsJobServiceRecibidorDeGoogleCalendar.this, text, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

我从前台服务中这样调用它:

MyReceiverAsJob.schedule(this);

它可以工作,但有时它会在日历中没有任何更改的情况下被调用。如果我做错了什么,请告诉我。

【讨论】:

  • clsJobServiceRecibidorDeGoogleCalendar 类是什么?