今回は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のプロジェクト設定の「迅速なアセンブリの配置」のチェックを外します。これをしないとなぜかビルドが通らないのでので要注意です。
これで実装は完了になります。