LemonteaのUnity部屋

C#とかのお話です~

Xamarin.Forms AndroidのServiceでバックグラウンド処理

こんにちは。レモンティーです。

今回はAndroidのServiceを使ってみます。
(そもそもXamarin.Formsでやることか?という疑問はあります
というのもiOSのバックグラウンド処理が
DependencyServiceから使えるのか調べてないので
できない場合はFormsでやる意味なくなりますからね)

ちなみにDependencyServiceについては↓
sawalemounity.hatenablog.com
知らないネイティブの単語については↓
sawalemounity.hatenablog.com


やり方は

です。

Service作成

↓のようにIntentServiceを継承してServiceを作成します

 [Service]
    public class TestService:IntentService
    {
        public TestService() : base("TestService")
        {

        }

        protected override void OnHandleIntent(Intent intent)
        {
            //処理
        }
    }

[Service]をつけることでAndroidManifestに
手書きでサービスを書かなくてよくなります。

ベースクラスに渡している文字列は
ワーカースレッドの名前になります。

DependencyServiceからService開始

サービスをつくったら後は開始します。

サービスを開始するにはインテントを作成してそれを
StartServiceメソッドに渡します。

Intent intent = new Intent(Android.App.Application.Context,typeof(TestService));
Android.App.Application.Context.StartService(intent);

↑をDependencyServiceのAndroid実装部分に書けばOKです。
こんな感じです

[assembly:Dependency(typeof(DeviceServiceClass))]
namespace ServiceTestApp.Droid
{
    class DeviceServiceClass:IDeviceService
    {
        public void ServiceTest()
        {
            Intent intent = new Intent(Android.App.Application.Context,typeof(TestService));
            Android.App.Application.Context.StartService(intent);
        }

    }
}

*今回Android.App.Aplication.Contextとした部分は
Forms.Contextでも動きました。
そっちのほうがいいかも…。
___________________________

ちなみに
サービスをユーザーに通知したい場合は
ServiceのOnHandleIntentの中に
↓のように書けばOKです

Notification.Builder notificationBuilder = new Notification.Builder(Android.App.Application.Context)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentTitle("Test")
.SetContentText("This is a test notification!");

var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.Notify(NOTIFICATION_ID, notificationBuilder.Build());


今回はこれでおしまいです
sawalemounity.hatenablog.com

sawalemounity.hatenablog.com

sawalemounity.hatenablog.com