代码之家  ›  专栏  ›  技术社区  ›  Xander

Xamarin。android Notification onClick不适用于新活动

  •  2
  • Xander  · 技术社区  · 7 年前

    这将是一个很长的帖子!(抓起一杯咖啡/爆米花)

    AltBeacon

    我遇到过 this 在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);
        }
    }
    

    信标URL 是一个 通知活动 是基本的 活动

    我执行HttpClient请求并获取数据。我创建一个通知并将其显示在屏幕上。事情是这样的 enter image description here

    谢谢

    :添加了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;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   SushiHangover    7 年前

    您需要做的第一件事是在通知生成器中设置挂起的意图,它将获得您的 NotificationActivity 发射:

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

    如果希望用户返回 MainActivity 当按下后退按钮时,您可以添加一个 ParentActivity 给你的

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

    因此,这条线:

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

    将添加 主要活动