2

這將是一個很長的文章! (搶一杯咖啡/爆米花)Xamarin.android通知onClick不採取新的活動

我正在使用AltBeacon Xamarin示例在我的代碼中顯示信標。

我碰到過在Xamarin中創建通知的示例。

這裏有一個應用程序類,其中的核心邏輯去。

public class AltBeaconSampleApplication : Application, IBootstrapNotifier 
{ 
    private const string TAG = "AltBeaconSampleApplication"; 

    BeaconManager _beaconManager; 

    private RegionBootstrap regionBootstrap; 
    private Region _backgroundRegion; 
    private BackgroundPowerSaver backgroundPowerSaver; 
    private bool haveDetectedBeaconsSinceBoot = false; 

    private string nearbyMessageString = "A beacon is nearby."; 
    private string nearbyTitleString = "AltBeacon Reference Application"; 

    private MainActivity mainActivity = null; 
    public MainActivity MainActivity 
    { 
     get { return mainActivity; } 
     set { mainActivity = value; } 
    } 

    private NotificationActivity notificationActivity = null; 

    public NotificationActivity NotificationActivity 
    { 
     get { return notificationActivity; } 
     set { notificationActivity = value; } 
    } 

    public AltBeaconSampleApplication() : base() { } 
    public AltBeaconSampleApplication(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { } 


    public override void OnCreate() 
    { 
     base.OnCreate(); 

     _beaconManager = BeaconManager.GetInstanceForApplication(this); 

     var iBeaconParser = new BeaconParser(); 
     // Estimote > 2013 
     iBeaconParser.SetBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"); 
     _beaconManager.BeaconParsers.Add(iBeaconParser); 

     Log.Debug(TAG, "setting up background monitoring for beacons and power saving"); 
     // wake up the app when a beacon is seen 
     _backgroundRegion = new Region("backgroundRegion", null, null, null); 
     regionBootstrap = new RegionBootstrap(this, _backgroundRegion); 

     // simply constructing this class and holding a reference to it in your custom Application 
     // class will automatically cause the BeaconLibrary to save battery whenever the application 
     // is not visible. This reduces bluetooth power usage by about 60% 
     backgroundPowerSaver = new BackgroundPowerSaver(this); 

     PerformHttpRequest(); 
    } 

    public void DidDetermineStateForRegion(int state, AltBeaconOrg.BoundBeacon.Region region) 
    { 
    } 

    public async void PerformHttpRequest() 
    { 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       var uri = "http://exampleuri"; 
       var result = await client.GetStringAsync(uri); 
       var response = JsonConvert.DeserializeObject<BeaconURL>(result); 
       SendNotificationFromBeacon(response); 

      } 
     } 
     catch(Exception ex) 
     { 
      throw ex; 
     }    
    } 

    private void SendNotificationFromBeacon(BeaconURL receivedNotification) 
    { 
     // Setup an intent for SecondActivity: 
     Intent notificationIntent = new Intent(this, typeof(NotificationActivity)); 

     // Pass some information to SecondActivity: 
     notificationIntent.PutExtra("CompaignUrl", receivedNotification.CompaignUrl); 
     notificationIntent.PutExtra("MediaUrl", receivedNotification.MediaUrl); 
     notificationIntent.PutExtra("titleText", receivedNotification.Title); 
     notificationIntent.SetFlags(ActivityFlags.NewTask); 

     // Create a task stack builder to manage the back stack: 
     Android.App.TaskStackBuilder stackBuilder = Android.App.TaskStackBuilder.Create(this); 

     // Add all parents of SecondActivity to the stack: 
     stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(NotificationActivity))); 

     // Push the intent that starts SecondActivity onto the stack: 
     stackBuilder.AddNextIntent(notificationIntent); 

     // Obtain the PendingIntent for launching the task constructed by 
     // stackbuilder. The pending intent can be used only once (one shot): 
     const int pendingIntentId = 0; 
     PendingIntent pendingIntent = 
      stackBuilder.GetPendingIntent(pendingIntentId, PendingIntentFlags.OneShot); 

     // Instantiate the builder and set notification elements, including 
     // the pending intent: 
     var builder = 
      new NotificationCompat.Builder(this) 
       .SetContentTitle(receivedNotification.Title) 
       .SetContentText(receivedNotification.Text) 
       .SetSmallIcon(Android.Resource.Drawable.IcDialogInfo); 

     // Build the notification: 
     Notification notification = builder.Build(); 

     // Get the notification manager: 
     NotificationManager notificationManager = 
      GetSystemService(Context.NotificationService) as NotificationManager; 

     // Publish the notification: 
     const int notificationId = 0; 
     notificationManager.Notify(notificationId, notification); 
    } 
} 

BeaconURLPOCONotificationActivity是一個基本活動類。

我執行HttpClient請求並獲取數據。我創建了一個通知並將其呈現在我的屏幕上。它是這樣的 enter image description here

現在,當我點擊通知,我不去NotificationActivity。我試圖從ApplicationClass調用一個活動。這是執行這種事情的正確方法。請提供詳細信息。

謝謝。

編輯:新增NotificationActivity類

[Activity(Label = "NotificationActivity")] 
public class NotificationActivity : MainActivity 
{ 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     // Create your application here 
     SetContentView(Resource.Layout.NotificationLayout); 

     TextView titleTextView = FindViewById<TextView>(Resource.Id.txtTitle); 
     titleTextView.Text = Intent.Extras.GetString("titleText", ""); 

     ImageView mediaImage = FindViewById<ImageView>(Resource.Id.imgViewMedia); 
     mediaImage.SetImageBitmap(GetImageBitmapFromUrl(Intent.Extras.GetString("MediaUrl", ""))); 
    } 

    private Bitmap GetImageBitmapFromUrl(string url) 
    { 
     Bitmap imageBitmap = null; 

     using (var webClient = new WebClient()) 
     { 
      var imageBytes = webClient.DownloadData(url); 
      if (imageBytes != null && imageBytes.Length > 0) 
      { 
       imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length); 
      } 
     } 

     return imageBitmap; 
    } 
} 
+0

您的'NotificationActivity'活動中的Activity屬性中是否設置了'ParentActivity'名稱(或者如果您在'Activity'屬性中手動分配'Name',則清單中的正確條目?) – SushiHangover

+0

NotificationActivity類是Activity的子類,我添加了相同類的代碼。你能否好好研究它@SushiHangover。謝謝 – Xander

+0

我在談論該類的[Activity(....)]'屬性,而不是類本身。 – SushiHangover

回答

1

你需要做的第一件事就是設置通知建設者中的待處理的意圖,它會得到你的NotificationActivity啓動:

var builder = 
    new NotificationCompat.Builder(this) 
     .SetContentTitle("receivedNotification.Title") 
     .SetContentText("receivedNotification.Text") 
     .SetSmallIcon(Android.Resource.Drawable.IcDialogInfo) 
     .SetContentIntent(pendingIntent); 

第二種方法是從您發佈的內容中獲取您的後臺堆棧設置我不確定流程應該如何,因爲如果用戶使用後退按鈕,用戶將退出該應用程序。

如果你希望用戶回到MainActivity時按後退按鈕,然後就可以一個ParentActivity添加到您的NotificationActivity活動屬性,即:

[Activity(Label = "NotificationActivity", ParentActivity = typeof(MainActivity))] 

,因此行:

stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(NotificationActivity))); 

會將MainActivity添加到後退堆棧。

+0

這個缺失的部分 SetContentIntent(pendingIntent)取得了訣竅。真棒! – Xander