記事一覧

Androidの通知にアクションボタンを表示して処理を分岐する方法 | Xamarin.Forms


今回はAndroidで通知にアクションボタンを表示する方法についてご紹介いたします。アクションボタンを押下した際には押下したボタンの種類に応じて処理を分岐することができます。通知からアプリを開いたり、メールを送信したり、データを送受信したり、様々な用途が想定できますね。


xamarin_notification_android_action_01.png


前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10



1.定数の定義

BroadcastReceiverでアクションを識別する為の文字列を定数化します。任意のディレクトリに実装します。

Namespace AppName.Models.ConstantValues
{
    public static class IntentAction
    {
        public const string Open = "com.CompanyName.AppName.Notification.Open";
        public const string Close = "com.CompanyName.AppName.Notification.Close";
    }
public static class RequestCode
{
public const int Notification = 12345; //重複しない任意の数字
}
}

定数の値(文字列)はインテントフィルターで使用することから、他のアプリも含めて重複しない値とすることが望ましいと思います。
尚、PendingIntentに渡すRequestCodeも通知毎に可変すると通知毎に異なるExtraを渡すことができます。



2.通知の処理

以前の記事のAndroidの通知の処理に以下の記述を追加するだけでアクションボタンが表示されます。

NotificationService.cs
NotificationManager manager = (NotificationManager)_context.GetSystemService(Context.NotificationService);

//Actionボタン(開く)
Intent openIntent = new Intent();
openIntent.SetAction(AppName.Models.ConstantValues.IntentAction.Open);
openIntent.PutExtra("NotifyId", id.ToString());    //通知を削除するためにパラメータとして通知IDを渡す
PendingIntent pendingIntentOpen = PendingIntent.GetBroadcast(_context, RequestCode.Notification, openIntent, PendingIntentFlags.UpdateCurrent);
builder.AddAction(Resource.Drawable.notify_list, "Open", pendingIntentOpen);

//Actionボタン(閉じる)
Intent closeIntent = new Intent();
closeIntent.SetAction(AppName.Models.ConstantValues.IntentAction.Close);
closeIntent.PutExtra("NotifyId", id.ToString());    //通知を削除するためにパラメータとして通知IDを渡す
PendingIntent pendingIntentClose = PendingIntent.GetBroadcast(_context, RequestCode.Notification, closeIntent, PendingIntentFlags.UpdateCurrent);
builder.AddAction(Resource.Drawable.notify_close, "Close", pendingIntentClose);

//通知を表示
manager.Notify(id, notification);
           

※アクションボタンのアイコンサイズについて
30~40pixelの画像解像度で作成します。大きすぎるとボタンからはみ出た部分は表示されません。縮小もされませんので、サイズを考慮して作成すると良いでしょう。(Androidプロジェクト\Resouece\Drawableフォルダに保存します。)



3.アクションを受け取る

BroadcastReceiverを継承したクラスを作成し、インテントを受信します。
intent.Actionに通知時に設定したActionボタンの文字列が取得できますので、その内容に応じて処理を分岐します。

NotificationReceiver.cs
using System;
using Android.App;
using Android.Content;
namespace AppName.Droid.Models
{
    [BroadcastReceiver]
    [IntentFilter(new[] { AppName.Models.ConstantValues.IntentAction.Open,
                          AppName.Models.ConstantValues.IntentAction.Close,
    })]
    public class NotificationReceiver : BroadcastReceiver
    {
        //通知のアクションボタン押下の処理を受信します。
        public override void OnReceive(Context context, Intent intent)
        {
            //アクションに基づき動作させる
            if (intent.Action == AppName.Models.ConstantValues.IntentAction.Open)
            {
//Openボタンを押下した場合
                //特定のページを開く
                Xamarin.Forms.Page page = ((Xamarin.Forms.MasterDetailPage)((AppName.Views.StartPage)(App.Instance.MainPage))).Detail;
                page.Navigation.PopToRootAsync();
                page.Navigation.PushAsync(new TestPage());
            }
            //else if (intent.Action == AppName.Models.ConstantValues.IntentAction.Close)
            //{
// //Closeボタンを押下した場合の処理を実装する
            //}

            //通知を削除する
            if (intent.HasExtra("NotifyId"))
            {
                int notifyId = 0;
                if (int.TryParse(intent.GetStringExtra("NotifyId"), out notifyId))
                {
                    NotificationManager manager = (NotificationManager)context.GetSystemService(Context.NotificationService);
                    manager.Cancel(notifyId);
                }
            }

            //表示されている通知領域(通知バー)を消す
            Intent dialogIntent = new Intent(Intent.ActionCloseSystemDialogs);
            context.SendBroadcast(dialogIntent);
        }
    }
}

※特定のページを開くにはアプリが起動していることが前提です。アプリが起動しているかどうか確認して起動する方法は以前の記事にてご確認できます。
※GetStringExtraで他の通知と重複した値しか取得できない場合はRequestCodeを通知毎に可変させましょう。


通知にアクションボタンを追加して処理を分岐する方法は以上で実装が可能です。
分岐した際にPCLの関数を呼び出すなどして共通化を図った方がメンテナンス性は向上しますね。




最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。