【问题标题】:Binding for Evernote's android-job绑定 Evernote 的 android-job
【发布时间】:2017-03-02 22:30:48
【问题描述】:

【问题讨论】:

    标签: xamarin xamarin.android


    【解决方案1】:

    GitHub 上 android-job 的 Xamarin 绑定

    这是什么?

    Xamarin Android-Job binding 允许您在 Android 上使用Evernote's android-job library,在后台高效而稳健地运行作业。该库检查客户端设备上的 Android 版本,以确定执行预定后台工作的最佳方法。它将使用最适合操作系统的方法,例如JobSchedulerGcmNetworkManagerAlarmManagerWorkManager

    使用方法:

    第 1 步:

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

    第 2 步:

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

    第 3 步:

    将以下内容添加到您的 Android 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();
    

    提示:

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

    来源和参考:

    【讨论】:

    • 嗨。感谢您花时间写这篇文章。
    • 你自己用过绑定吗?
    • 是的,我在写那篇文章之前就实现了它。它运作良好..
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多