緋狐小屋

プログラミングとかの備忘録とかMtGとかのことを書ければ(別にもふもふはしない)

Xamarin.Formsで通知を出す(Android)(Prism.Forms使用)

Xamarin.FormsでAndroidに通知を出した際のメモ
※Prism.Forms使ってます(DependencyServiceの書き方がXamarin.Formsだけでやるのとちょい違うはずなので注意)


以下にブログで使用したコードをまとめたものを上げていますのでご活用ください。
github.com



とりあえずボタンを押すと通知が出る感じのアプリを作ります。

まずはViewから

NotificationPage.xaml

  <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
      <Button Text="Notification On"
            Command="{ Binding OnCommand }" />
      <Button Text="Notification Off"
              Command="{Binding OffCommand}" />
    </StackLayout>

ボタンが2つ並んでるだけの画面です


続いてViewModelです。
それぞれのボタンに対するコマンド紐づけます。

INotificationOnAndOffはDependencyService用のインターフェイスです。

※XFでやるならVMのコンストラクタ引数に何も書かずに

DependencyService.Get<INotificationOnAndOff>().NotificationOn();

みたいな感じでDependencyServiceを呼べた気がするけどあんま覚えてないので余力あったら書きます。※

NotificationPageViewModel.cs

namespace ArticleCodes.ViewModels
{
    public class NotificationPageViewModel : BindableBase
    {
        private INotificationOnAndOff _NotificationOnAndOff;

        public DelegateCommand OnCommand { get; private set; }
        public DelegateCommand OffCommand { get; private set; }

        public NotificationPageViewModel(INotificationOnAndOff NotificationOnAndOff)
        {
            _NotificationOnAndOff = NotificationOnAndOff;
            OnCommand = new DelegateCommand(() => _NotificationOnAndOff.NotificationOn());
            OffCommand = new DelegateCommand(() => _NotificationOnAndOff.NotificationOff());
        }
    }
}

DependencyServiceは共通プロジェクトからプラットフォーム固有の機能をよぶための仮実装のようなものです。
INotificationOnAndOffの中身は通知のONとOFFのみです。


INotificationOnAndOff.cs

namespace ArticleCodes.Models
{
    public interface INotificationOnAndOff
    {
        void NotificationOn();
        void NotificationOff();
    }
}

以上で共通プロジェクト側は終わりです。

続いてAndroidプロジェクトにINotificationOnAndOffの実態を書いていきます。

NotificationOnAndOff_Android.cs

[assembly: Dependency(typeof(INotificationOnAndOff_Android))]
namespace ArticleCodes.Droid
{
    public sealed class INotificationOnAndOff_Android : INotificationOnAndOff
    {
    // 通知のID
        int id = 0;

        public void NotificationOn()
        {
      // タップした際の遷移
            var context = Forms.Context;
            var intent = new Intent(context, typeof(MainActivity)); 
            var pendingIntent = PendingIntent.GetActivity(context, 0, intent, 0); 

            var n = new Notification.Builder(context)
                    .SetContentTitle("通知を出しました。")
                    .SetSmallIcon(Resource.Drawable.icon)
                    .SetContentText("ここは本文です。よろしくおねがいします。")
                    .SetOngoing(true) //常駐するかどうか
                    .SetContentIntent(pendingIntent)
                    .Build();

            var nm = (NotificationManager)context.GetSystemService(Context.NotificationService);
            nm.Notify(id, n);
        }

        public void NotificationOff()
        {
            var context = Forms.Context;
            var nm = (NotificationManager)context.GetSystemService(Context.NotificationService);
            nm.Cancel(id);
        }
    }
}

以上で終わりです。

実際の動作としては以下のようになります。

f:id:aki_lua87:20161107061850p:plain
NotificationOnのボタンを押すと


f:id:aki_lua87:20161107061855p:plain
通知が現れます。

以上です。