我正在使用Xamarin.Forms,我正在实现推送通知。我在两个平台上都接受了推送,我可以创建一个Toast通知,并且我可以在点击通知时触发代码。
我正在尝试在点击Toast通知时将应用页面更改为特定页面,我可以成功完成,但是如果应用程序在后台,它会在后台更改页面并且不会不要将应用程序重新聚焦到用户可以看到的位置。如何将应用程序带回前台?
答案 0 :(得分:1)
如何将应用程序带回前台?
您可以查看官方文档:Starting an Activity from a Notification。
基本上我们需要创建一个PendingItent
对象并将其与通知相关联,当用户点击通知时,Android会启动PendingIntent
指定的活动。在构建通知时,请使用SetContentIntent
方法添加PendingItent
:
Notification.Builder builder = new Notification.Builder(this)
.SetContentIntent (pendingIntent)
...
如果您想在使用时点击通知导航到其他活动,则可能需要管理后台堆栈。该文件也对此进行了解释。此外,您还可以查看此官方样本:Android Local Notifications Sample。
但是既然您已经使用XF来构建您的应用,那么Android平台只有MainAcitivty
,您还需要在Android平台中实现此功能并使用DependencyService
来调用它来自PCL,例如:
在PCL:
public interface ISendNotification
{
void SendLocalNotification();
}
在Android平台中:
[assembly: Xamarin.Forms.Dependency(typeof(SendNotification))]
namespace NAMESPACE.Droid
{
public class SendNotification : ISendNotification
{
private static readonly int ButtonClickNotificationId = 1000;
private Context context = Xamarin.Forms.Forms.Context;
private int count;
public void SendLocalNotification()
{
Bundle valuesForActivity = new Bundle();
valuesForActivity.PutInt("count", count);
//When use XF, Android has only MainActivity, other pages are all rendered in MainActivity
Intent intent = new Intent(context, typeof(MainActivity));
intent.PutExtras(valuesForActivity);
PendingIntent resultPendingIntent = PendingIntent.GetActivity(Xamarin.Forms.Forms.Context, 0, intent, PendingIntentFlags.OneShot);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.SetAutoCancel(true)
.SetContentIntent(resultPendingIntent)
.SetContentTitle("Button Clicked")
.SetNumber(count)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentText(String.Format("The button has been clicked {0} times.", count));
NotificationManager notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
notificationManager.Notify(ButtonClickNotificationId, builder.Build());
count++;
}
}
}
要导航到其他页面,您可以在MessagingCenter
中使用MainActivity
,例如:
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
if (Intent.Extras != null)
{
int count = Intent.Extras.GetInt("count", -1);
var navipage = App.Current.MainPage as NavigationPage;
var mainpage = navipage.CurrentPage as MainPage;
MessagingCenter.Send<MainPage, int>(mainpage, "count", count);
}
}
在您的MainPage
PCL导航到其他页面:
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<MainPage, int>(this, "count", (sender, arg) =>
{
Navigation.PushAsync(...);
});
}
顺便说一句,你可以这样称呼SendNotification
:
DependencyService.Get<ISendNotification>().SendLocalNotification();
答案 1 :(得分:0)
所以你想在进入后台之前把应用程序放在页面的前台吗?那么你我认为你必须知道应用程序的当前页面。
如果App类的MainPage属性是NavigationPage,则可以像这样获取当前页面
var navPage = App.Current.MainPage as NavigationPage;
var currentPage = navPage.CurrentPage;
否则你可以像那样访问
var currentPage;
if (Application.Current.MainPage.Navigation.NavigationStack.Count > 0)
{
int index = Application.Current.MainPage.Navigation.NavigationStack.Count - 1;
currentPage = Application.Current.MainPage.Navigation.NavigationStack[index];
}
在为通知创建PendingIntent之后,您可以将附加内容附加到Intent,您将在MainActivity中处理以打开页面的新实例。
Intent intent = new Intent(this, typeof(MainActivity));
intent.PutExtra("currentpage", currentPage.ToString());
并在MainActivity中
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
// If the user tapped a notification when the app was in background
if (Intent.Extras != null)
{
string currentPage = Intent.Extras.GetString("currentpage");
// Handle the opening of the page
}
}
要从MainActivity打开页面,您只需再次获取应用程序的当前页面(此时应该是默认页面),然后导航到您想要的页面。
我没有真正尝试过,但我认为它应该有用。
答案 2 :(得分:0)
Forms.Context.StartActivity((Xamarin.Forms.Forms.Context as Activity).Intent);