2017-06-12 54 views
0

我目前正在一個項目中,我收到設備上的推送通知,並且在貼上通知時應該打開一個特定的頁面。Xamarin表單PushAsync打開一個空白頁面

我想它在Android 5.1,但是當我點擊該通知,它首先打開的頁面並且之後它會打開一個空白頁,任何內部消除導航欄,我不明白爲什麼...

這裏是我的代碼:

當我收到Android上的消息我執行以下操作:

Intent intent = new Intent(this, typeof(MainActivity)); 
intent.PutExtra("key", "message"); 
PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot); 

Notification notif = new Notification.Builder(this) 
         .SetSmallIcon(Resource.Drawable.icon) 
         .SetContentTitle("Alert") 
         .SetContentText("alert message") 
         .SetAutoCancel(true) 
         .SetDefaults(NotificationDefaults.Sound | NotificationDefaults.Vibrate) 
         .SetContentIntent(pendingIntent) 
         .SetPriority((int)NotificationPriority.High) 
         .Build(); 

NotificationManager notificationManager = (NotificationManager)GetSystemService(Context.NotificationService); 
notificationManager.Notify(0, notif); 

當錄音它打開其執行以下操作在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); 
    if (app == null) 
     app = new App(); 
    LoadApplication(app); 

    // If the user tapped a notification 
    if (Intent.Extras != null) 
    { 
     Data data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key")); 
     MessagingCenter.Send<Data>(data, "Show data"); 
    } 
} 

最後我有做這樣的數據頁(套作爲應用程序的的MainPage,一個NavigationPage內):

public DataPage() 
{ 
    MessagingCenter.Subscribe<Data>(this, "Show data", (sender) => 
    { 
     await Navigation.PushAsync(new DataDetail(sender)); 
    }); 
} 

我真的不明白爲什麼這不能正常工作...... 特別是因爲如果我這樣做

await Xamarin.Forms.Application.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(new DataPage(data))); 

而創建的數據頁的第二構造函數:

DataPage(Data data) 
{ 
    await Navigation.PushAsync(new DataDetail(data)); 
} 

它工作正常。 (但我不喜歡這樣做,看起來很......不好聽)

回答

0

我可以勉強理解之間的連接您的Data,你DataDetail,你DataPage和你MainPage

在我身邊,我覺得Data就像是基於你的代碼Data data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key"));的數據模型,但這個類中,你的代碼await Navigation.PushAsync(new DataDetail(data));,哪裏該Navigation從何而來?

沒關係,我想你有一個MainPage包裝NavigationPage,你想要導航到你的DataPage當你點擊通知。如果是這樣,那麼你的Notification部分沒有問題。

要顯示的數據在你DetailPage,你可以創建一個構造函數參數,例如:

public partial class DataPage : ContentPage 
{ 
    public DataPage() 
    { 
     InitializeComponent(); 
    } 

    public DataPage(int count) 
    { 
     InitializeComponent(); 
     //set the data to the UI 
     label.Text = "This is Count: " + count; 
    } 
} 

您可以創建在MainPageNavigation一個實例,因此可以將其在Data類中使用:

public static INavigation Navi; 

public MainPage() 
{ 
    InitializeComponent(); 
    Navi = this.Navigation; 
} 

然後我Data類是如下簡單:

public class Data 
{ 
    public Data() 
    { 
     MessagingCenter.Subscribe<Data>(this, "show data", (sender) => 
     { 
      MainPage.Navi.PushAsync(new DataPage(this.Count)); 
     }); 
    } 

    public int Count { get; set; } 
} 

最後在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 data = new Data() { Count = count }; 
     MessagingCenter.Send<Data>(data, "show data"); 
    } 
} 

因爲您可以根據需要修改Data類。以下是我的演示的渲染圖像:

enter image description here

更新:

根據我們的討論,您的信息將直接發送到DataPage,然後在App類PCL,包裝這個DataPageNavigationPageMainPage = new NavigationPage(new DataPage());

在這樣的MainAcitvity發送消息:

if (Intent.Extras != null) 
{ 
    int count = Intent.Extras.GetInt("count", -1); 
    var data = new Data() { Count = count }; //fake data, change it to your data 

    var navipage = App.Current.MainPage as NavigationPage; 
    var datapage = navipage.CurrentPage as DataPage; 
    MessagingCenter.Send<DataPage, Data>(datapage, "show data", data); 
} 

而在DataPage

public DataPage() 
{ 
    InitializeComponent(); 
    MessagingCenter.Subscribe<DataPage, Data>(this, "show data", (sender, arg) => 
    { 
     Navigation.PushAsync(new DataDetail(arg)); 
    }); 
} 

當然,我們需要在DataDetail創建一個導師帶參數:

public DataDetail(Data data) 
{ 
    InitializeComponent(); 
} 
+0

哦對不起我做了一個錯字。 ..訂閱消息中心消息「顯示數據」的類是DataPage,它是項目的MainPage。 我在構造函數中犯了一個錯誤,它應該是 public DataPage() { MessagingCenter.Subscribe(...); } 而且因爲我的數據頁的IS的MainPage,裹在NavigationPage這樣 公共應用程序(){ ... =的MainPage新NavigationPage(新數據頁); .... } 它看起來像你在那裏展示的,但它不能正常工作 – Alhyoss

+0

所以要清楚:我的MainPage是DataPage,它被包裹在一個NavigationPage中並顯示一個綁定到數據列表的ListView(但它似乎與問題無關)。然後DataDetail是一個頁面,詳細顯示了一個特定的數據,就像你說的一個模型類一樣。 因此,DataPage()中的await導航對我來說似乎是合法的。 – Alhyoss

+0

@Simon,是的,但是你的消息中心發送消息給'Data'類,在那個類中,應該沒有'Navigation'屬性。這就是爲什麼我在'MainPage'中使用了一個'Navigation'實例。因此,您的要求是從通知中獲取數據並將其顯示在「DataPage」中,並且您的數據頁面是「NavigationPage」的根頁面,對嗎? 'DataDetail'在這裏是不相關的? –

0

所以我終於解決了這個問題。 它似乎是由於我在MainActivity中創建一個靜態App變量以便僅創建一次而造成的。

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    static App app; 

    protected override void OnCreate(Bundle bundle) 
    { 
     ... 
     if(app == null) 
      app = new App(); 
     ... 
    } 
} 

我這樣做是因爲否則應用程序實例的Current.Properties被重置。

現在我改變了,我不再有這個問題: 我調用Current.SavePropertiesAsync()來保存Current.Properties,因此我可以在MainActivity中刪除App的靜態實例。它解決了空白頁問題。

但這造成了另一個問題。當我點擊通知時,它第一次正常工作,但在此之後,它多次打開請求的頁面(第二次通知點擊打開2頁,第三次打開3,...)。我不明白它爲什麼這樣做,但它似乎是由MessagingCenter引起的。所以我刪除MessagingCenter部分,只是在MainActivity這樣做:

if (Intent.Extras != null) 
{ 
    Data data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key")); 
    DataPage currentPage = (DataPage)((NavigationPage)App.Current.MainPage).CurrentPage; 
    currentPage.OpenDataDetails(data); 
} 

而在數據頁我有這個功能

public async void OpenDataDetails(Data data) 
{ 
    await Navigation.PushAsync(new DataDetail(data)); 
} 

這樣確實不如預期,所以現在我很高興。

不過,我仍然不明白爲什麼當我在MainActivity有一個靜態App實例它打開一個空白頁,也沒有說明爲什麼它打開多個頁面與MessagingCenter ...