コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
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; //重複しない任意の数字
}
}
NotificationManager manager = (NotificationManager)_context.GetSystemService(Context.NotificationService);
//Actionボタン(開く)
Intent openIntent = null;
PendingIntent pendingIntentOpen = null;
if (Build.VERSION.SdkInt < BuildVersionCodes.S)
{
openIntent = new Intent(_context, typeof(AppName.Droid.Models.NotificationReceiver)); //明示的インテント
openIntent.SetAction(AppName.Models.ConstantValues.IntentAction.Open);
openIntent.PutExtra("NotifyId", id.ToString()); //通知を削除するためにパラメータとして通知IDを渡す
pendingIntentOpen = PendingIntentWrapper.GetBroadcast(_context, RequestCode.Notification + id, openIntent, PendingIntentFlags.UpdateCurrent);
}
else
{
openIntent = new Intent(_context, typeof(MainActivity));
openIntent.SetAction(AppName.Models.ConstantValues.IntentAction.Open);
openIntent.SetFlags(ActivityFlags.ClearTask |
ActivityFlags.ClearTop |
ActivityFlags.NewTask |
ActivityFlags.SingleTop);
openIntent.PutExtra("NotifyId", id.ToString()); //通知を削除するためにパラメータとして通知IDを渡す
pendingIntentOpen = PendingIntentWrapper.GetActivity(_context, RequestCode.Notification + id, openIntent, PendingIntentFlags.UpdateCurrent);
}
builder.AddAction(Resource.Drawable.notify_list, "Open", pendingIntentOpen);
//Actionボタン(閉じる)
//Intent closeIntent = new Intent(); //暗黙的インテント
Intent closeIntent = new Intent(Android.App.Application.Context, typeof(AppName.Droid.Models.NotificationReceiver)); //明示的インテント
closeIntent.SetAction(AppName.Models.ConstantValues.IntentAction.Close);
closeIntent.PutExtra("NotifyId", id.ToString()); //通知を削除するためにパラメータとして通知IDを渡す
PendingIntent pendingIntentClose = PendingIntentWrapper.GetBroadcast(_context, RequestCode.Notification, closeIntent, PendingIntentFlags.UpdateCurrent);
builder.AddAction(Resource.Drawable.notify_close, "Close", pendingIntentClose);
//通知を表示
manager.Notify(id, notification);
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 (Build.VERSION.SdkInt < BuildVersionCodes.S &&
intent.Action == AppName.Models.ConstantValues.IntentAction.Open)
{
//Openボタンを押下した場合
//特定のページを開く
NotificationReceiver.SetPage();
}
if (Build.VERSION.SdkInt < BuildVersionCodes.S ||
intent.Action == AppMame.Models.ConstantValues.IntentAction.Close)
//Android11以下またはCloseボタンを押下した場合
//通知IDを取得する
int notifyid = intent.GetIntExtra("NotifyId", 0);
//通知を削除する
NotificationReceiver.CancelNotification(context, notifyId);
}
//Android12(S)からBROADCAST_CLOSE_SYSTEM_DIALOGSがパーミッションが必要になり、特定のアプリのみに許可されるため。 if (Build.VERSION.SdkInt < BuildVersionCodes.S) { //表示されている通知領域(通知バー)を消す Intent dialogIntent = new Intent(Intent.ActionCloseSystemDialogs); context.SendBroadcast(dialogIntent); }
}
/// <summary>
/// アプリ起動時の設定(MainActivityからコール)
/// </summary>
/// <param name="context"></param>
/// <param name="intent"></param>
public static void OnActivityStarted(Android.Content.Context context, Intent intent)
{
//通知IDを取得する
string notifyId = intent?.Extras?.GetString("NotifyId");
int id = 0;
if (!string.IsNullOrEmpty(notifyId))
{
int.TryParse(notifyId, out id);
}
if (id > 0)
{
//イベントトラン画面を表示する
NotificationReceiver.SetEventTranPage();
//通知を削除する
NotificationReceiver.CancelNotification(context, id);
}
}
/// <summary>
/// 特定の画面を表示する
/// </summary>
private static void SetPage()
{
//特定のページを開く
Xamarin.Forms.Page page = ((Xamarin.Forms.MasterDetailPage)((AppName.Views.StartPage)(App.Instance.MainPage))).Detail;
page.Navigation.PopToRootAsync();
page.Navigation.PushAsync(new TestPage());
}
/// <summary>
/// 通知を削除する
/// </summary>
/// <param name="context"></param>
/// <param name="id"></param>
public static void CancelNotification(Android.Content.Context context, int id)
{
//通知を削除する
NotificationManager manager = (NotificationManager)context.GetSystemService(Android.Content.Context.NotificationService);
manager.Cancel(id);
}
}
}
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
//ローカル通知からの呼び出し
Task.Run(() =>
{
//Android12の場合はPendingIntentからの呼び出しなので、ここから通知に関する動作を実行します。
NotificationReceiver.OnActivityStarted(this, this.Intent);
}).ConfigureAwait(false);
}
}
}
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installlocation="internalOnly" package="com.Company.AppName"> <uses-sdk android:targetsdkversion="31" /> <uses-permission android:name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS" /> </manifest>
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。