xamarin – 绑定Evernote的android-job

有没有人为Evernote的
android-job
https://github.com/evernote/android-job工作?

Funnily Xamarin docs在一个例子中提到它:

https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/troubleshooting-bindings/#Problem_Name_Collisions_on_Inner_Classes_Properties

我试图遵循https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-an-aar/但它不会生成JobManager类

最佳答案 Xamarin绑定在GitHub上的android-job

它是什么?

Xamarin Android-Job binding允许您使用Evernote’s android-job library for Android,有效且稳健地在后台运行作业.库检查客户端设备上的Android版本,以确定执行预定后台工作的最佳方法.它将使用最合适的操作系统方法,如JobScheduler,GcmNetworkManager,AlarmManager或WorkManager.

如何使用它:

步骤1:

下载Xamarin binding for Evernote’s android-job library.

第2步:

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

第3步:

将以下内容添加到Application Manifest中的Application节点中,以使服务和接收器正常工作.

<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步:

为Job / s创建工厂方法:

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();

提示:

>在OnRunJob(…)方法中完成的工作应该是同步的,否则在完成所有工作之前不会返回结果.
>注意不要多次实例化同一个作业.利用在工作建设者SetUpdateCurrent,或检查作业是否已通过调用JobManager.Instance().GetAllJobRequestsForFlag(MyJob.TAG)存在.

信用与优惠参考:

>将android-job Xamarin.Android binding和Android Manifest配置说明归功于Dooks123.
> android-job libraryEvernote

点赞