我正在使用Xamarin来创建Android应用程序,但我坚持使用通知。
我要实现的目标:
问题:
出现通知,我关闭该应用程序(只需将其从“最近使用的应用程序”屏幕上滑开),然后点击通知按钮-没有任何反应。如果我点击通知正文-应用将打开,但是我需要使用这些按钮执行一些操作。
这是我的一些源文件:
MainActivity.cs
nums[ix-1]
AlarmReceiver.cs
ix
AnswerReciever.cs
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
AnswerReciever receiver;
public static long reminderInterval = 30 * 1000; //every 30 seconds for test
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CreateNotificationFromIntent(Intent);
receiver = new AnswerReciever();
//trying to schedule notification for specific time of the day
var alarmIntent = new Intent(this, typeof(AlarmReceiver));
var pending = PendingIntent.GetBroadcast(this, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
var alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
alarmManager.SetInexactRepeating(AlarmType.RtcWakeup, FirstReminder(), reminderInterval, pending);
}
public static long FirstReminder()
{
var dt = DateTime.Now;
//dt = dt.Date.AddHours(22).AddMinutes(00).AddSeconds(0);
//TODO set from user settings
var timestamp = (long)(dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
return timestamp;
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnNewIntent(Intent intent)
{
CreateNotificationFromIntent(intent);
}
protected override void OnResume()
{
try
{
UnregisterReceiver(receiver);
}
catch (IllegalArgumentException) { }
RegisterReceiver(receiver, new IntentFilter(Constants.ANDROID_NOTIFICATION_ACTION));
base.OnResume();
}
protected override void OnDestroy()
{
UnregisterReceiver(receiver);
base.OnDestroy();
}
protected override void OnPause()
{
base.OnPause();
}
void CreateNotificationFromIntent(Intent intent)
{
if (intent?.Extras != null)
{
string title = intent.Extras.GetString(AndroidNotificationManager.TitleKey);
string message = intent.Extras.GetString(AndroidNotificationManager.MessageKey);
DependencyService.Get<INotificationManager>().ReceiveNotification(title, message);
}
}
}
AndroidNotificationManager.cs
[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
DependencyService.Get<INotificationManager>().ScheduleNotification(Constants.NOTIFICATION_TITLE, Constants.NOTIFICATION_TEXT);
}
}
我创建了一个示例项目来重现我的问题(如果有帮助的话):https://github.com/Immelstorn/NotificationsTest