Xamarin.Forms AndroidでJobIntentServiceを使う方法

今回はXamarin.Forms (Android)でJobIntentServiceを使う方法について解説します。

では、早速実装方法についてです。

ネームスペースなどは適宜置き換えてください。

1.共通プロジェクトにインターフェース定義

using System;
namespace TestPrj {
    public interface IDevJobIntentService {
        void StartJobIntentService();
    }
}

2.Androidプロジェクトにインターフェースを実装

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Xamarin.Essentials;
using Xamarin.Forms;

[assembly: Dependency(typeof(TestPrj.Droid.DevJobIntentService))]
namespace TestPrj.Droid {
    public class DevJobIntentService : IDevJobIntentService {
        public void StartJobIntentService() {
            var intent = new Intent(Platform.CurrentActivity, typeof(MyJobIntentService));
            intent.PutExtra("Text", "テキスト!!");
            MyJobIntentService.EnqueueWork(Platform.CurrentActivity, intent);
        }
    }
}

3.Androidプロジェクトにサービスを作成

using System;
using System.Threading;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Support.V4.App;

namespace TestPrj.Droid {
    [Service(Name = "com.comcompanny.testprj.MyJobIntentService", Permission = "android.permission.BIND_JOB_SERVICE", Exported = true)]
    public class MyJobIntentService : JobIntentService {
        public MyJobIntentService() {}
 
        const int JOB_ID = 1001;

        public static void EnqueueWork(Context context, Intent work) {
            EnqueueWork(context, Java.Lang.Class.FromType(typeof(MyJobIntentService)), JOB_ID, work);
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId) {
            System.Diagnostics.Debug.WriteLine("MyJobIntentService OnStartCommand");
            return base.OnStartCommand(intent, flags, startId);
        }

        public override void OnCreate() {
            System.Diagnostics.Debug.WriteLine("MyJobIntentService OnCreate");
            base.OnCreate();
        }

        public override void OnDestroy() {
            System.Diagnostics.Debug.WriteLine("MyJobIntentService OnDestroy");
            base.OnDestroy();
        }

        protected override void OnHandleWork(Intent p0) {
            var txt = p0?.GetStringExtra("Text");
            System.Diagnostics.Debug.WriteLine("MyJobIntentService OnHandleIntent:" + txt);
            for (int i = 0; i < 10; i++) {
                Thread.Sleep(1000);
                System.Diagnostics.Debug.WriteLine(i);
            }
        }
    }
}

4.AndroidManifestの設定

applicationタグの中に

<service android:name="com.comcompanny.testprj.MyJobIntentService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" />

を指定し、ユーザーーパーミッションに

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

を追加

5.共通プロジェクトでDependencyServiceを使い処理を呼び出す

DependencyService.Get().StartJobIntentService();

6.Androidのプロジェクト設定の「迅速なアセンブリの配置」のチェックを外します。これをしないとなぜかビルドが通らないのでので要注意です。

これで実装は完了になります。

タイトルとURLをコピーしました