绑定Evernote的android-job

时间:2017-03-02 22:30:48

标签: xamarin xamarin.android

1 个答案:

答案 0 :(得分:2)

Xamarin在GitHub上为android-job绑定

这是什么?

通过Xamarin Android-Job binding,您可以利用Evernote's android-job library for Android,在后台高效,强大地运行作业。该库检查客户端设备上的Android版本,以确定执行计划的后台工作的最佳方法。它将对操作系统使用最合适的方法,例如JobSchedulerGcmNetworkManagerAlarmManagerWorkManager

如何使用它:

第1步:

下载Xamarin binding for Evernote's android-job library

第2步:

发布模式构建绑定项目,然后从android-job.dll文件夹中获取bin/release文件。将此 dll 添加到您自己的项目中,并引用它。

第3步:

Application 节点内的 Android清单中添加以下内容,以使服务和接收器正常工作。

<service android:name="com.evernote.android.job.v21.PlatformJobService" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE"/>
<service android:name="com.evernote.android.job.v14.PlatformAlarmService" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE"/>
<service android:name="com.evernote.android.job.v14.PlatformAlarmServiceExact" android:exported="false"/>
<receiver android:name="com.evernote.android.job.v14.PlatformAlarmReceiver" android:exported="false">
  <intent-filter>
    <!-- Keep the filter for legacy intents -->
    <action android:name="com.evernote.android.job.v14.RUN_JOB"/>
    <action android:name="net.vrallev.android.job.v14.RUN_JOB"/>
  </intent-filter>
</receiver>
<receiver android:name="com.evernote.android.job.JobBootReceiver" android:exported="false">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
    <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
  </intent-filter>
</receiver>
<service android:name="com.evernote.android.job.gcm.PlatformGcmService" android:enabled="false" android:exported="true" android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
  <intent-filter>
    <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
  </intent-filter>
</service>
<service android:name="com.evernote.android.job.JobRescheduleService" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE"/>

此外,请确保您具有以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

第4步:

确保您的项目中有以下引用(可以通过Nuget进行安装):

  • Xamarin.Android.Support.Compat
  • Xamarin.Android.Support.v4
  • Xamarin.GooglePlayServices.Gcm (不是必需的,但可以更好地工作并支持更多设备)

第5步:

为您的作业创建一个计划的班级:

提示: 有关配置不同类型的作业(例如周期性,一次性等)的示例,请参考android-job GitHub page

using Com.Evernote.Android.Job;

namespace MyNamespace
{
    public class MyJob : Job
    {

        public const String TAG = "job_myjob_tag";

        protected override Result OnRunJob(Params parameters)
        {
            // run your job here   
            return Result.Success;
        }

        public static void ScheduleJob()
        {
            new JobRequest.Builder(MyJob.TAG)
                .SetRequiresDeviceIdle(false)
                .SetRequiredNetworkType(JobRequest.NetworkType.Connected)
                .SetPeriodic(900000, 300000)
                .SetUpdateCurrent(true)
                .Build()
                .Schedule();
        }

        private void CancelJob(int jobId)
        {
            JobManager.Instance().Cancel(jobId);
        }

    }
}

第6步:

为您的工作创建工厂方法:

using Com.Evernote.Android.Job;

namespace MyNamespace
{
    public class MyJobCreator : Java.Lang.Object, IJobCreator
    {
        public Job Create(string tag)
        {
            switch (tag)
            {
                case MyJob.TAG:
                    return new MyJob();
                default:
                    return null;
            }
        }

    }
}

第7步:

初始化JobManager单例,最好在您的GlobalApplication.OnCreate方法中。如果不能,则有alternative

JobManager.Create(this).AddJobCreator(new MyJobCreator());

第8步:

安排您的工作!您可以从您的开始活动OnCreate方法或任何您喜欢的地方执行此操作。例如:

MyNamespace.MyJob.ScheduleJob();

提示:

  1. OnRunJob(...)方法中完成的工作应该是同步的,否则在完成所有工作之前不返回Result
  2. 请注意不要多次实例化同一作业。使用作业生成器上的SetUpdateCurrent,或通过调用JobManager.Instance().GetAllJobRequestsForFlag(MyJob.TAG)来检查作业是否已经存在。

信用与参考: